Skip to content

6.P — Worked Problems: Control Systems

Problem 1 — Closed-loop transfer function and steady-state error

A plant G(s)=\dfrac{4}{(s+1)(s+4)} is put in a unity-feedback loop with proportional gain K. Find the closed-loop transfer function, the steady-state error to a unit step for K=5, and the K needed for 5% error.

Solution

T(s)=\frac{KG}{1+KG}=\frac{4K}{(s+1)(s+4)+4K}=\frac{4K}{s^2+5s+4+4K}

Steady-state error. The plant is type 0 (no pole at the origin), so

K_p=KG(0)=K\cdot\frac{4}{4}=K

e_{ss}=\frac{1}{1+K_p}=\frac{1}{1+5}=0.167

16.7% error — the output settles at 0.833 for a setpoint of 1.

For 5% error:

\frac{1}{1+K}=0.05 \;\Rightarrow\; K=19

Now check what that gain costs. With K=19:

s^2+5s+80=0, \qquad \omega_n=\sqrt{80}=8.94, \qquad 2\zeta\omega_n=5 \;\Rightarrow\; \zeta=0.28

\%OS=100e^{-\pi(0.28)/\sqrt{1-0.078}}=100e^{-0.916}=40\%

Forty percent overshoot to buy 5% steady-state accuracy. That is the proportional-only trade in numbers, and it is unacceptable in most applications.

With an integrator instead, making it type 1, the steady-state error is exactly zero at any gain — and the gain can then be chosen for damping rather than accuracy. This is the entire argument for the I term.

Problem 2 — Design from a time-domain specification

A plant G(s)=\dfrac{K}{s(s+6)} must settle within 1.5 s with under 15% overshoot. Find K.

Solution

Overshoot gives \zeta:

\ln(0.15)=-1.897

\zeta=\frac{1.897}{\sqrt{\pi^2+1.897^2}}=\frac{1.897}{\sqrt{9.87+3.60}}=\frac{1.897}{3.670}=0.517

Settling time gives the real part:

\frac{4}{\zeta\omega_n}\le1.5 \;\Rightarrow\; \zeta\omega_n\ge2.67

Now the plant's own structure. The characteristic equation is

s^2+6s+K=0

Matching: 2\zeta\omega_n=6, so \zeta\omega_n=3fixed by the plant, regardless of K.

3 \ge 2.67 \ ✓ \quad\text{settling time is satisfied automatically}

t_s=\frac43=1.33\ \text{s}

Now the overshoot constraint. \zeta = 3/\omega_n and \omega_n=\sqrt K:

\zeta=\frac{3}{\sqrt K}\ge0.517 \;\Rightarrow\; \sqrt K\le5.80 \;\Rightarrow\; K\le33.7

Take K=33. Then \omega_n=5.74, \zeta=0.522, overshoot 14.5% ✓, settling 1.33 s ✓.

What the problem taught. This plant's real part is pinned at -3 by its own pole spacing, so the settling time cannot be improved by gain at all. Gain only moves the poles vertically. If 1.33 s were too slow, no value of K would help and a compensator adding a zero would be required.

Recognising that the plant, not the gain, sets one of your specifications is the most useful diagnostic in loop design.

Problem 3 — Routh-Hurwitz gain range

Find the range of K for stability: G(s)H(s)=\dfrac{K(s+1)}{s(s-1)(s+6)}.

Solution

Note the open-loop pole at +1 — the plant is unstable on its own. This is the case where feedback is not an improvement but a necessity.

Characteristic equation:

s(s-1)(s+6)+K(s+1)=0

s(s^2+5s-6)+Ks+K=0

s^3+5s^2+(K-6)s+K=0

First check: all coefficients must be positive. K>0 and K-6>0, so K>6 is necessary.

Routh array:

\begin{array}{c|cc} s^3 & 1 & K-6\\ s^2 & 5 & K\\ s^1 & \frac{5(K-6)-K}{5}=\frac{4K-30}{5} & 0\\ s^0 & K & \end{array}

Conditions:

\frac{4K-30}{5}\gt0 \;\Rightarrow\; K\gt7.5

K\gt0 \ ✓

\boxed{K\gt7.5}

