The figure below is a map of the whole page, not a formula. Each box is one level of the exercise ladder; the colour tells you how hard it is (chalk-blue = warm-up, pale-yellow = analysis, chalk-pink = mastery). Inside each box, the italic line is the flavour of question that level asks. The arrows show the intended climb order. The single line across the top is the moral: no matter which box you are in, the actual computation is always the same three moves — build O, count its independent rows, compare to n.
How to read it: start at the bottom-left box (L1 Recognition — "build O, count rank") and follow the arrows up-right to L5 Mastery ("will the KF converge?"). Notice that the question in each box gets wordier and more physical as you climb, but the tool underneath never changes. If you ever feel lost inside an exercise, find your box on this ladder and ask: "which rung am I on, and is my current step really just the rank test in disguise?"
Goal: read off n, build O mechanically, count the rank.
Recall Solution 1.1
WHAT we do: we only need C and CA because n=2 (we stack up to CAn−1=CA1).
WHY: each extra row is one more equation about the starting snapshot x(0) (the state at time zero, introduced above); Cayley–Hamilton (see Cayley–Hamilton Theorem) says stopping at An−1 loses nothing.
Row 1: C=[10].
Row 2: CA=[10][0−21−3]=[01].
O=[1001].
The two rows point in independent directions (they are the identity), so rank(O)=2=n.
Answer: observable. ✅
Recall Solution 1.2
WHY only two rows:n=2, so by Cayley–Hamilton we stack C and CA and stop — CA2 would be a combination of these and add no information.
C=[01], and
CA=[01][3005]=[05].
O=[0015].
Row 2 is just 5× row 1 — no new direction. The first column is all zeros, so no combination of rows ever "reaches" state 1. rank(O)=1=2.
Answer: NOT observable. State x1 is decoupled (A is diagonal) and unmeasured, so it never leaks into y. ❌
Goal: plug in real GNC dynamics; interpret the rank physically.
Recall Solution 2.1
WHY only two rows:n=2, so the test needs exactly C and CA (Cayley–Hamilton caps the stack at CAn−1).
C=[01], CA=[01][0010]=[00].
O=[0010],rank=1=2.Answer: NOT observable.Interpretation: velocity never depends on position (position doesn't feed back into the dynamics — the first column of A is zero), so watching the velocity tells you nothing about where the cart is. Contrast with the parent note's Example 1, where you measure position and velocity leaks in through A12=1. Here the information flow runs the wrong way. A KF's variance on x1 never shrinks.
Recall Solution 2.2
WHY only two rows: again n=2, so we stack C and CA and stop — higher powers are redundant by Cayley–Hamilton.
C=[10], CA=[10][00−1−0.1]=[0−1].
O=[100−1],rank=2=n.Answer: observable. ✅ The bias b still feeds the angle rate (A12=−1=0), so its footprint appears in the measured angle. This is the mechanism behind Gyro bias estimation / star-tracker calibration.
Goal: handle parameters, symbolic conditions, and degenerate values.
Recall Solution 3.1
WHY only two rows:n=2; stack C and CA. Because O is then square (2×2), we can test full rank cheaply via its determinant (nonzero determinant ⟺ full rank).
C=[1α], CA=[1α][0010]=[01].
O=[10α1],detO=(1)(1)−(α)(0)=1.
The determinant is 1 for everyα, so rank=2 always.
Answer: observable for all real α. The extra velocity term α in the sensor never destroys the information already carried by the position term — the second row CA independently pins down velocity.
Recall Solution 3.2
WHY only two rows:n=2, so we stack C,CA and use detO as the full-rank test.
C=[c1],
CA=[c1][2102]=[2c+12].
O=[c2c+112],detO=2c−(2c+1)=−1.
The determinant is −1, independent of c.
Answer: observable for every c — it never loses observability. The trap here (see below) is assuming a free parameter must have a bad value.
Recall Solution 3.3
WHY three rows here: now n=3, so Cayley–Hamilton lets us stop at CAn−1=CA2; we stack C,CA,CA2.
C=[010].
CA=[010]A=[0−21].
CA2=(CA)A=[0−21]A=[04−4].
O=0001−2401−4.
The entire first column is zero — no row reaches state x1. So rank(O)≤2<3.
Answer: NOT observable. State x1 (the −1 mode) is fully decoupled from states 2 and 3 and unmeasured; it is invisible.
(For completeness: rows 2 and 3 together span the x2,x3 plane, so rank=2. Only the isolated x1 mode is lost.)
Goal: combine observability with duality, Gramians, and detectability.
Recall Solution 4.1
Set Aˉ=A⊤=[0100] and B=C⊤=[10].
AˉB=[0100][10]=[01].
C=[BAˉB]=[1001],rank=2.
Full rank ⇒(A⊤,C⊤)controllable, matching (A,C) observable. Duality confirmed. See Controllability — when we can steer the state and Detectability & Stabilizability.
Recall Solution 4.2
With A diagonal, eAt=[e−t00e−3t], and C⊤C=[1111].
The integrand's (i,j) entry is (C⊤C)ije(λi+λj)t with λ1=−1,λ2=−3. Because the system is stable (λi<0), these exponentials decay, so the integral to ∞ converges: ∫0∞e(λi+λj)tdt=λi+λj−1:
(Wo)11=−1−1−1=21,(Wo)22=−3−3−1=61.Interpretation:(Wo)22=61<(Wo)11=21. The faster-decaying mode (λ=−3) spends less time influencing the output, so it is less observable — the KF recovers it with larger uncertainty. This connects to the steady-state covariance from the Riccati Equation & steady-state covariance.
Goal: reason about the KF consequence, detectability, and design a fix.
Before the exercises, one definition the parent note leaned on but we will now make precise, because Level 5 hinges on it.
Recall Solution 5.1
Setup — why the update collapses to a scalar. The full covariance obeys the time update P˙=AP+PA⊤+Q, where Q⪰0 is the process-noise injection. Project this onto the single hidden axis v (the eigenvector with Av=λv): write p=v⊤Pv for the variance along that axis and q=v⊤Qv≥0 for the noise fed into it. Using Av=λv (so v⊤A=λv⊤ too), the two matrix terms each contribute λp:
p˙=v⊤(AP+PA⊤+Q)v=λp+λp+q=2λp+q.
Crucially, the measurement update does nothing here: the mode is unobservable, so the Kalman gain cannot correct along v (Cv carries no information). The scalar p˙=2λp+q is the whole story.
Case λ=−0.5 (stable mode). Then p˙=−p+q. Setting p˙=0 gives the steady value p∞=q, a finite number; any starting p relaxes to it. Bounded ✅. Even though we never see this mode, it decays on its own, so the injected noise cannot pile up. The system is detectable: unobservable but stable.
Case λ=+0.5 (unstable mode). Then p˙=+p+q. The homogeneous part grows like e2(0.5)t=et, so p(t)→∞ — no finite steady state exists. Diverges ❌. An unobservable and unstable mode is fatal: the filter is blind exactly where the error is exploding.
The property that draws the line: detectability. A Kalman Filter has a bounded steady-state covariance iff every unobservable mode is asymptotically stable (i.e. λ<0). λ=−0.5 is detectable (bounded); λ=+0.5 is not detectable (diverges). This is the covariance behaviour of the Kalman Filter — prediction & update Riccati recursion.
Recall Solution 5.2
WHY we can reuse the old work: the original block {C,CA,CA2} already spanned the x2,x3 plane (rank 2) but left column 1 empty. The new row directly measures x1 (scaled by g), which is exactly the missing direction — so we only need to check whether it fills column 1.
Stack the fresh row on top of two independent old rows; the relevant 3×3 block of Onew is
g0001−2001.
Compute its determinant (expand along the first column, since only the top entry is nonzero there):
det=g⋅det[1−201]=g⋅(1⋅1−0⋅(−2))=g⋅1=g.
This determinant is nonzero (hence the block, and therefore Onew, has full rank 3) iff g=0.
Answer: observable for every g=0; still unobservable at g=0 (a zero-gain sensor measures nothing, leaving column 1 empty as before). This is the design lesson: to see a decoupled mode, you must add a sensor that actually touches it with nonzero gain — and always confirm the rank rose to n, echoing the parent note's "more sensors don't help unless they add rank."
Recall Self-test checklist
Can you, from memory, build O for any n=2 system? ::: Yes: stack C on CA, check the 2×2 determinant.
What single number decides observability of a square O? ::: Its determinant — nonzero means full rank means observable.
Which property lets a KF tolerate an unseen mode? ::: Detectability — the unseen mode is asymptotically stable.
How do you rescue a decoupled invisible state? ::: Add a sensor that touches that state (nonzero gain into that column) and confirm the rank rises to n.