We saw in the section on stability conditions that there are some simple checks we can do to determine whether a system of order 1, 2, 3, or 4 is stable (all poles are in the LHP). In this section, we explain a more general test for stability called the Routh–Hurwitz stability criterion, which can be applied to systems of any order. It is more complicated, but also more powerful, because it reveals the exact number of poles in the RHP, LHP, and on the imaginary axis.
The Routh–Hurwitz stability criterion is based on a tabular method called the Routh array. Suppose we want to determine whether the roots of the following polynomial are in the LHP, RHP, or on the imaginary axis:
Here is the procedure for the generic case. There are some special cases that come up too, but we will discuss those later.
Construct the Routh array. The rows are labeled with the same powers of s as the polynomial, in decreasing order. The first two rows are filled with the coefficients of the polynomial, in a zigzag pattern. Here is what it looks like when n is even:
Fill in the next row. The next row is filled in using a formula that involves the entries of the two rows above. For each entry, take the determinant of the 2×2 matrix formed by the two entries in the first column and the two entries in the column to the right. Flip the sign, then divide by the first entry in the row directly above. Here are the formulas filled in for the third row:
The first column gets reused a lot, so we color it purple and blue to make it easier to keep track of which entries are being used in the formula.
Continue filling in the rows. Fill in the rest of the array one row at a time. Each row depends on the two rows above it using the same formula as in step 2. Keep going until you have filled in the row corresponding to s0.
Count the sign changes in the first column. The number of sign changes in the first column of the completed Routh array is the number of roots in the RHP. If there are no sign changes, then all roots are in the LHP and the system is stable.
The first column is all positive, so there are no sign changes. Therefore, all roots of P1(s) are in the LHP, and the system is stable. We can verify this by using our stability rules for cubic polynomials. The coefficients are all positive, and a2a1>a0 because 3⋅7>5, so the system is stable.
Here is the completed Routh array. Using exact fractions get quite messy so we just used decimal approximations. This is fine because we only care about the signs of the entries, not their exact values.
The entries we left blank are just zero. The staircase structure of the Routh array above is a common pattern. The “6” that shows up on the right in every second row follows from the one zero property.
As a sample calculation, to find the 4.3 in the s5 row, we did:
The first column has four sign changes, so there are four roots in the RHP. Since it’s a 7th-order polynomial, the remaining three roots are in the LHP. We can verify this is true by calculating the roots numerically and we obtain:
Since computing each entry requires us to divide by the first entry in the row above, we run into a problem if that entry is zero. In this case, it turns out we can replace the zero with a small positive number or negative number and fill in the rest as normal.
We can’t continue because we would have to divide by zero. Let’s see what happens if we replace the zero with a small positive or negative number ±0.01.
The arrays look different, but they have the same number of sign changes in the first column, which is what we care about. In both cases, there are two sign changes, so there are two roots in the RHP and three roots in the LHP.
This works because the roots of a polynomial are a continuous function of its coefficients. If we perturb the coefficients by a small amount, the roots will also be perturbed by a small amount. Therefore, if we replace the zero with a small positive or negative number, the roots will not change drastically, and the number of roots in the RHP will not change.
In practice, if we encounter a zero in the first column, we can just replace it with a small positive number and proceed with the calculation. We can also be more formal and replace the zero with a symbolic variable ε, fill in the rest of the array, and evaluate the sign of each entry in the first column in the limit as ε→0+.
If an entire row of the Routh array is zero, this indicates that the presence of a special factor that contains only even or odd powers of s. For example, consider the polynomial:
The entire s3 row is zero, indicating that we have a special factor. We can read it from the last two rows, using the row labels as a guide. Here, we read: s4+2s2+2, which is the same as the even factor identified in Eq. (17).
To proceed, we replace the row of zeros with the derivative of the special factor. In this case, dsd(s4+2s2+2)=4s3+4s. We fill in the rest of the array as usual:
Even polynomials have the special property that if s is a root, then −s is also a root. Therefore, the number of RHP and LHP roots is the same. Any left over roots must therefore be on the imaginary axis. For example, consider the polynomial:
Since there are two sign changes in the first column, there are two RHP roots. Since the polynomial is even, there are also two LHP roots. Since it’s a 6th-order polynomial, the remaining two roots must be on the imaginary axis. We can verify this by factoring P5 and finding its roots numerically: P5(s)=(s2+1)(s4+s2+3). The six roots are:
Imaginary axis roots always produce factors of the form (s2+ω2), so they always show up as special factors in the Routh array. Therefore, a row of zeros is necessary for the existence of imaginary axis roots. However, it is not sufficient because we can have special factors that have no imaginary axis roots, as we saw in the example with P4.
By analyzing the special factor, we can determine how many RHP, LHP, and imaginary axis roots it contains. Then, using the fact that we know the total number of RHP roots and that the rest of the roots cannot be imaginary, we can determine a complete classification of all the roots. We’ll see a complete example of this next.
Here, we obtained a row of zeros, which indicated the presence of a special factor. We can read off the special factor from the last two rows, which gives us s6+8s4+32s2+64. The derivative of this is 6s5+32s3+64s. We then divided the row by two. Now the next row:
There are two sign changes in the entire array, so there are two RHP roots.
There is a special factor s6+8s4+32s2+64. Based on the Routh array starting from this factor, we see that it contain two RHP roots. It must also contain two LHP roots by symmetry, and since it has six roots in total, the remaining two roots must be on the imaginary axis.
We have accounted for all the RHP roots (they were all in the special factor), and the special factor accounts for six roots, so there must be two roots remaining and they must be in the LHP.
So overall, there must be: 2 imaginary roots, 2 RHP roots, and 4 LHP roots.
The Routh–Hurwitz approach works because it converts a root-location problem into a sign-counting problem. Given a polynomial P(s), the number of roots in the right half-plane can be determined by how the curve P(jω) winds around the origin as ω runs from −∞ to +∞.
This is a consequence of the argument principle from complex analysis: roots inside a region are counted by the winding of the function around zero on the boundary of that region (the “winding number”).
The Routh array is an algebraic way to compute that winding number without explicitly plotting P(jω) or solving for the roots. It does this by repeatedly combining the even and odd parts of the polynomial, in a way closely related to the Euclidean algorithm or a Sturm sequence. Each step preserves the information needed to count how many times the argument of P(jω) crosses through critical directions.