No upper limit — this system becomes more stable as gain increases, which is the opposite of the usual pattern and is characteristic of plants stabilised by feedback.

At exactly K=7.5: the s^1 row vanishes and the auxiliary polynomial is 5s^2+7.5=0, giving s=\pm j1.22. The system oscillates at 1.22 rad/s (0.194 Hz) at the boundary.

Physical reading. An inverted pendulum, a magnetic bearing, an unstable aircraft — all have this shape. Below the critical gain the controller is too weak to catch the plant's own divergence, and it falls over. There is a minimum acceptable gain, and that is unusual enough to be worth remembering.

Problem 4 — Root locus sketch and gain selection

Sketch the root locus for G(s)H(s)=\dfrac{K}{s(s+4)(s+8)} and find the gain giving \zeta=0.5.

Solution

Poles: 0, −4, −8. No zeros. n=3, m=0.

Real-axis segments. Between 0 and −4: one pole to the right, odd ✓. Between −4 and −8: two, even ✗. Left of −8: three, odd ✓.

Asymptotes: three of them, at 60°, 180°, 300°.

\sigma_a=\frac{0-4-8}{3}=-4

Breakaway. K=-s(s+4)(s+8)=-(s^3+12s^2+32s):

\frac{dK}{ds}=-(3s^2+24s+32)=0

s=\frac{-24\pm\sqrt{576-384}}{6}=\frac{-24\pm13.86}{6}

giving -1.69 and -6.31. Only -1.69 lies on a locus segment.

Gain there: K=1.69\times2.31\times6.31=24.6.

Imaginary axis crossing. s^3+12s^2+32s+K=0:

\begin{array}{c|cc}s^3&1&32\\s^2&12&K\\s^1&\frac{384-K}{12}&\\s^0&K&\end{array}

Stable for 0\lt K\lt384. At K=384: 12s^2+384=0, so s=\pm j5.66.

Finding \zeta=0.5. The ray at 60° from the negative real axis is s=\sigma(-1\pm j\sqrt3) for \sigma>0. Try s=-1.4+j2.42:

Distances: to pole at 0 is |{-1.4+j2.42}|=2.80; to -4 is |2.6+j2.42|=3.55; to -8 is |6.6+j2.42|=7.03.

K=2.80\times3.55\times7.03=69.9

Verify with Routh-style substitution. Characteristic equation s^3+12s^2+32s+70. The complex pair should be near -1.4\pm j2.42, whose quadratic factor is s^2+2.8s+7.82. Dividing: s^3+12s^2+32s+70 \div (s^2+2.8s+7.82) gives approximately s+9.2 with a small remainder ✓.

Third pole at -9.2, which is 9.2/1.4 = 6.6 times further left than the dominant pair. Comfortably beyond the factor of 5, so the second-order approximations apply.

Predicted performance: \omega_n=|{-1.4+j2.42}|=2.80, \zeta=1.4/2.80=0.5 ✓, settling 4/1.4=2.86 s, overshoot 16.3%.

Problem 5 — Bode plot sketch and margins

Sketch the Bode plot of G(s)H(s)=\dfrac{20}{s(1+0.1s)(1+0.02s)} and find both margins.

Solution

Corners: at \omega=10 (from 0.1s) and \omega=50 (from 0.02s), plus the integrator.

Low frequency asymptote: |G|\approx20/\omega, which is 0 dB at \omega=20.

Slopes:

RangeSlope
below 10-20 dB/dec
10 to 50-40
above 50-60

Gain crossover. The asymptote crosses 0 dB at \omega=20, which is above the first corner, so use the -40 dB/dec segment. From 10 rad/s, where |G|=20/10=2 (6 dB):

0\ \text{dB is } 6\ \text{dB below, and at }-40\text{ dB/dec that is } 10^{6/40}=1.41 \text{ times higher}

\omega_{gc}\approx14.1\ \text{rad/s}

Check exactly: |G(j14.1)|=\dfrac{20}{14.1\sqrt{1+1.99}\sqrt{1+0.0795}}=\dfrac{20}{14.1\times1.73\times1.039}=0.789

Slightly under 1, so the crossover is a little lower. Try \omega=12: \dfrac{20}{12\times1.562\times1.028}=1.037. So \omega_{gc}\approx12.3 rad/s.

