Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

2.7 Observability and State Estimation

Can measurements reveal the state?

For

x˙=Ax+Bu,y=Cx,\dot{x}=Ax+Bu, \qquad y=Cx,

the observability matrix is

O=[CCACA2CAn1].\mathcal{O}=\begin{bmatrix}C\\CA\\CA^2\\\vdots\\CA^{n-1}\end{bmatrix}.

The system is observable if rank(O)=n\operatorname{rank}(\mathcal{O})=n. As with controllability, binary rank is only the beginning. Poorly observable directions amplify noise and model error in an estimator.

Sensor placement is a physical design decision

Sensor locations can reveal or hide flexible modes.

A strain gauge near a modal node provides little information about that mode. A body-mounted accelerometer may reveal vibration but provide weak low-frequency position information. Camera placement affects occlusion and geometry; thermocouple placement affects delay; pressure sensors alter plumbing and packaging.

CCD may optimize sensor type, location, precision, sampling, and redundancy along with the plant and controller. The measurement matrix C(p,s)C(p,s) and noise covariance then depend on design choices.

State estimation

An observer combines the model, command, and measurement:

x^˙=Ax^+Bu+L(yCx^).\dot{\hat{x}}=A\hat{x}+Bu+L(y-C\hat{x}).

The estimator error follows

e˙=(ALC)e\dot{e}=(A-LC)e

in the nominal deterministic case. A Kalman filter selects LL from process- and measurement-noise assumptions. Estimator bandwidth must balance tracking against noise amplification.

Separation is useful but not absolute in CCD

For a fixed linear plant under standard assumptions, controller and observer poles may be designed separately. In CCD, plant changes alter AA, BB, CC, noise transmission, and model uncertainty. A sensor layout that works for one structure may become poor after geometry changes. Estimator and controller design therefore remain coupled through the physical design even when the separation principle applies locally.

Observability check

import numpy as np

def observability_matrix(A, C):
    return np.vstack([C @ np.linalg.matrix_power(A, i) for i in range(A.shape[0])])

A = np.array([[0, 1, 0, 0], [-4, -0.3, 1, 0],
              [0, 0, 0, 1], [1, 0, -25, -0.8]], dtype=float)
for label, C in {
    "sensor near modal node": np.array([[1.0, 0, 0.02, 0]]),
    "two separated sensors": np.array([[1.0, 0, 0, 0], [0, 0, 1.0, 0]]),
}.items():
    O = observability_matrix(A, C)
    print(label, "rank=", np.linalg.matrix_rank(O), "condition=", np.linalg.cond(O))

Activity 2.7: measurement versus performance