Case Study 26.2 — Boom and Bust: Complex Eigenvalues in Population and Business Cycles
Field: ecology & economics (non-physics). Why it matters: lynx and hare populations rise and fall in lockstep cycles; so do inventories, employment, and prices. Behind every such cycle is a matrix with complex eigenvalues, and its modulus decides whether the cycle settles, sustains, or spirals out of control.
The problem
In the Canadian boreal forest, the snowshoe hare population booms, then the lynx that eat them boom a year or two later, then the hares crash from over-predation, then the lynx starve and crash in turn — and the whole cycle repeats, roughly every ten years, a pattern documented for over a century in Hudson's Bay Company fur-trapping records. The same shape appears far from the forest: a factory overproduces, inventories pile up, production is cut, shortages emerge, production ramps again — the inventory cycle that ripples through economies. Wages, hiring, and prices oscillate for kindred reasons. These are cyclic dynamical systems, and the question an ecologist or an economist asks is the one this chapter answers: will the cycle damp out toward a steady state, persist as a stable rhythm, or amplify into a crash?
Near an equilibrium — a population balance, an economic steady state — the system is well approximated by a linear model $\mathbf{x}_{n+1} = A\mathbf{x}_n$, where $\mathbf{x}_n$ measures the deviations from equilibrium (say, how far the hare and lynx populations are above or below their balance point in year $n$). The matrix $A$ is the community matrix (ecology) or the dynamic-response matrix (economics). Everything about the cycle's fate is encoded in the eigenvalues of $A$ — and for an oscillating system, those eigenvalues are a complex conjugate pair.
A predator–prey model and its complex eigenvalues
Let $\mathbf{x}_n = (h_n, \ell_n)$ be the deviations of the hare ($h$) and lynx ($\ell$) populations from equilibrium in year $n$. A simple linearized model of the interaction is $$\mathbf{x}_{n+1} = A\mathbf{x}_n, \qquad A = \begin{bmatrix} 1.0 & -0.4 \\ 0.3 & \phantom{-}1.0 \end{bmatrix}.$$ Read the entries as feedbacks. The $-0.4$ in the top row says more lynx this year means fewer hares next year (predation suppresses prey). The $+0.3$ in the bottom row says more hares this year means more lynx next year (abundant prey feeds predators). The diagonal $1.0$s are each species persisting from one year to the next. This push–pull — predators chasing prey, prey feeding predators — is exactly the structure that produces rotation in the population phase plane, and so we expect complex eigenvalues.
# A linearized predator-prey model: complex eigenvalues mean a population cycle.
import numpy as np
A = np.array([[1.0, -0.4],
[0.3, 1.0]])
ev = np.linalg.eigvals(A)
pos = ev[ev.imag > 0][0]
r, theta_deg = abs(pos), np.degrees(np.angle(pos))
print("eigenvalues :", np.round(ev, 4))
print("modulus r :", round(r, 4), " (>1: cycle amplifies)")
print("angle (deg) :", round(theta_deg, 4))
print("years/cycle :", round(360 / theta_deg, 1))
print("discriminant:", round(np.trace(A)**2 - 4*np.linalg.det(A), 4))
eigenvalues : [1.+0.3464j 1.-0.3464j]
modulus r : 1.0583 (>1: cycle amplifies)
angle (deg) : 19.1066
years/cycle : 18.8
discriminant: -0.48
The eigenvalues are the complex conjugate pair $1 \pm 0.3464i$. The negative discriminant ($-0.48$) confirms what the structure suggested: this system rotates — it cycles. And the two numbers inside the eigenvalue tell the whole story:
- Argument $\theta \approx 19.1°$ per year. Since $360°/19.1° \approx 18.8$, one full boom-and-bust cycle takes about $19$ years. The argument is the clock of the cycle: it sets how fast the populations sweep around their phase-plane orbit, and hence the period between successive peaks.
- Modulus $r \approx 1.058$. Because $r > 1$, each cycle the oscillation grows by about $5.8\%$. The booms get boomier and the busts get bustier; the cycle is unstable, spiraling outward away from equilibrium until some nonlinearity (starvation, carrying capacity) eventually caps it. This is the linear model warning us that the equilibrium is not self-correcting.
The cycle, seen in the phase plane
It helps to picture why these populations cycle rather than simply rising or falling together. Plot the state not against time but as a point $(h, \ell)$ in the phase plane — hare deviation on one axis, lynx deviation on the other. A complex-eigenvalue system sends this point around a loop, and the loop tells the ecological story directly. Start at the right of the plane: hares are abundant, lynx near average. With plenty of prey, lynx numbers climb — the point moves up. Now both are high, but the abundant lynx over-hunt, so hares crash — the point swings left. With prey scarce, lynx starve and fall — the point drops. With few predators left, hares rebound — and the point returns to the right, completing one loop. Each lap of the phase-plane orbit is one boom-and-bust cycle, and the eigenvalue's argument $\theta \approx 19°$ is precisely how far around that loop the system travels each year. The lynx peak lags the hare peak by a quarter-loop, which is the famous observation from the fur-trapping data that predator booms trail prey booms — a fact that falls straight out of the rotation the complex eigenvalue encodes.
Whether the loop is a tightening inward spiral, a fixed closed orbit, or a widening outward spiral is decided, as always, by the modulus. Our model's $r \approx 1.058 > 1$ makes the loop spiral outward: each cycle's peaks and troughs are more extreme than the last. In reality, no population grows without bound — eventually hares exhaust their food or lynx hit a floor — so the true nonlinear system's outward spiral gets caught and bent into a stable closed orbit called a limit cycle. But the linear model's complex eigenvalue still does its job: it tells us the equilibrium is not a quiet resting point the system returns to, but a center the system perpetually circles, with the modulus warning us which way the spiral tends. That diagnostic — equilibrium that repels into oscillation versus one that attracts and damps — is exactly what the sign of $|\lambda| - 1$ reports.
Tuning the modulus: stable, sustained, or runaway
The power of the eigenvalue picture is that it turns a vague question — "is this cycle dangerous?" — into a precise one: is the modulus above, at, or below $1$? Three regimes, exactly the spiral trichotomy of §26.3.1:
- $r < 1$ — damped cycle (stable). Oscillations shrink each period and the system settles back to equilibrium after a few diminishing swings. A resilient ecosystem or a self-correcting market.
- $r = 1$ — sustained cycle (marginal). Oscillations neither grow nor shrink; the system orbits a perpetual cycle, like the idealized lynx–hare rhythm. This is the knife-edge between stability and instability.
- $r > 1$ — amplifying cycle (unstable). Oscillations grow each period until the linear model breaks down — booms and busts of increasing violence. A fragile system headed for a crash.
Suppose a wildlife manager could nudge the interaction strengths — by protecting a fraction of hares from predation, say, which weakens the off-diagonal coupling. Watch what a small change does to the modulus:
# Weakening the predator-prey coupling pulls the modulus below 1: a damped cycle.
import numpy as np
A_managed = np.array([[0.90, -0.4],
[0.30, 0.95]]) # added self-limiting terms on the diagonal
ev = np.linalg.eigvals(A_managed)
pos = ev[ev.imag > 0][0]
print("eigenvalues :", np.round(ev, 4))
print("modulus r :", round(abs(pos), 4), " (<1: cycle now damps out)")
print("angle (deg) :", round(np.degrees(np.angle(pos)), 4))
eigenvalues : [0.925+0.3455j 0.925-0.3455j]
modulus r : 0.9874 (<1: cycle now damps out)
angle (deg) : 20.4817
By adding modest self-limiting terms to the diagonal (each population now slightly suppresses its own excess — density dependence, in ecological language), the modulus drops from $1.058$ to $0.987$, crossing below $1$. The cycle still has nearly the same period (the argument barely changed, $\approx 20°$), but it now damps: the same boom-and-bust shape, but each swing smaller than the last, converging to a stable equilibrium. The manager has not abolished the cycle — that would be neither possible nor desirable — but has stabilized it. Stabilizing a cyclic system is the act of pushing its dominant eigenvalue's modulus below $1$, and the eigenvalue is what tells you how close to the edge you are.
The same mathematics, in an economy
Swap the labels and the model is macroeconomics. Let $\mathbf{x}_n$ be the deviations of output and inventory from their equilibrium levels. Excess inventory this quarter suppresses production next quarter (a negative off-diagonal feedback); high production this quarter builds inventory next quarter (a positive one) — structurally identical to predator and prey. The result is the inventory cycle, a complex eigenvalue pair whose argument sets the cycle length (a few years) and whose modulus decides whether the economy self-corrects after a shock or oscillates with growing amplitude toward instability. When a central bank adjusts interest rates to "dampen the business cycle," it is, in the language of this chapter, trying to drag the modulus of the dominant eigenvalue below $1$ — to turn a runaway spiral into a damped one. The same eigenvalue arithmetic governs population dynamics in the boreal forest and monetary policy in a central bank.
Connecting back and forward
This is the same eigenvalue-driven long-run analysis you will sharpen in Markov chains, where a stochastic matrix's largest eigenvalue governs the system's eventual behavior — there the dominant eigenvalue is exactly $1$ (probabilities are conserved), and the sub-dominant eigenvalues, often complex, control the oscillating transient as the chain settles toward its steady state. Here the dominant eigenvalue is itself complex, and its modulus is the whole question. The connective tissue is the central theme of Part V: a matrix's eigenvalues reveal its essential long-run behavior, stripped of the particular starting state. For a cyclic system, that behavior is a spiral, and the complex eigenvalue $re^{i\theta}$ reports its two defining features at a glance — the period of the cycle (from $\theta$) and whether it lives, dies, or explodes (from $r$). Read those two numbers, and you have read the fate of the system.