Phase there:

\angle G=-90-\arctan(1.23)-\arctan(0.246)=-90-50.9-13.8=-154.7°

PM=180-154.7=25.3°

Phase crossover. Need \arctan(0.1\omega)+\arctan(0.02\omega)=90°.

Try \omega=22.4: \arctan(2.24)=65.9°, \arctan(0.448)=24.1°, sum 90° ✓.

|G(j22.4)|=\frac{20}{22.4\times2.454\times1.096}=0.332

GM=\frac{1}{0.332}=3.01=9.6\ \text{dB}

Assessment. PM=25° means \zeta\approx0.25 and about 45% overshoot. Too oscillatory.

The fix, and the numbers. Reduce the gain until PM=50°. That needs the crossover at the frequency where the phase is -130°, which is around \omega=6 rad/s. There |G|=\dfrac{20}{6\times1.166\times1.007}=2.84, so reduce the gain by a factor of 2.84, from 20 to 7.

Cost: the crossover halves, so the loop is about half as fast, and the steady-state error to a ramp trebles. That trade — speed and accuracy against damping — is the entire content of loop tuning.

Problem 6 — Ziegler-Nichols tuning, and improving on it

A loop oscillates at a period of 4 s when the proportional gain reaches 12. Give ZN PID settings, and then a better set.

Solution

K_u=12, T_u=4 s.

ZN PID:

K_p=0.6\times12=7.2

T_i=\frac{4}{2}=2\ \text{s} \;\Rightarrow\; K_i=\frac{7.2}{2}=3.6

T_d=\frac{4}{8}=0.5\ \text{s} \;\Rightarrow\; K_d=7.2\times0.5=3.6

Expected result: quarter-amplitude decay, \zeta\approx0.22, about 50% overshoot. Fast disturbance rejection, unpleasant setpoint response.

A better set — the "no overshoot" variant of the same table:

K_p=0.2K_u=2.4, \qquad T_i=\frac{T_u}{2}=2, \qquad T_d=\frac{T_u}{3}=1.33

K_i=1.2, \qquad K_d=3.19

Roughly a third of the proportional gain, so slower and far better damped.

Or Tyreus-Luyben, designed for processes where robustness matters more than speed:

K_p=\frac{K_u}{2.2}=5.45, \qquad T_i=2.2T_u=8.8, \qquad T_d=\frac{T_u}{6.3}=0.635

Notice the integral time is more than four times ZN's — much gentler integral action, and therefore much more stability margin.

The practical recommendation. Start with ZN, then halve K_p and double T_i. That single adjustment turns 50% overshoot into roughly 10% and is what most engineers do without writing it down.

Also compulsory regardless of tuning:

  • Filter the derivative with N=10: T_f = K_d/(NK_p)=3.6/72=0.05 s.
  • Take the derivative on the measurement, not the error.
  • Add anti-windup clamping.

Problem 7 — PID design for a first-order plant with dead time

A plant has gain 3, time constant 40 s and dead time 8 s. Design a PI controller by lambda tuning for a closed-loop time constant of 20 s, and check the stability margin.

Solution

K_p=\frac{\tau}{K(\lambda+L)}=\frac{40}{3(20+8)}=\frac{40}{84}=0.476

T_i=\tau=40\ \text{s} \;\Rightarrow\; K_i=\frac{0.476}{40}=0.0119

Check the phase margin. The loop gain is

L(s)=0.476\left(1+\frac{1}{40s}\right)\cdot\frac{3e^{-8s}}{1+40s}

At the crossover, the integral term's contribution is small if \omega \gg 1/40 = 0.025 rad/s.

Find \omega_{gc}: approximately where \left|\frac{0.476\times3}{40\omega}\right|=1 (using the high-frequency approximation of the plant):

\omega_{gc}\approx\frac{1.428}{40}=0.0357\ \text{rad/s}

Phase there:

  • PI: -\arctan\frac{1}{40\times0.0357}=-\arctan(0.70)=-35°
  • Plant pole: -\arctan(40\times0.0357)=-\arctan(1.428)=-55°
  • Dead time: -\omega L in radians =-0.0357\times8=-0.286 rad =-16.4°

\angle L=-35-55-16.4=-106.4°

PM=180-106.4=73.6°

