Case Study 2 — Will It Stand or Will It Wobble? The Four Subspaces of a Truss
Field: structural / mechanical engineering. Concepts used: rank, nullity, all four fundamental subspaces, rank-nullity in both forms. Anchor tie-in: this is Strang's four-subspaces picture made structural — the same incidence-matrix story from §14.6 (loops in a circuit) becomes mechanisms and self-stress states in a bridge or a roof truss.
A bridge, a roof, a question of life and death
A truss is a structure built from straight bars joined at their ends by pins — the lattice of a railway bridge, the triangulated web inside a roof, the boom of a crane. Each bar can only push or pull along its own length (it carries an axial force, tension or compression, and nothing else). The engineer's first question about any truss is brutally practical: will it stand up? Will the bars, pushing and pulling on the pinned joints, hold every joint in equilibrium under the loads it must carry — or will some joint be free to drift, turning the "structure" into a collapsing mechanism?
Remarkably, the answer is decided not by calculus or simulation but by the rank of a single matrix and the dimensions of its four fundamental subspaces. The theory was worked out by Maxwell in the 1860s and sharpened in the twentieth century into a clean linear-algebra statement [verify]; it is one of the most direct engineering payoffs of the chapter you just read. To an engineer, the four subspaces are not abstractions — they are the difference between a bridge and a pile of steel.
Building the equilibrium matrix
Set up the problem as a linear system. Suppose the truss has $b$ bars and, after accounting for supports that pin it to the ground, $d$ remaining degrees of freedom at its free joints (each free joint in 2D can move in $x$ and $y$, contributing two). Newton's law at each joint says the bar forces meeting there must balance the external load. Collecting the unknown bar forces into a vector $\mathbf{t} \in \mathbb{R}^b$ (one tension per bar) and the joint loads into a vector $\mathbf{f} \in \mathbb{R}^d$, the equilibrium of every joint is a linear system $$A\,\mathbf{t} = \mathbf{f},$$ where $A$ is the equilibrium matrix, of size $d \times b$ — that is, $m = d$ equilibrium equations (rows) and $n = b$ bar forces (columns). Each column of $A$ records how one bar's tension pushes on the joints it connects; each row enforces force balance in one coordinate direction at one joint. This matrix is the structural cousin of the graph incidence matrix from §14.6: bars play the role of edges, joint-equilibrium equations the role of nodes.
Now read the four fundamental subspaces of $A$, and watch each one acquire a physical name.
- Column space $C(A)$ ⊂ $\mathbb{R}^d$: the set of joint loads $\mathbf{f}$ that the bars can balance — the loads the truss can actually carry. If $C(A)$ is all of $\mathbb{R}^d$ (full row rank), the truss can equilibrate any load.
- Left null space $N(A^{\mathsf{T}})$ ⊂ $\mathbb{R}^d$: load directions the bars cannot resist. A nonzero vector here is a mechanism — a way the joints can move (an inextensional displacement) that no combination of bar forces opposes. A truss with a mechanism wobbles; it is not a rigid structure.
- Null space $N(A)$ ⊂ $\mathbb{R}^b$: bar-force vectors $\mathbf{t}$ that produce zero net joint force, $A\mathbf{t} = \mathbf{0}$. A nonzero vector here is a state of self-stress — the bars can be tensioned against one another (some pulling, some pushing) with the structure carrying no external load at all, like a pre-tensioned cable net.
- Row space $C(A^{\mathsf{T}})$ ⊂ $\mathbb{R}^b$: the bar-force patterns actually required to resist loads, the complement of the self-stress states.
Reading rigidity off the rank
The engineer's verdict now follows from rank and rank-nullity, in both forms. Let $r = \operatorname{rank}(A)$.
Mechanisms are counted by the left null space: the number of independent ways the truss can wobble is $\dim N(A^{\mathsf{T}}) = m - r = d - r$. Self-stress states are counted by the null space: $\dim N(A) = n - r = b - r$. These two dimensions are exactly what the two forms of rank-nullity deliver: $$\underbrace{r}_{\substack{\text{independent}\\\text{equilibrium}}} + \underbrace{(b - r)}_{\text{self-stresses}} = \underbrace{b}_{\text{bars}}, \qquad \underbrace{r}_{\substack{\text{independent}\\\text{equilibrium}}} + \underbrace{(d - r)}_{\text{mechanisms}} = \underbrace{d}_{\text{joint d.o.f.}}.$$
Subtracting the two relations eliminates $r$ and gives the celebrated Maxwell counting rule: $(\text{self-stresses}) - (\text{mechanisms}) = b - d$. A surplus of bars over degrees of freedom tends to create self-stress; a deficit tends to create mechanisms. But — and this is exactly the chapter's Common Pitfall about counting rows and columns instead of rank — the counts are decided by the rank, not by $b$ and $d$ alone. A poorly arranged truss with plenty of bars can still harbour a mechanism if those bars are badly placed (the rank falls short), and Maxwell's rule only relates the difference of the two dimensions, never either one by itself. You must compute the rank.
# Three trusses, classified by the four subspaces of the equilibrium matrix A (d x b).
import numpy as np
def classify(A, name):
A = np.asarray(A, dtype=float)
d, b = A.shape # d joint-equations (rows), b bars (cols)
r = np.linalg.matrix_rank(A)
mechanisms = d - r # dim N(A^T): independent wobble modes
self_stress = b - r # dim N(A): independent pre-stress states
print(f"{name}: d={d} bars b={b} rank r={r} | "
f"mechanisms={mechanisms}, self-stresses={self_stress}")
# (1) Statically determinate: square, full rank -> rigid AND no redundancy.
classify([[1, 0, 0.5],
[0, 1, 0.5],
[0, 0, 0.7]], "determinate ")
# (2) Statically indeterminate: extra bar (b > d), full row rank -> rigid but redundant.
classify([[1, 0, 0.5, 0.5],
[0, 1, 0.5,-0.5],
[0, 0, 0.7, 0.7]], "indeterminate")
# (3) A mechanism: rank falls short of d -> a joint can move; the truss wobbles.
classify([[1, 0],
[0, 1],
[1, 1.]], "mechanism ")
The output classifies all three:
- Determinate ($d = b = 3$, rank $3$): mechanisms $= 0$, self-stresses $= 0$. The truss is rigid and every bar is necessary — remove any one and it collapses. There is a unique set of bar forces for each load (full rank, both null spaces trivial). This is the engineer's ideal "statically determinate" structure.
- Indeterminate ($d = 3$, $b = 4$, rank $3$): mechanisms $= 0$, self-stresses $= 1$. Adding a fourth bar to a three-equation system gives full row rank (so still rigid, no wobble) but opens a one-dimensional null space — one independent state of self-stress. The structure is statically indeterminate: the load can be balanced, but not by a unique set of bar forces, because you can add any multiple of the self-stress pattern. Real bridges are built this way deliberately, for redundancy: if one bar fails, the self-stress states let the load reroute.
- Mechanism ($d = 3$, rank $2 < 3$): mechanisms $= 1$. The rank is deficient, so the left null space is nonzero — there is a direction in which the joints can move with no bar resisting. This truss wobbles; it is not a viable structure. No amount of bar strength fixes it, because the failure is geometric, encoded entirely in the rank.
The lesson
A truss is safe to stand on exactly when its equilibrium matrix has no mechanisms — when $\dim N(A^{\mathsf{T}}) = 0$, i.e. full row rank, so the bars can resist every possible load. Whether it is also efficient (no wasted redundant bars) is read off the other null space: $\dim N(A) = 0$ means statically determinate, $\dim N(A) > 0$ means redundant self-stress capacity. The entire stability analysis is the four-subspaces picture of Chapter 14, applied to one matrix:
| Subspace | Dimension | Structural meaning |
|---|---|---|
| Column space $C(A)$ | $r$ | loads the truss can carry |
| Left null space $N(A^{\mathsf{T}})$ | $d - r$ | mechanisms (wobble modes) — must be $0$ for safety |
| Null space $N(A)$ | $b - r$ | self-stress states (redundancy) |
| Row space $C(A^{\mathsf{T}})$ | $r$ | required bar-force patterns |
This is why the four fundamental subspaces deserve their billing as the organizing framework. The same diagram that told a data scientist their regression's degrees of freedom (Case Study 1), and that encodes the loops of an electrical circuit (§14.6), here decides whether a bridge stands or falls. Rank is not an arithmetic curiosity; it is a structural reality you can stand on — or, if the rank falls short, one that falls out from under you. And the same rank-nullity bookkeeping, with the right angles of §14.10 made rigorous in Part IV, will reappear when we solve such systems by least squares and study the stiffness matrices whose eigenvalues (Part V) reveal a structure's natural vibration modes.