Hurwitz stability
A real polynomial $p(s) = a_0 s^n + a_1 s^{n-1} + \dots + a_n$ is Hurwitz stable when all its roots have a negative real part; a continuous-time linear system is asymptotically stable when the denominator of its transfer function is.
hurwitz_stable applies the Routh-Hurwitz criterion of PACE.jl (PACE.hurwitz_stable, which also covers interval coefficients by Kharitonov's theorem). The coefficients are given highest degree first. The leading principal minors $\Delta_1, \dots, \Delta_n$ of the Hurwitz matrix
\[H = \begin{pmatrix} a_1 & a_0 & 0 & 0 & \cdots \\ a_3 & a_2 & a_1 & a_0 & \cdots \\ a_5 & a_4 & a_3 & a_2 & \cdots \\ \vdots & & & & \ddots \end{pmatrix}, \qquad H_{d,k} = a_{2d-k},\]
multiplied by the sign of $a_0$ when their order is odd, must be positive.
using PaceControl
hurwitz_stable([1, 3, 3, 1]) # (s + 1)^3: true
hurwitz_stable([1, 1, -1, -1]) # (s - 1)(s + 1)^2: false
hurwitz_stable([1, 0, 1]) # s^2 + 1, roots on the imaginary axis: falseThe module HinfNorm decides the stability of a system given by a realisation, on the denominator of its minimal realisation: see HinfNorm.stability and HinfNorm.routh_stable.