Very comfortable, which is what lambda tuning at \lambda=\tau/2 is designed to give.

Now try to be aggressive. Set \lambda=\tau/4=10 s:

K_p=\frac{40}{3(10+8)}=0.741

The crossover moves to \omega\approx1.11\times3/40\ldots recomputing, \omega_{gc}\approx0.0556 rad/s.

Dead time phase: -0.0556\times8=-0.444 rad =-25.5°. Plant pole: -65.8°. PI: -24.2°.

PM=180-115.5=64.5°

Still fine. The dead time is only 20% of the time constant here, so the plant is relatively easy.

Now make the dead time 40 s, equal to the time constant. At the same crossover, the dead time contributes -0.0556\times40=-2.22 rad =-127° on its own.

PM=180-(24.2+65.8+127)=-37°

Unstable. The loop must be detuned drastically.

The lesson in one line: the ratio L/\tau determines how controllable a plant is, and above about 1 no PID tuning gives good performance. That is when a Smith predictor becomes worth its model requirement.

Problem 8 — Effect of sampling rate

A continuous loop has \omega_{gc}=8 rad/s and PM=55°. It is implemented digitally. Find the phase margin at sample rates of 20, 100 and 400 Hz.

Solution

The zero-order hold adds an effective delay of T_s/2, contributing phase lag \omega_{gc}T_s/2 radians.

At 20 Hz: T_s=0.05 s.

\Delta\phi=\frac{8\times0.05}{2}=0.2\ \text{rad}=11.5°

PM=55-11.5=43.5°

At 100 Hz: T_s=0.01 s.

\Delta\phi=\frac{8\times0.01}{2}=0.04\ \text{rad}=2.3°

PM=52.7°

At 400 Hz: \Delta\phi=0.57°, PM=54.4°.

The ratio to bandwidth:

Ratef_s/f_{gc}Margin lost
20 Hz15.711.5°
100 Hz78.52.3°
400 Hz3140.6°

So even 20 Hz — about 16 times the crossover — costs only 11.5°, which is survivable.

Now try 4 Hz, twice the crossover frequency of 1.27 Hz:

\Delta\phi=\frac{8\times0.25}{2}=1\ \text{rad}=57.3°

PM=55-57.3=-2.3°

Unstable.

This is why the sampling theorem's factor of 2 is nowhere near enough for control. Nyquist guarantees you can reconstruct the signal; it says nothing about the phase lag that the reconstruction introduces into a feedback loop.

The 20 to 40× rule from Chapter 6.4 gives 2 to 3° of loss, which is negligible, and that is why it is the rule.

And the computation delay adds on top. If the control algorithm takes 30% of the sample period, that is another 0.3T_s of delay. Always output the previous sample's computed value at the start of the next interrupt rather than computing and then outputting — it makes the delay exactly one sample and, crucially, constant, which is far better than variable.

Problem 9 — State-space model and stability

Build the state-space model of a two-tank system: tank 1 drains into tank 2, tank 2 drains out. Inflow u to tank 1. Linearised, \dot h_1=-a h_1+bu and \dot h_2=ah_1-ch_2, with a=0.5, b=2, c=0.3. Assess it.

Solution

\mathbf A=\begin{bmatrix}-0.5&0\\0.5&-0.3\end{bmatrix}, \qquad \mathbf B=\begin{bmatrix}2\\0\end{bmatrix}

Measuring tank 2's level:

\mathbf C=\begin{bmatrix}0&1\end{bmatrix}

Eigenvalues. The matrix is lower triangular, so the eigenvalues are the diagonal entries:

\lambda_1=-0.5, \qquad \lambda_2=-0.3

Both negative — stable ✓, with time constants of 2 s and 3.33 s.

Controllability:

\mathbf{AB}=\begin{bmatrix}-0.5&0\\0.5&-0.3\end{bmatrix}\begin{bmatrix}2\\0\end{bmatrix}=\begin{bmatrix}-1\\1\end{bmatrix}

\mathcal C=\begin{bmatrix}2&-1\\0&1\end{bmatrix}, \qquad \det=2\ne0

Rank 2, controllable ✓ — the single inflow can steer both levels, which is not obvious from the physical picture but follows because tank 2's level depends on tank 1's history.

