← Blog

part 2 · Foundations of Control Systems

Feedback and System Behavior

How closing the loop changes the speed of a simple first-order system and how sensitive its output is to plant errors and disturbances, checked with a short simulation.

Robotics and Control5 min read

Feedback is the central idea of control engineering: measure what a system is doing, compare it with what you want, and let the difference drive the input. This note uses the smallest model that shows the effect, a first-order system, to see exactly what changes when the loop is closed. The answer is less obvious than it first looks. When the plant is known exactly, feedback does not make this system more accurate. It makes it faster, and it makes the output far less sensitive to errors in the model and to disturbances.

The plant without feedback

Take a plant described by

x˙(t)=−a x(t)+b u(t),a>0,  b>0,\dot{x}(t) = -a\,x(t) + b\,u(t), \qquad a > 0,\; b > 0,

where xx is the output, uu is the input, and aa and bb are constants. With no input the state decays as e−ate^{-at}, so the time constant is τ=1/a\tau = 1/a.

In open loop the input is chosen without looking at xx. For a constant reference rr the natural choice is the input that makes x˙=0\dot{x} = 0 at x=rx = r, which is u=(a/b) ru = (a/b)\,r. With a=b=1a = b = 1 this is simply u=ru = r, and the output settles at xss=rx_{ss} = r with time constant 11. On the nominal plant, then, open loop is already exact. Its weakness is that it works only if aa and bb are known exactly and nothing pushes on the plant: if the plant changes, or a disturbance acts on it, the input cannot react.

Closing the loop with proportional feedback

Now let the input depend on the error between a constant reference rr and the measured output:

u(t)=k (r−x(t)),k>0.u(t) = k\,\bigl(r - x(t)\bigr), \qquad k > 0.
Proportional feedback around a first-order plantThe output x is subtracted from the reference r. The error is multiplied by the gain k to give the input u, which drives the plant x-dot equals minus a x plus b u.r−r − xkuPlantẋ = −ax + bux
Proportional feedback: the input is the gain k times the error between the reference r and the output x.

Substituting into the plant gives the closed-loop equation

x˙(t)=−(a+bk) x(t)+bk r.\dot{x}(t) = -(a + bk)\,x(t) + bk\,r.

Two things follow directly. First, the decay rate changed from aa to a+bka + bk, so the closed-loop time constant is τcl=1/(a+bk)\tau_{cl} = 1/(a + bk). A larger gain makes the system respond faster. Second, for a constant reference the output settles where x˙=0\dot{x} = 0:

xss=bka+bk r,r−xss=aa+bk r.x_{ss} = \frac{bk}{a + bk}\,r, \qquad r - x_{ss} = \frac{a}{a + bk}\,r.

The steady-state error shrinks as kk grows but never reaches zero with proportional action alone, because this plant has no integrator to hold the input at the required value.

The table compares this with the open loop above for a=1a = 1 and b=1b = 1, on the nominal plant.

ControllerPoleTime constantSteady-state error (fraction of rr)
Open loop, u=ru = r-110
Feedback, k=1k = 1-20.50.50
Feedback, k=4k = 4-50.20.20
Feedback, k=9k = 9-100.10.10
Step responses of the first-order plant with and without feedbackWith a equal to b equal to 1 and r equal to 1, the open-loop response rises to 1 with time constant 1. Proportional feedback with gains 1, 4 and 9 settles at 0.5, 0.8 and 0.9 with time constants 0.5, 0.2 and 0.1: faster, but with a steady-state offset.00.50.80.9101234time toutput x(t), r = 1open loop, u = rk = 9k = 4k = 1
Step responses for a = b = 1 and r = 1. Larger gains respond faster but settle below the reference, at bk/(a + bk).

Read the last column carefully. On the nominal plant the open loop has no error at all, so proportional feedback does not improve accuracy here. What it changes is speed: the time constant falls from 1 to 0.5, 0.2 and 0.1. The reason to accept the offset appears when the plant is not exactly what the model says.

A short simulation

The explicit Euler method is enough to check the algebra. With k=4k = 4 and r=1r = 1 the table predicts xss=0.8x_{ss} = 0.8.

a, b, k, r = 1.0, 1.0, 4.0, 1.0
dt, x = 0.001, 0.0

for _ in range(int(5 / dt)):       # simulate 5 seconds
    u = k * (r - x)                # proportional feedback
    x += dt * (-a * x + b * u)     # explicit Euler step

print(round(x, 3))                 # 0.8

Running this prints 0.8, matching bk/(a+bk)bk/(a + bk).

When the plant or the load changes

Two perturbations show what the feedback buys. Both use k=4k = 4, r=1r = 1 and the open-loop input u=ru = r, which was designed for a=b=1a = b = 1.

A plant that decays 20% faster (a=1.2a = 1.2). Open loop settles at xss=bu/a=1/1.2≈0.833x_{ss} = bu/a = 1/1.2 \approx 0.833. Closed loop settles at bk r/(a+bk)=4/5.2≈0.769bk\,r/(a + bk) = 4/5.2 \approx 0.769.

A constant disturbance dd added to the plant, so that x˙=−a x+b u+d\dot{x} = -a\,x + b\,u + d. In open loop the output settles at (bu+d)/a(bu + d)/a, so the disturbance moves it by d/ad/a. In closed loop the equation becomes x˙=−(a+bk) x+bk r+d\dot{x} = -(a + bk)\,x + bk\,r + d, and the disturbance moves the output by only d/(a+bk)d/(a + bk). For a=b=1a = b = 1 and k=4k = 4 that is one fifth as much.

def settle(a, control, d=0.0, b=1.0, dt=0.001, T=10.0):
    x = 0.0
    for _ in range(int(T / dt)):
        x += dt * (-a * x + b * control(x) + d)   # explicit Euler step
    return x

r = 1.0
open_loop = lambda x: r                 # u = r, exact when a = b = 1
closed_loop = lambda x: 4.0 * (r - x)   # k = 4

cases = [("nominal", 1.0, 0.0), ("a = 1.2", 1.2, 0.0), ("d = 0.2", 1.0, 0.2)]
for label, a, d in cases:
    print(label, round(settle(a, open_loop, d), 3), round(settle(a, closed_loop, d), 3))

The three lines it prints are collected below, with the shift from the nominal output in brackets.

CaseOpen loop, u=ru = rClosed loop, k=4k = 4
Nominal (a=1a = 1, d=0d = 0)1.0000.800
Plant changed (a=1.2a = 1.2)0.833 (-0.167)0.769 (-0.031)
Disturbance (d=0.2d = 0.2)1.200 (+0.200)0.840 (+0.040)

Notice what is being compared: how far the output moves, not how far it ends from the reference. The closed loop still carries its offset from the reference, and with a disturbance of the opposite sign its absolute error would be larger than the open loop’s. What feedback has done is make the output move about five times less when the plant or the load changes. Removing the offset itself takes more than proportional action, typically an integrator.

What this model hides

A higher gain is not automatically better. The first-order model has no delay, no actuator limit and no measurement noise, and real systems have all three.

Delays and unmodelled dynamics can turn a large gain into oscillation or instability, and saturation means the input cannot grow without bound. Treating kk as freely adjustable is an artifact of the model. Later notes in this series use state-space descriptions to reason about these limits more carefully.

← Back to all articles

Search

Arrow keys move between results. Enter opens the first result.