Stability, Controllability, and Observability
The structural properties of a linear model knowable before any controller exists: internal stability via eigenvalues and the Lyapunov equation, controllability and observability as reachability and state-identifiability, and the duality that makes them one theory — and makes the LQR regulator and the Kalman estimator one computation.
On this page
Stability, Controllability, and Observability
Where we are. Week 11 built the linear state-space model and showed the transfer function is its coordinate-free invariant. Before designing any controller, three structural questions decide what is achievable on that model: is it internally stable; can the input steer the whole state (controllability); can the output reconstruct the whole state (observability)? These are the linear-systems analogues of reachability and identifiability in reinforcement learning — they bound what any policy or estimator can do, before optimality is even on the table. LQR and the Kalman filter (Week 13) will need exactly the mild weakenings of these properties.
Internal stability
The autonomous system (zero input) is asymptotically stable if as from every initial state. Its discrete-time counterpart is asymptotically stable if for every .
For a linear system, asymptotic stability is decided entirely by the spectrum of .
The continuous-time system is asymptotically stable iff every eigenvalue of has strictly negative real part — is Hurwitz, . The discrete-time system is asymptotically stable iff every eigenvalue lies strictly inside the unit disk — is Schur, the spectral radius .
The reason is the modal decomposition: solutions of are combinations of over the eigenvalues (with polynomial factors at repeated eigenvalues), and iff ; in discrete time the modes are , which vanish iff .
Eigenvalues answer the question but require an eigendecomposition. The Lyapunov equation gives an equivalent algebraic certificate — and it is the template for the Riccati equation of Week 13.
is Hurwitz iff for every symmetric the Lyapunov equation
has a unique solution , and that is symmetric positive definite. Then is a Lyapunov function: and along every nonzero trajectory.
(, the construction.) Suppose is Hurwitz and fix . Define
Hurwitzness gives for some , so the integrand decays exponentially and the integral converges; is symmetric because is. It is positive definite: for , since and . Finally it solves the equation:
The Lyapunov-function claim follows by differentiating along : . The converse — a positive-definite forcing the spectrum into the open left half-plane — is the standard direction in Sontag (1998) .
So stability has two faces: a spectral test (eigenvalues) and an algebraic certificate (a quadratic energy that strictly decreases). The Lyapunov view generalizes to nonlinear systems (Week 14) and, with a control term added, becomes the Riccati equation that solves LQR (Week 13).
Controllability
The pair is controllable if for any initial state and any target there is an input on some finite interval that drives the state from to . Equivalently, every state is reachable from the origin.
with is controllable iff the controllability matrix
has full row rank, .
Only powers up to appear: by the Cayley–Hamilton theorem is a linear combination of , so higher powers add no new directions. An equivalent test uses the controllability Gramian , which is positive definite iff is controllable; for Hurwitz the infinite-horizon Gramian solves a Lyapunov equation , tying controllability back to the previous section.
Observability
Observability is the same question asked of the output map: can the measurements pin down the state?
The pair is observable if the initial state can be uniquely determined from the output over any finite interval (the input being known).
with , is observable iff the observability matrix
has full column rank, .
The two rank conditions are visibly mirror images — stacks horizontally, stacks vertically. That mirror is not a coincidence.
Duality
is observable iff is controllable; dually, is controllable iff is observable. Concretely, the observability matrix of is the transpose of the controllability matrix of the dual pair,
Write the dual controllability matrix, and transpose its blocks one at a time:
Transposing turns the horizontal blocks into vertical ones, . Since rank is invariant under transposition, , and the rank conditions of Theorems 12.3–12.4 give the equivalence.
Duality halves the theory: every controllability result has a free observability twin. It is also why LQR (state feedback) and the Kalman filter (state estimation) are the same Riccati computation run on dual systems — the deepest structural fact Week 13 will exploit.
The structural bridge to learning
These properties are the control-theoretic statements of limits that also bound reinforcement learning:
- Controllability ↔ reachability. An uncontrollable mode is a direction of state space no input — and therefore no policy — can affect. It is the linear, exact version of the reachable-set question that determines what any RL agent can possibly accomplish on a system.
- Observability ↔ identifiability. An unobservable mode is a latent direction the outputs never reveal, so no estimator can recover it from data. This is precisely the gap between a fully observed MDP and a POMDP, where the agent must act on a belief over hidden state.
- The weakenings LQR needs. Optimal control does not require full controllability/observability, only stabilizability (every uncontrollable mode is already stable) and detectability (every unobservable mode is already stable). These are the exact conditions under which the dynamic-programming value function of Week 13 exists and yields a stabilizing policy — a structural prerequisite, checked before any optimization, for the Bellman recursion to have a well-behaved fixed point.
What’s next
- Week 13 (LQR/LQG). Put a quadratic cost on the controllable linear model and the Bellman equation collapses to the algebraic Riccati equation — the Lyapunov equation of this chapter with a control term subtracted. Stabilizability and detectability are exactly what make its stabilizing solution exist; duality makes the optimal regulator and the optimal estimator one calculation. This is where dynamic programming and control theory become the same equation.
Exercises
-
(Compute) For , decide continuous-time (Hurwitz) and discrete-time (Schur) asymptotic stability.
Solution
The eigenvalues are (triangular matrix). Both have , so is Hurwitz and the flow is asymptotically stable. As a discrete map, and are not inside the unit disk, so is not Schur and is unstable. The same matrix is stable as a flow but unstable as a map — stability is a property of the system type, not of alone.
-
(Prove) With , solving for , show along and conclude asymptotic stability.
Solution
for . A positive-definite function strictly decreasing along every trajectory forces (Lyapunov’s direct method), so the origin is asymptotically stable — without computing a single eigenvalue.
-
(Compute) For , , form and decide controllability.
Solution
, which has rank , so is uncontrollable. The second mode (the eigendirection) has no input coupling, so no can move it. Because that mode is already stable, the system is still stabilizable — the weaker property LQR needs.
-
(Prove) Show , and hence observability of is equivalent to controllability of .
Solution
As in Proposition 12.1: , so transposing the horizontal blocks of produces the vertical observability stack . Rank is invariant under transposition, so the two full-rank conditions coincide.
-
(Implement) In the companion, verify that the controllable/uncontrollable and observable/unobservable examples have the predicted ranks, that the Lyapunov solution is positive definite iff is Hurwitz, and that duality holds as a rank equality.
Solution
See
experiments/python/week12/test_structural.py:is_controllable/is_observablematch the Kalman rank conditions;lyapunov_solvereturns a positive-definite for the Hurwitz oscillator and an indefinite for an unstable (the certificate failing exactly when stability does); andobservability_matrix(A.T, C.T)equalscontrollability_matrix(A, C).T. -
(Extend) The rank tests are exact in arithmetic but decided numerically by a singular-value threshold. Show that the verdict of
numpy.linalg.matrix_rankon a controllable system depends on the tolerance convention: scale the input by and compare numpy’s default (relative) tolerance against a fixed absolute one.Solution
Scaling the input column by shrinks every singular value of in proportion, so stays full rank for every . numpy’s default tolerance is relative — — hence scale-invariant: it reports rank at every . A fixed absolute threshold tells a different story: once the smallest singular value drops below it, the same controllable system reads as rank-deficient. The companion’s
--scaling-demoprints both verdicts side by side (the default stays ; the absolute one flips to , then ). The lesson: controllability is binary in exact arithmetic but graded in finite precision, and “numerically uncontrollable” names a chosen tolerance, not the system — the Gramian’s smallest eigenvalue is the tolerance-free measure of how controllable a system is.
Companion code
The Week-12 companion lives at experiments/python/week12/ (Python, on scipy +
numpy, cross-checked against python-control).
structural.py— Hurwitz / Schur stability tests; the Lyapunov solver for (scipy.linalg.solve_continuous_lyapunov); controllability and observability matrices with their rank tests; the controllability Gramian; and a built (un)controllable / (un)observable dual pair.test_structural.py— mathematical-correctness tests: the stability tests agree with the eigenvalues; the Lyapunov is positive definite iff is Hurwitz, with residual ; the rank conditions classify the controllable/observable examples and their rank-deficient duals; the Gramian solves and is positive definite iff controllable; and duality holds as .
# structural algorithms + correctness tests (scipy + python-control cross-check)
PYTHONPATH=. pytest experiments/python/week12/test_structural.py -q
# worked summary table for several small systems + the rank-under-scaling demo
PYTHONPATH=. python experiments/python/week12/structural.py --scaling-demo