Observability:

\mathbf{CA}=\begin{bmatrix}0&1\end{bmatrix}\begin{bmatrix}-0.5&0\\0.5&-0.3\end{bmatrix}=\begin{bmatrix}0.5&-0.3\end{bmatrix}

\mathcal O=\begin{bmatrix}0&1\\0.5&-0.3\end{bmatrix}, \qquad \det=-0.5\ne0

Observable ✓ — measuring only tank 2 is enough to infer tank 1's level.

Now change the measurement to tank 1 only, \mathbf C=[1\ 0]:

\mathbf{CA}=[-0.5\ \ 0], \qquad \mathcal O=\begin{bmatrix}1&0\\-0.5&0\end{bmatrix}, \qquad \det=0

Rank 1 — not observable. And physically that is exactly right: tank 2 is downstream of tank 1 and has no effect on it whatsoever, so watching tank 1 tells you nothing about tank 2.

This is the practical value of the observability test. It caught a sensor-placement mistake from the matrices alone, before anyone built anything.

Transfer function:

G(s)=\mathbf C(s\mathbf I-\mathbf A)^{-1}\mathbf B=\frac{1}{(s+0.5)(s+0.3)}\begin{bmatrix}0&1\end{bmatrix}\begin{bmatrix}s+0.3&0\\0.5&s+0.5\end{bmatrix}\begin{bmatrix}2\\0\end{bmatrix}

=\frac{0.5\times2}{(s+0.5)(s+0.3)}=\frac{1}{(s+0.5)(s+0.3)}

Problem 10 — Pole placement

For \mathbf A=\begin{bmatrix}0&1\\-6&-5\end{bmatrix}, \mathbf B=\begin{bmatrix}0\\1\end{bmatrix}, place the closed-loop poles at -5\pm j5. Assess the actuator demand.

Solution

Open-loop poles: s^2+5s+6=(s+2)(s+3), so -2 and -3. Already stable, with a settling time of 4/2=2 s.

Controllability:

\mathbf{AB}=\begin{bmatrix}1\\-5\end{bmatrix}, \qquad \mathcal C=\begin{bmatrix}0&1\\1&-5\end{bmatrix}, \qquad \det=-1\ne0 \ ✓

Desired polynomial:

(s+5)^2+25=s^2+10s+50

With \mathbf K=[k_1\ k_2]:

\mathbf A-\mathbf{BK}=\begin{bmatrix}0&1\\-6-k_1&-5-k_2\end{bmatrix}

\det(s\mathbf I-\mathbf A+\mathbf{BK})=s^2+(5+k_2)s+(6+k_1)

5+k_2=10 \;\Rightarrow\; k_2=5

6+k_1=50 \;\Rightarrow\; k_1=44

\mathbf K=[44\ \ 5]

New performance: \omega_n=\sqrt{50}=7.07, \zeta=5/7.07=0.707, settling 4/5=0.8 s, overshoot 4.3%.

Two and a half times faster than open loop, with textbook damping.

Now the actuator check. For an initial state of x_1=1, x_2=0:

u(0)=-\mathbf{Kx}=-44\times1-5\times0=-44

Forty-four units of control effort for a displacement of 1. If the actuator saturates at ±10, this design is fiction — the loop will spend its time saturated and the pole placement is meaningless.

Try a gentler target, poles at -3\pm j3:

s^2+6s+18 \;\Rightarrow\; k_2=1, \quad k_1=12

u(0)=-12

Still above ±10, but much closer. Poles at -2.5\pm j2.5 give k_1=6.5, and u(0)=-6.5 ✓.

The general lesson. Pole placement can put poles anywhere, and the required gain rises roughly as the square of how far you move them. Always compute the initial control effort and compare with the actuator's real limit. A design that saturates is not a design.

And this is precisely why LQR is a better formulation — the \mathbf R matrix penalises control effort explicitly, so the optimiser will not propose something the actuator cannot do.

Problem 11 — Observer design

For the system of Problem 10 with \mathbf C=[1\ 0], design an observer with poles at -15\pm j15.

Solution

Observability:

\mathbf{CA}=[0\ \ 1], \qquad \mathcal O=\begin{bmatrix}1&0\\0&1\end{bmatrix} \ \text{rank 2} \ ✓

