← antimony labs

Two showers, side by side. The first is open-loop — you set the knob to "what you think 38°C is" and walk in. The second is closed-loop — you feel the water and keep turning. Now slide the plant-gain knob below to simulate calcium buildup in the pipes (the real gain is drifting). Both controllers were tuned for the nominal plant. Watch which one keeps up.

Open-loop vs. closed-loop, when the model is wrong

open-loop SSE
closed-loop SSE
open-loop RMS err
closed-loop RMS err
what to try
  • Set Ktrue = 1.0 (the nominal value the controller was tuned for). Both traces hit 1. So far feedback looks redundant.
  • Slide Ktrue away from 1.0. The open-loop trace drifts proportionally — its SSE follows the error in K. The closed-loop trace stays glued to 1 (or near it). Robustness.
  • Kick the system mid-run. The open-loop controller has no way to notice. The closed-loop one fights back. Without disturbance, you could fake feedback's win with an accurate enough open-loop model — this is the experiment that proves you can't.
  • Drop Kp very low (≈ 0.2). The closed-loop response becomes sluggish and underuses its feedback. Crank Kp very high — it overshoots and oscillates. Two failure modes; the knob you found is the compromise.
show the math

The plant is a first-order lag . The open-loop controller is a constant scaling — it just guesses the inverse. The closed-loop controller is plain proportional .

For the open-loop, the steady-state output is — any model error propagates one-to-one. For the closed-loop with a well-tuned Kp, the steady-state error is , which shrinks toward zero as Kp grows (at the cost of bandwidth / overshoot, the trade-off PID exists to manage).