How to read Bode and Nyquist plots for a PID loop
Open-loop L(jω), gain and phase crossover, what P, I and D do to Bode plots, Nyquist encirclements, and why phase margin predicts overshoot.
A time-domain step tells you what happened once. A Bode or Nyquist plot of the open loop tells you why it happened and how close you were to it happening forever. For a PID loop the object you plot is not the plant alone and not the controller alone; it is their product L(jω) = C(jω) G(jω), the signal that travels around the loop before the minus sign of negative feedback. Learn to read that plot and you can see gain margin, phase margin, the cost of dead time, and the exact frequency where a little more Kp will start a hunt — before you touch the plant.
This article is a working guide for process and motion loops, not a substitute for a signals-and-systems course. It stays with the numbers that PID Solver 360 actually reports, the same targets used in gain and phase margin: phase margin typically 30–60°, gain margin more than 6 dB. The tuning workflow still starts from a model; frequency response is how you judge whether that model-plus-PID pair is allowed to leave the simulator.
The open loop you are actually plotting
Negative unity feedback around a controller C(s) and a plant G(s) has the closed-loop complementary sensitivity
T(s) = L(s) / (1 + L(s))
L(s) = C(s) G(s)Stability of the closed loop, for a stable open-loop L, is equivalent to L(s) never passing through −1. Frequency response replaces s with jω and asks how close L(jω) comes to that point as ω runs from 0 to infinity. Bode plots the magnitude and phase of L(jω) against log frequency. Nyquist plots the same complex number as a curve in the Re–Im plane.
Write the PID in a form you can multiply. Ideal (ISA) form is
C(s) = Kp (1 + 1/(Ti s) + Td s)Parallel form is
C(s) = Kp + Ki / s + Kd swith Ki = Kp / Ti and Kd = Kp Td if the two realisations are equivalent. A real D term is filtered,
C(s) = Kp + Ki / s + Kd s / (Tf s + 1)and a FOPDT plant is
G(s) = K e^{−L s} / (τ s + 1)L(jω) is then a complex function you can evaluate with arithmetic, not with a guess. PID Solver 360 computes it on a frequency grid and reads the margins from that grid. You can do the same by hand at a few frequencies to learn the shape.
Two normalisations keep you honest. Magnitude is usually in decibels, 20 log10 |L|, so a factor of two is 6 dB and a factor of ten is 20 dB. Phase is in degrees, with the negative-feedback sign already absorbed by plotting L rather than −L, so the critical point is −180° (or −1 on Nyquist), not 0°. If your software plots arg(−L), the labels change; the physics does not.
Bode magnitude: where the loop still has authority
The magnitude plot answers: at this frequency, is the loop gain bigger than one or smaller? Where |L| ≫ 1, feedback is strong, disturbance rejection is good, and the closed loop follows the setpoint. Where |L| ≪ 1, the loop has given up; the plant and the disturbance live as if the controller were open. The interesting region is the decade around |L| = 1 (0 dB), because that is where stability is decided.
For a PI controller on a first-order plant with no delay, |L| at low frequency behaves like Ki K / ω: a straight line of slope −20 dB/decade on a log-log plot, going to infinity as ω → 0. That infinite low-frequency gain is why PI kills steady-state offset to a step. A pure P controller saturates at |L| → Kp K, a finite number, which is exactly the leftover offset of a P-only loop on a self-regulating plant.
At high frequency a plant with n more poles than zeros rolls off at −20 n dB/decade. FOPDT without D rolls off at −20 dB/decade after the corner 1/τ. Adding unfiltered D flattens that slope toward 0 dB/decade, which is the point of D: keep |L| from collapsing too soon, at the cost of noise. Filtered D restores a −20 dB/decade slope beyond 1/Tf so the loop does not amplify transmitter hiss forever.
Read the magnitude plot with a pencil. Mark 0 dB. The frequency where the curve crosses 0 dB from above is the gain-crossover frequency ωc (also called ωg). That single number is the loop’s bandwidth to a first approximation. Raise Kp and the whole magnitude plot slides up; ωc moves right; the loop gets faster and, usually, less stable. Lower Kp and the opposite happens. Integral action piles extra gain only at low ω, so it moves ωc much less than Kp does, which is why you can often add I to kill offset without destroying the crossover — until the extra phase lag of I reaches ωc.
Bode phase: the lag you have already spent
Phase of L(jω) is the sum of the arguments of C and G. Each pole contributes up to −90°, each zero up to +90°, and a delay contributes without bound:
arg(e^{−jωL}) = −ω L (radians) = −(180/π) ω L (degrees)That last term is a straight line versus ω, not versus log ω, which is why delay looks mild on the left of a Bode plot and then suddenly consumes the entire phase budget. A plant with L = 5 s at ω = 0.2 rad/s (about 0.03 Hz) already carries −57° of delay lag before the lag pole and the PID have spoken.
A first-order lag 1/(τ s + 1) contributes
arg = −arctan(ω τ)which is −45° at ω = 1/τ and approaches −90°. A PI zero at 1/Ti contributes +arctan(ω Ti) relative to a pure integrator; equivalently, PI as Kp (Ti s + 1)/(Ti s) has −90° from the integrator plus +arctan(ω Ti) from the zero. At frequencies well below 1/Ti the integrator dominates and PI looks like −90°. At frequencies well above 1/Ti, PI looks like P. If you set Ti so that 1/Ti sits near ωc, you have parked extra lag on the stability frequency. That is the usual way an “innocent” increase of Ki (decrease of Ti) ruins phase margin.
Derivative, filtered or not, contributes lead: positive phase. Unfiltered Kd s is +90° everywhere. Filtered D peaks below +90° near 1/sqrt(Td Tf) and then returns toward 0° as the filter takes over. That lead is why D can restore phase margin that delay and integral have spent — if, and only if, the lead sits around ωc rather than a decade away.
Gain crossover, phase crossover, and the two margins
Two frequencies name the two classical margins.
Gain-crossover frequency ωc is where |L(jωc)| = 1. Phase margin is how far the phase at that frequency sits above −180°:
PM = 180° + arg(L(jωc))If arg(L(jωc)) = −140°, PM = 40°. If arg = −180°, PM = 0 and the Nyquist plot goes through −1: the closed loop has a pole on the imaginary axis and will ring forever at ωc. If arg is below −180°, PM is negative and the linear loop is unstable.
Phase-crossover frequency ωπ is where arg(L(jωπ)) = −180°. Gain margin is how far |L| at that frequency sits below 1:
GM = 1 / |L(jωπ)|
GM_dB = −20 log10 |L(jωπ)|If |L(jωπ)| = 0.5, GM = 2, which is 6 dB. The loop can tolerate a doubling of process gain before it hits −1. If |L| is already 1 at −180°, GM = 0 dB and you are again on the stability boundary.
A well-behaved process loop usually has both crossovers, with ωc < ωπ, because magnitude is falling while phase is still dropping through −180°. Delay-heavy plants and aggressive D can produce multiple crossovers. Then “the” gain margin is the smallest one, the closest approach to −1. PID Solver 360 reports the margins that correspond to the first relevant crossings; if the Bode plot wiggles, look at the plot, not only at two scalars.
Gain and phase margin is the short version of these definitions. The rest of this article is how a PID moves those numbers, and how to read the plot when delay is the dominant villain.
What a delay does: e^{−jωL} is not a pole
Engineers who grew up on rational transfer functions keep trying to treat e^{−Ls} as “a bit of extra lag”. It is not. A Padé approximant can be useful for numerical work and is actively misleading for Bode intuition, because a first-order Padé
e^{−L s} ≈ (1 − L s / 2) / (1 + L s / 2)adds a right-half-plane zero and then saturates at −180° of phase, whereas a true delay’s phase is −ωL without limit. At high frequency the Padé magnitude is 1, which is correct, but the phase error is already large near typical PID crossovers if you sized the approximant for DC.
On a Bode phase plot, delay is a curve that steepens to the right. On a Nyquist plot, delay wraps L around the origin again and again as ω increases, spiralling in if |G| rolls off. Those extra encirclements of the origin are harmless; encirclements of −1 are not. The practical consequence for PID is simple: every extra second of L rotates the high-frequency tail of Nyquist clockwise and eats PM at whatever ωc you chose. You cannot cancel delay with a PID zero. You can only keep ωc low enough that ωc L in radians is a modest fraction of your phase budget. SIMC’s choice τc ≈ L is exactly that idea in time-domain clothing: do not ask the loop to be faster than the delay.
If you increase L in the simulator and watch PM fall, you are seeing −ωc ΔL. A 20 % underestimate of dead time on a loop with ωc L ≈ 1 is about 11° of missing phase margin. That is often the difference between a calm 12 % overshoot and a hunt.
What P, I and D each do to the Bode plot
Proportional gain is a vertical slide of the magnitude plot and does nothing to phase (in the ideal, delay-free, filter-free sense). Multiply Kp by two and |L| rises 6 dB at every frequency. ωc moves right to wherever the old |L| was −6 dB. Because plant phase is usually more negative at the new ωc, PM falls. That is the entire P story: faster, less stable, no change to the shape of the phase curve except through the move of ωc. On Nyquist, Kp is a radial expansion of the whole curve.
Integral action adds a pole at the origin. Magnitude at low ω goes to infinity; phase at low ω goes to −90° plus whatever the plant contributes at DC (usually 0° for a self-regulating process). The PI zero at 1/Ti bends the phase back toward the P-only curve as ω increases. The design question is where to put that zero relative to ωc:
- 1/Ti ≪ ωc: by the time you reach crossover, I has already handed off to P. Extra PM lag from I is small. Disturbance rejection at very low frequency is still integral, but the integral is lazy. Offset dies slowly.
- 1/Ti ≈ ωc: I still contributes tens of degrees of lag at crossover. PM collapses. The step response overshoots and rings. This is the usual result of “add more I until offset disappears faster” on a loop that was already using its phase budget.
- 1/Ti ≫ ωc: the controller is still an integrator at crossover. You have built an I-only loop with a little P. Almost always unstable or nearly so on a plant with delay.
Derivative action adds a zero (and, with a filter, a far pole). Magnitude gains +20 dB/decade between 1/Td and 1/Tf. Phase rises, peaks, and falls. Park that peak near ωc and you buy back PM that delay and I spent. Park it too far left and D is just a bigger Kp. Park it too far right and D is noise gain with no phase gift at crossover. Unfiltered D on a delay-dominant plant can also lift |L| at ωπ, which hurts gain margin even as it helps phase margin. That trade is visible on Bode: the magnitude curve stays up longer, so it may still be above −6 dB when phase hits −180°.
A useful cartoon of a tuned PI on FOPDT is therefore: |L| falling at −20 then −40 dB/decade, crossing 0 dB at ωc with phase in the −120° to −150° band (PM 30–60°), and continuing down so that at −180° the magnitude is at least 6 dB down. PID adds a shelf or a gentler slope around ωc and a phase bump. If your real plot does not look like some version of that cartoon, you are either in a different regime (integrating plant, underdamped servo) or the gains are not yet a loop.
Nyquist: the same information, a different picture
The Nyquist plot is L(jω) in the complex plane as ω goes from 0+ to +∞. For a PI controller on a stable FOPDT plant the curve starts at −90° and infinite magnitude (the integral), comes in from minus-imaginary infinity, passes somewhere near the negative real axis, and spirals toward the origin because |G| → 0. The critical point is −1 + 0j.
Distance from the plot to −1 is a visual stability margin. Phase margin is the angle, at the unit-circle crossing, between the negative real axis and the vector to that crossing. Gain margin is the inverse of the distance from the origin to the negative-real crossing. If you have ever struggled to remember which Bode crossing is which, Nyquist makes both geometric.
The Nyquist stability criterion, in the form you need for typical process PID, is: for an open-loop-stable L, the closed loop is stable if the plot of L(jω) for ω from −∞ to ∞ does not encircle −1. Because L(−jω) is the mirror of L(jω), you plot the positive-frequency curve and complete it with the mirror image, plus a large clockwise or counterclockwise arc at infinity if |L| → ∞ at s = 0. The PI pole at the origin produces such an arc. Counting encirclements is why people still draw Nyquist when Bode already gave PM and GM: if D or delay creates a loop that weaves, Bode’s “first crossing” can miss an encirclement that Nyquist shows at a glance.
Open-loop unstable plants (runaway reactors, inverted pendulums) need the full criterion: closed-loop unstable poles = open-loop unstable poles + encirclements of −1, with a careful sign convention. Most PID process work never goes there. If your FOPDT model is stable, which it is, and the Nyquist plot stays to the right of −1 in the usual sense of not looping around it, you are done counting.
A practical reading habit: look at how close the curve comes to −1, not only whether it encircles. A plot that threads between −1.05 and −0.95 is “stable” and unusable. That closeness is a small GM or PM even when the encirclement count is zero. Robustness is distance, not a Boolean.
Why overshoot in time tracks phase margin
A closed-loop system with PM around 60° behaves, near ωc, something like a second-order pair with damping ζ ≈ 0.6. The classical underdamped step overshoot
OS% ≈ 100 exp(−π ζ / sqrt(1 − ζ²))is then a few percent. PM around 30° maps to ζ nearer 0.3 and overshoot of 30–40 %. PM around 20° is a slow hunt. The mapping is not a theorem for FOPDT-plus-PID — the closed loop is higher order, delay is transcendental, saturation clips peaks — but it is reliable enough to be a design language. When an operator says the temperature “overshoots and comes back twice”, you should already be guessing PM in the twenties before you open the Bode plot.
Gain margin tracks a different time-domain symptom: how much the loop can stand a gain change before it sings. A valve that is more linear at 70 % than at 20 % is a gain change. A composition change that doubles K is a gain change. GM of 6 dB means a factor of two. GM of 3 dB means 40 % more K and you are at the edge. Temperature loops that look perfect at one throughput and oscillate at another are often GM stories, not “the PID went bad”.
Rise time tracks ωc: tr is on the order of 1.5–2.5 / ωc for many PID loops that have a decent PM. You cannot have a 2 s rise on a plant with 8 s of delay and also have 50° of PM; ωc would have to sit where −ωc L has already spent more than 50°. The Bode plot makes that argument without a single time-domain run. Then you confirm with closed-loop metrics because saturation and noise do not appear on L(jω).
Targets: 30–60° phase margin and more than 6 dB gain margin
Those numbers are industry folklore with a physical basis. Below about 30° PM the step response is oscillatory enough that operators detune by hand, sensors look noisy, and a small model error tips the loop. Above about 60–70° you are usually leaving bandwidth on the table; disturbance rejection suffers; the loop looks “sluggish” even though it is very stable. Chemical quality loops often sit at the high-PM end on purpose. Motion loops with clean measurements and little delay often sit at the low-PM end because they are paid to be fast.
Gain margin of 6 dB is a factor of two on K. Process gains routinely move by that much with fouling, level, and valve position. 8–12 dB is a more comfortable process-control target if you can afford the slowness. Below 4 dB you are tuning for the model you have, not the plant you will have next month.
Do not meet one margin by starving the other. Aggressive D can produce 55° PM and 3 dB GM: a loop that looks well damped on the design model and sings when K drifts up. Heavy I can produce 10 dB GM and 22° PM: a loop that survives gain error and still rings at constant K. Plot both. PID Solver 360 rates the pair together for that reason.
A delay margin is sometimes more honest than PM alone:
L_extra = PM_rad / ωcThat is how many extra seconds of dead time you can insert before PM hits zero. If L_extra is 0.3 s and your piping estimate is only good to a second, the loop is not robust, regardless of a pretty 40° on the design L.
A reading sequence you can reuse
Start with a FOPDT or second-order model that fits a bump test. Build C(s) from the gains you actually intend to load, including Tf, not an ideal D. Plot |L| and arg(L) from a decade below 1/τ to a decade above 1/Ts or 1/Tf.
Mark ωc and ωπ. Read PM and GM. If either is missing — magnitude never crosses 0 dB, or phase never reaches −180° — the loop is either extremely sluggish or using a plant that does not roll off, and you should not trust a default “infinite GM” as a compliment.
Slide Kp in your head: magnitude up, ωc right, PM down. Slide Ti: low-frequency magnitude up, phase lag nearer ωc if you overdo it. Slide Td: a phase bump and a magnitude shelf. Add delay: a phase rake to the right, Nyquist wrapping. That mental mixer is most of applied frequency-domain PID.
Then run the time-domain step in the simulator and check that overshoot and hunting match the PM you read. If they disagree, the usual culprits are saturation (Bode assumed a linear actuator), a coarse sample time (extra Ts/2 not in C(s)), or a model that never fitted the bump test. Frequency response does not forgive a wrong G(s). It will happily compute precise margins of a fiction.
Use the auto tuner to generate a first C(s), the optimiser only after the Bode plot is legal, and the documentation when you need the identities in one place. The plot is not decoration. It is the loop, drawn so that −1 is visible before the plant draws it for you.
Put this into practice — model your process, auto-tune it and check the stability margins.
Launch PID Solver 360