With \mathbf L=\begin{bmatrix}l_1\\l_2\end{bmatrix}:

\mathbf A-\mathbf{LC}=\begin{bmatrix}-l_1&1\\-6-l_2&-5\end{bmatrix}

\det(s\mathbf I-\mathbf A+\mathbf{LC})=(s+l_1)(s+5)+6+l_2=s^2+(5+l_1)s+(5l_1+6+l_2)

Desired: (s+15)^2+225=s^2+30s+450.

5+l_1=30 \;\Rightarrow\; l_1=25

5(25)+6+l_2=450 \;\Rightarrow\; l_2=450-131=319

\mathbf L=\begin{bmatrix}25\\319\end{bmatrix}

Check the speed ratio. Controller poles at -5\pm j5, observer poles at -15\pm j15three times faster ✓, within the recommended 2 to 5.

Combined system. Six... no, four poles: -5\pm j5 from the controller and -15\pm j15 from the observer, by the separation principle. The controller poles dominate, since they are three times closer to the axis, so the response looks like the controller design intended.

The noise cost. l_2 = 319 means the measurement noise is multiplied by 319 in the estimate of x_2. If the position measurement has 1 mm of noise, the velocity estimate has 319 mm/s of noise, which then goes through k_2=5 into the control signal — 1.6 units of noise on the actuator.

Make the observer faster and it gets worse quadratically. Poles at -30\pm j30 would give l_2 near 1500.

This is the fundamental observer trade: fast estimation means trusting the measurement, and trusting the measurement means inheriting its noise. The Kalman filter's contribution is to make that trade optimally, given honest statistics for the noise, rather than by the designer guessing a pole location.

Problem 12 — Cascade control design

A furnace heats oil circulating through a jacket. The oil temperature responds in 10 s; the product temperature in 300 s. Design a cascade and compare with a single loop.

Solution

Single loop. The controller manipulates the fuel valve and measures product temperature. The plant is the series combination: roughly a 300 s time constant with the 10 s lag inside it, plus perhaps 20 s of transport dead time.

Lambda tuning with \lambda = 300 s (conservative, because dead time is present):

K_p=\frac{300}{K(300+20)}=\frac{0.94}{K}

A disturbance in fuel gas pressure changes the heat input. The product temperature must move before the controller notices. With a 300 s time constant, the excursion lasts many minutes.

Cascade.

Inner loop: oil temperature, manipulating the valve. Time constant 10 s, negligible dead time.

K_{p,inner}=\frac{10}{K_1(5+1)}=\frac{1.67}{K_1} \quad\text{for } \lambda=5\ \text{s}

Closed-loop time constant of the inner loop: 5 s.

Outer loop: product temperature, with the inner loop's setpoint as its output. The outer loop now sees a plant with a 5 s lag instead of a 10 s one, plus the 300 s product dynamics.

K_{p,outer}=\frac{300}{K_2(100+20)}=\frac{2.5}{K_2} \quad\text{for } \lambda=100\ \text{s}

Speed ratio check: inner 5 s against outer 100 s — a factor of 20, comfortably above the required 5 ✓.

What was gained. A fuel pressure disturbance now changes the oil temperature within seconds, the inner loop corrects it within about 15 s, and the product temperature barely moves at all. The outer loop never sees the disturbance.

Quantitatively: the disturbance is attenuated by the inner loop's own factor of 1/(1+L_{inner}), which at low frequency is large. A disturbance that would have caused a 5 °C product excursion causes perhaps 0.2 °C.

And the outer loop can now be tuned three times faster than in the single-loop case, because the fast lag it used to fight has been swallowed by the inner loop.

The cost: a second sensor and a second controller. In process plants this is always worth it, and cascade is the default architecture for anything with a fast inner variable and a slow outer one.

Problem 13 — Non-minimum phase limitation

A plant is G(s)=\dfrac{K(-s+4)}{(s+1)(s+3)}. Find the achievable bandwidth and explain the limit.

Solution

A zero at +4 — right half plane, so non-minimum phase.

The bandwidth limit:

\omega_{BW}\lt\frac{z}{2}=2\ \text{rad/s}

Why. The right-half-plane zero contributes phase lag rather than lead, unlike a left-half-plane zero. Its phase contribution is

