03 Control Systems · #9 of 46

Poles & Zeros

Two dots on a plane that decide whether your robot settles, sings, or self-destructs

Every linear system has a secret horoscope, and it fits on a single sheet of graph paper. Plot a couple of dots on a plane and you already know the system's whole future: how fast it forgets a kick, whether it likes to ring, and (the part that matters when there's hardware involved) whether it settles down or tears itself apart.

The dots are called poles. Where they sit is the personality.

A transfer function is a fraction of polynomials in the complex variable ss. The roots of the denominator are the poles: the system's natural modes, the frequencies and decay rates it falls into when you stop forcing it. The roots of the numerator are the zeros, which don't create motion of their own but reshape how the poles' motion comes out. Poles are the engine; zeros are the gearbox.

Drag the poles yourself

The left pane is the complex ss-plane. The two × marks are a conjugate pole pair, and the red shaded region on the right is the forbidden zone. The right pane is the step response, recomputed every single frame as you drag. Move the poles around and watch the system's mood change in real time.

Drag the poles

status
ζ (damping)
ωn (natural frequency)
dominant τ
poles
what to try
  • Drag a pole horizontally toward the imaginary axis. Watch the decay get slower and the envelope swell.
  • Drag a pole across the imaginary axis (into the red zone). The trace explodes: the system is now unstable.
  • Bring the two poles toward the real axis. The conjugate pair collides, and you've reached critical damping, the fastest non-oscillating response. Continue past it: two real poles, slower than critical.
  • Slide a pole up the imaginary axis (purely imaginary). The response becomes a pure sinusoid: undamped natural oscillation at ωn.

Two coordinates tell the whole story. How far left a pole sits (its negative real part) is the decay rate: far left means the system forgets a disturbance fast, hugging the imaginary axis means it lingers forever. How high a pole sits above the real axis is the ringing frequency: pull it up and the response oscillates faster on its way to the target.

Bring the conjugate pair down onto the real axis and they collide at critical damping, the fastest you can settle without a single wobble of overshoot. Push past that and you get two separate real poles, sluggish and overdamped, like a door closer that takes its sweet time.

A pole that sits close to the imaginary axis does not just ring longer. It also makes the system dangerously eager to ring at one particular frequency. Drive it with a sine wave whose frequency happens to match the pole's height, and the response swells far past the size of the push. That is resonance, and it is the same effect that lets a singer crack a wine glass or a gust of wind set a bridge swaying.

Why a near-axis pole sings: the gain blows up at one frequency

Feed a system a steady sine wave at frequency ω0\omega_0 and the steady-state output is just the input scaled by the gain GG. For a single pole at sP=σP+jωPs_P = \sigma_P + j\omega_P, that gain works out to:

G(ω0)=1σP2+(ωPω0)2G(\omega_0) = \frac{1}{\sqrt{\sigma_P^2 + (\omega_P - \omega_0)^2}}

Look at the denominator. The gain is largest when the driving frequency ω0\omega_0 lands right on the pole's height ωP\omega_P, because the second term vanishes and you are left dividing by σP\sigma_P alone. So the peak response happens at the ringing frequency, exactly where you would guess from the demo.

Now slide the pole toward the imaginary axis, shrinking σP\sigma_P. The denominator at the peak shrinks with it, and the gain climbs without limit. A pole hugging the axis answers a tiny matched push with a huge swing. Let σP\sigma_P reach zero and the formula divides by zero: the response no longer settles at all.

The single rule that governs all of this is brutally simple. A system is stable exactly when every pole lies in the left half of the ss-plane: negative real part, no exceptions. Drag a pole rightward toward the imaginary axis and the ringing grows louder and lasts longer. Drag it across into the right half-plane and the step response stops being a wobble and becomes an explosion: an exponential that climbs forever. In a simulator that's a runaway trace. On a real quadrotor it's a smoking crater.

Why the real rule is 'left of a line,' not just 'left of the axis'

A working controller never aims for "left half-plane" and calls it done. The model you designed against is a polite fiction. Real masses are heavier than the spec sheet, real sensors lag, and the moment your robot picks up a payload its dynamics shift. A pole parked at 0.01-0.01 satisfies the textbook rule and will still get nudged across the axis by the first surprise.

So engineers move the goalposts in. Instead of asking only that every pole have Re[λ]<0\text{Re}[\lambda] < 0, a real spec demands

Re[λ]<λˉ\text{Re}[\lambda] < -\bar{\lambda}

for some fixed margin λˉ>0\bar{\lambda} > 0. Every pole must sit not just left of the axis but left of a whole vertical line set back from it. That strip of forbidden territory is the safety cushion: it guarantees a minimum decay rate, so even if the model is off and the poles drift right, they drift into "slow but stable" rather than "dead." The robustness lessons later in this phase are mostly about sizing that cushion honestly.

Maxwell's open problem got its answer twice. Edward Routh cracked it algebraically in 1876, and Adolf Hurwitz arrived at an equivalent test independently in 1895. The combined result is the Routh–Hurwitz criterion still taught today. The genius of it: you can certify that every pole sits safely in the left half-plane without ever computing a single pole, just by inspecting the signs in a table built from the polynomial's coefficients.

Portrait of Edward Routh.
Edward Routh · 1831–1907 his Routh–Hurwitz criterion (1876) tells you whether every pole sits in the stable left half-plane without ever solving for them. read more →
The math: where the personality comes from

For two complex-conjugate poles written as s=ζωn±jωn1ζ2s = -\zeta\omega_n \pm j\omega_n\sqrt{1-\zeta^2}, the transfer function is the canonical second-order form:

G(s)=ωn2s2+2ζωns+ωn2G(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}

The two pole coordinates map straight onto the two things you feel in the demo. The distance from the imaginary axis is ζωn\zeta\omega_n, the decay rate, how quickly the response shrinks. The height above the real axis is ωn1ζ2\omega_n\sqrt{1-\zeta^2}, the damped natural frequency, the rate at which the system rings on its way in.

Once the damping ratio reaches ζ1\zeta \geq 1 the radical 1ζ2\sqrt{1-\zeta^2} goes imaginary, the two poles drop onto the real axis, and the ringing stops entirely. That's the overdamped regime. And the instant any pole crosses into the right half-plane, where the real part σ>0\sigma > 0, the mode becomes a growing exponential eσte^{\sigma t} and the response climbs without bound. That is the precise mathematical face of instability.

Everything so far assumes time flows smoothly, but the computer on your robot does not see it that way. It wakes up, samples the sensors, runs the controller, and sleeps, maybe a thousand times a second. That stop-and-go world has its own version of the s-plane, and the stability rule changes shape.

Key takeaways

Two dots on a plane. Slide them left and your robot is calm and quick; let one drift right and it destroys itself.

Maxwell asked the question in 1868, Routh and Hurwitz answered it, and every controller you'll ever design is ultimately one move: dragging the poles where you want them. Pole placement, state feedback, the observers a few lessons from now: all of it is just deliberate, careful relocation of those dots into the safe half of the plane.

full glossary →