\angle(-j\omega+4)=-\arctan\frac{\omega}{4}

Negative, and at \omega=4 it is -45°; at \omega=8 it is -63°; approaching -90° at high frequency.

So the zero behaves like an extra pole as far as phase margin is concerned, while behaving like a zero as far as magnitude is concerned — you get the phase penalty without the gain roll-off that usually accompanies it. That is the worst of both.

Check at \omega=2. Phase contributions:

  • Zero at +4: -\arctan(0.5)=-26.6°
  • Pole at -1: -\arctan(2)=-63.4°
  • Pole at -3: -\arctan(0.667)=-33.7°

\angle G=-123.7°, \qquad PM=56° \ ✓ \text{ if the gain crosses here}

At \omega=4:

  • Zero: -45°
  • Poles: -76° and -53.1°

\angle G=-174°, \qquad PM=6°

Marginal. And at \omega=5 the phase is past -180° and the loop is unstable at any gain that crosses there.

Set the gain for crossover at 2 rad/s.

|G(j2)|=\frac{K\sqrt{16+4}}{\sqrt{5}\sqrt{13}}=\frac{4.47K}{8.06}=0.554K

K=1.80

Settling time: t_s \approx 4/(\zeta\omega_n) with \zeta\approx0.56 and \omega_n\approx1.5\omega_{gc}\ldots roughly 2.4 s.

And no controller does better. A PID, a state-space design, an H_\infty design — all face the same limit, because it is a property of the plant.

Where this bites in the real world. The boiler drum level of Chapter 6.2 is the classic case: add cold feedwater and the level falls first. Operators who did not know this used to override the automatic control, add more water, and trip the boiler on low level. Understanding the zero is what makes the plant operable.

Problem 14 — Diagnose a misbehaving loop

A temperature loop overshoots by 40% on every setpoint change but rejects disturbances well. It was tuned by Ziegler-Nichols. What is wrong and what would you change?

Solution

The diagnosis is in the asymmetry. Good disturbance rejection with poor setpoint response is the signature of ZN tuning working exactly as designed — it was optimised for disturbance rejection in 1942 process plants, where setpoint changes were rare.

The mechanism. Both responses share the same closed-loop poles, so the damping is the same. What differs is the numerator. The setpoint response is

\frac{CG}{1+CG}

and C contains the PID zeros. Those zeros appear in the setpoint response's numerator and increase overshoot (Chapter 6.3), while the disturbance response

\frac{G}{1+CG}

does not contain them.

So the controller's own zeros are causing the overshoot, and they are simultaneously what makes the disturbance rejection good.

Three fixes, in ascending order of preference:

1. Detune. Halve K_p and double T_i. Overshoot drops to about 10%, and disturbance rejection gets worse. This throws away the thing that was working.

2. Setpoint filtering. Pass the setpoint through a first-order lag before the controller:

r_{filtered}=\frac{r}{1+T_fs}, \qquad T_f\approx T_i

This removes the zeros' effect on the setpoint path only. Disturbance rejection is untouched, and overshoot largely disappears. The setpoint response becomes slower, which is usually fine.

3. Setpoint weighting — the proper answer, and what every commercial controller implements:

u=K_p(\beta r-y)+K_i\int(r-y)dt-K_d\frac{dy}{dt}

Note three different treatments of the setpoint in one equation. The proportional term uses a weighted setpoint with \beta between 0 and 1; the integral term uses the full error, so steady-state accuracy is preserved; the derivative term ignores the setpoint entirely, which removes derivative kick.

Setting \beta=0.5 typically halves the overshoot with no other change. \beta = 0 gives a controller that responds to setpoint changes only through the integral, which is very smooth and rather slow.

Recommendation: option 3 with \beta = 0.5, keeping the existing gains. It costs one line of code, changes nothing about disturbance rejection or stability margin, and solves the stated problem exactly.

Also check, since this loop was tuned by ZN: is the derivative filtered, is it on the measurement, and is there anti-windup? A ZN-tuned loop with none of the three is the most common configuration in the field and the most common source of complaints.


Part 7 leaves control behind and asks a different question: how much information can be pushed through a channel that adds noise, and what modulation schemes get closest to the limit.