Models for Population Dynamics

Numerical simulation almost always runs on continuous models — descriptions built from real-valued quantities that vary smoothly rather than jumping between discrete states. The reason is practical: once a quantity is real-valued and smooth, the whole apparatus of calculus becomes available, and calculus is what lets us write down how fast something is changing and then solve for its behavior over time.

Continuous models split into two classes, separated by a single question — does space matter?

  • Space is ignored. The model tracks only how quantities evolve over time. This produces an ordinary differential equation (ODE): every derivative is taken with respect to the one independent variable, time.
  • Space is resolved. The model tracks how quantities vary from place to place, not just over time. This produces a partial differential equation (PDE), with derivatives along each spatial direction entering alongside the time derivative.

An epidemic makes the split concrete. If all we care about is how many people are infected as the weeks pass, a headcount-over-time model is enough — and that is an ODE. But if the outbreak’s behavior depends on where it is unfolding — a dense city versus quiet countryside, one region locked down while its neighbor is not — then geography has to enter the model, and we need a PDE. COVID-19 was studied both ways, for exactly this reason.

Population dynamics — the study of how populations grow or decay over time — is the standard example of the ODE side, and the subject of this page. It has a long tradition in both biology and mathematics. A population is, strictly speaking, a count of discrete things: bacteria in a culture, animals in a habitat, people in a country, all of which come in whole numbers. The model nonetheless treats that count as a continuous, real-valued quantity — and that approximation is what buys us calculus. We will see shortly that an honest discrete model and the continuous one agree closely enough that the convenience costs almost nothing.

Two regimes are studied, in order of difficulty. The first is a population in isolation: a single species with no external influences, no interference, no competition imposed from outside — just the population and its own internal growth and decay. The second is coexistence: several species sharing an environment and influencing one another, whether peacefully (mutual benefit) or with hostility (one species preying on another, or two competing for the same resources). This page builds the single-species case first; multiple interacting species come afterward.

The hostile case has, in a sense, already appeared. The arms race of two superpowers introduced earlier is mathematically a two-”species” model — military budgets standing in for headcounts, escalating and restraining one another through the same kind of coupled ODEs — and it returns later on this page as a worked example.

The starting point for everything that follows is the oldest and simplest one-species model, introduced by Thomas Malthus in 1798.

The Malthus model

Malthus’s model is deliberately minimal. It follows a single species PP and tracks just one quantity: the number of individuals p(t)p(t) alive at time tt. It is worth being clear about what p(t)p(t) is and isn’t. It is the size of the population at the instant tt, the running headcount — not the number of newcomers, and not a rate of change. Everything the model predicts is the behavior of this one number as time runs.

The model is built from three rates.

For a single species, the birth rate γ\gamma is the number of offspring produced per individual per unit of time, and the death rate δ\delta is the number of individuals lost per individual per unit of time. Their difference is the growth rate

λ=γδ,\lambda = \gamma - \delta,

the net number of individuals gained per individual per unit of time. It is positive when births outpace deaths and negative when deaths win.

A concrete reading: if each rabbit produces on average γ=0.1\gamma = 0.1 offspring per day, while rabbits are lost at δ=0.02\delta = 0.02 per rabbit per day, the population grows at λ=0.08\lambda = 0.08 per rabbit per day. The crucial word is per rabbit — each rate measures one individual’s worth of reproduction or loss. To get the behavior of the whole population, we still have to multiply by how many individuals are actually there. Malthus’s one modeling assumption is that all three rates are constant — they never drift, no matter how large the population grows or how much time passes.

So picture standing at time tt with p(t)p(t) individuals, and ask what the population will be once a small time step Δt\Delta t has elapsed. The new headcount is the old one plus whatever was gained in between:

p(t+Δt)=p(t)+λp(t)Δtp(t + \Delta t) = p(t) + \lambda \cdot p(t) \cdot \Delta t

Read the change term λp(t)Δt\lambda \cdot p(t) \cdot \Delta t as a product of three plain quantities: λ\lambda is the net change per individual per unit time, p(t)p(t) is how many individuals are contributing, and Δt\Delta t is how long they contribute for. Rate times headcount times elapsed time gives a number of individuals. This is what “growth is proportional to population size and time” means — double the population and the change doubles; double the interval and it doubles again. And note the change term is a count of new individuals, separate from p(t)p(t), which is the running total they get added to.

This difference equation only tells us the population at instants spaced a step Δt\Delta t apart. To get a model that holds at every instant, we shrink that step toward zero, and the relation collapses into a differential equation.

The Malthus model describes a single species with constant growth rate λ\lambda. Its population p(t)p(t) satisfies the ODE

p˙(t)=λp(t),\dot{p}(t) = \lambda\, p(t),

with initial condition p(0)=p0p(0) = p_0. The solution is the exponential

p(t)=p0eλt.p(t) = p_0\, e^{\lambda t}.
From the difference equation to the ODE

Start from the difference equation and subtract p(t)p(t) from both sides, isolating the change on its own:

p(t+Δt)p(t)=λp(t)Δtp(t + \Delta t) - p(t) = \lambda\, p(t)\, \Delta t

Divide both sides by the time step Δt\Delta t:

p(t+Δt)p(t)Δt=λp(t)\frac{p(t + \Delta t) - p(t)}{\Delta t} = \lambda\, p(t)

The left-hand side is now a difference quotient, the average rate of change of pp across the interval [t,t+Δt][t,\, t + \Delta t]. The derivative of pp is defined as exactly this quotient in the limit of a vanishing time step:

p˙(t)=limΔt0p(t+Δt)p(t)Δt\dot{p}(t) = \lim_{\Delta t \to 0} \frac{p(t + \Delta t) - p(t)}{\Delta t}

So letting Δt0\Delta t \to 0 turns the left-hand side into p˙(t)\dot{p}(t) by definition. This is not a free choice of limit; it is the one limit that converts an average rate over an interval into the instantaneous rate at a point. The right-hand side λp(t)\lambda\, p(t) carries no Δt\Delta t, so the limit leaves it untouched. What remains is the Malthus ODE,

p˙(t)=λp(t).\dot{p}(t) = \lambda\, p(t).

The differential equation p˙=λp\dot{p} = \lambda p, which says a quantity’s rate of change is proportional to the quantity itself, is one of the most familiar in all of mathematics. Its solution is known outright, with no derivation work needed, which is why the exponential above can simply be written down.

Verify the solution by substitution

We can confirm p(t)=p0eλtp(t) = p_0\, e^{\lambda t} without solving anything — just substitute it back into both requirements. Differentiating with respect to tt, the chain rule brings the λ\lambda down in front:

p˙(t)=p0λeλt=λ(p0eλt)=λp(t),\dot{p}(t) = p_0\, \lambda\, e^{\lambda t} = \lambda \cdot \big(p_0\, e^{\lambda t}\big) = \lambda\, p(t),

so the ODE is satisfied. And at t=0t = 0,

p(0)=p0e0=p0,p(0) = p_0\, e^{0} = p_0,

so the initial condition is satisfied too. Both checks pass, so this is the solution. As for why the exponential turns up at all: eλte^{\lambda t} is the function that reproduces itself under differentiation, up to the factor λ\lambda, which is exactly what p˙=λp\dot{p} = \lambda p asks for.

The sign of the growth rate decides everything:

  • λ>0\lambda > 0: births outpace deaths, and p(t)=p0eλtp(t) = p_0\, e^{\lambda t} grows exponentially — not merely upward, but with an ever-steepening climb, doubling again and again over equal stretches of time.
  • λ<0\lambda < 0: deaths win, and the population decays exponentially, sinking toward zero.
  • λ=0\lambda = 0: births and deaths exactly cancel, and the population sits forever at its starting value p0p_0.
p(t)=p0eλtp(t) = p_0\, e^{\lambda t}

The figure shows all three at once, every curve started from the same population p0p_0. With λ>0\lambda > 0 the curve soars, steepening as it climbs; with λ<0\lambda < 0 it sinks toward zero; with λ=0\lambda = 0 it holds flat. Nothing but the sign of λ\lambda separates a population that explodes from one that vanishes.

This is the model’s defining feature and equally its weakness: the behavior is purely exponential, and exponential change is violent — extremely fast growth or decay with nothing to temper it. Two limitations stand out. On the growth side, p0eλtp_0\, e^{\lambda t} rises without any ceiling, yet no real population grows forever: food, space, and other resources are finite, and sooner or later they bite. The refinements later on this page exist precisely to put a brake on this runaway growth.

On the decay side the flaw is subtler. An exponential with λ<0\lambda < 0 keeps shrinking toward zero without ever reaching it — the model would send a population of five rabbits through 0.30.3 of a rabbit, then 0.010.01, and onward forever. A real population is a whole-number count: five rabbits, then four, then — possibly — none at all. Treating the headcount as a continuous, real-valued quantity is exactly what made calculus available, but the price is that the model cannot represent the integer steps a population truly takes, nor outright extinction. Populations are discrete; the model is continuous, and this gap is the cost of that convenience.

A discrete model?

The derivation behind the Malthus model was, start to finish, a continuous one: we wrote down a difference equation, shrank the time step to zero, and handed the problem to calculus. That move sits a little uneasily next to something we already conceded: a population is a count of whole individuals, not a quantity that varies smoothly. So it is fair to push back. If the thing being modeled is inherently discrete, can we build a model that stays discrete throughout, never taking a limit at all? And if we can, does it disagree with the continuous one?

It turns out we can, and the discrete model rests on a single assumption — the very one Malthus made, only rephrased so that no rate of change appears in it. A constant growth rate and a fixed doubling time are two ways of saying the same thing: if a population grows by the same proportion in every equal stretch of time, then the time it needs to double is always the same.

The doubling time τ\tau of a growing population is the time the population takes to double in size. When the growth rate is constant, this time is constant too: the population doubles over equal stretches of time no matter how large it has already grown — going from 100100 to 200200 individuals takes exactly as long as going from 10001000 to 20002000.

Why a constant growth rate fixes the doubling time

Take the Malthus solution p(t)=p0eλtp(t) = p_0\, e^{\lambda t} with λ\lambda constant. Counting from any instant tt, the population has doubled once it reaches 2p(t)2\,p(t), at some later instant t+τt + \tau:

p(t+τ)=2p(t).p(t + \tau) = 2\,p(t).

Substitute the exponential on both sides:

p0eλ(t+τ)=2p0eλt.p_0\, e^{\lambda(t + \tau)} = 2\,p_0\, e^{\lambda t}.

Dividing through by p0eλtp_0\, e^{\lambda t} collapses this to

eλτ=2.e^{\lambda \tau} = 2.

The instant tt has cancelled out completely. Wherever you start counting from, and whatever the population happens to be then, the doubling condition is identical, so the same τ\tau works everywhere. Taking logarithms gives λτ=ln2\lambda \tau = \ln 2, the relation between the two constants that returns below.

So take “the population doubles every τ\tau years” as the founding rule and follow it forward in steps of τ\tau. Starting from p0p_0 individuals at time t=0t = 0:

  • after τ\tau years the population has doubled once, reaching 2p02\,p_0;
  • after 2τ2\tau years it has doubled twice, reaching 4p04\,p_0;
  • after kτk\tau years it has doubled kk times, reaching 2kp02^k\, p_0.

Writing p(kτ)p(k\tau) for the population after kk doublings, the whole model is one line:

p(kτ)=2kp0.p(k\tau) = 2^k\, p_0.

There is no differential equation here, no limit, no calculus — only repeated doubling, indexed by the whole number kk. To set it next to Malthus’s p(t)=p0eλtp(t) = p_0\, e^{\lambda t}, all that is missing is to write this same rule with a base of ee rather than a base of 22, which is a matter of algebra and not of modeling:

p(kτ)=p0eλ(kτ),λ=ln2τ.p(k\tau) = p_0\, e^{\lambda\,(k\tau)}, \qquad \lambda = \frac{\ln 2}{\tau}.
Rewriting the doubling rule as an exponential

The rule p(kτ)=2kp0p(k\tau) = 2^k\, p_0 is already complete; rewriting it with base ee changes how it looks, not what it says. Since 2=eln22 = e^{\ln 2},

2k=(eln2)k=ekln2.2^k = \big(e^{\ln 2}\big)^k = e^{k \ln 2}.

The exponent kln2k \ln 2 counts doublings, but the quantity we want to read off is the elapsed time kτk\tau. Multiplying the exponent by τ/τ\tau / \tau, which is just 11, makes kτk\tau appear as a single block:

kln2=ln2τ(kτ).k \ln 2 = \frac{\ln 2}{\tau}\,(k\tau).

Therefore

p(kτ)=p0eln2τ(kτ).p(k\tau) = p_0\, e^{\frac{\ln 2}{\tau}\,(k\tau)}.

Naming the constant that multiplies kτk\tau as λ=ln2/τ\lambda = \ln 2 / \tau puts the model in its final form, p(kτ)=p0eλ(kτ)p(k\tau) = p_0\, e^{\lambda\,(k\tau)}. The only facts used were 2=eln22 = e^{\ln 2} and a multiplication by 11.

Now set the two models side by side. The continuous Malthus model gives p(t)=p0eλtp(t) = p_0\, e^{\lambda t}; the discrete model gives p(kτ)=p0eλ(kτ)p(k\tau) = p_0\, e^{\lambda\,(k\tau)}. These are the same function of time. The discrete model has simply restricted where that function is allowed to be read.

That restriction is the one real difference between them, and it is worth stating plainly. The discrete model is defined only on a grid of times, t=0, τ, 2τ, 3τ, t = 0,\ \tau,\ 2\tau,\ 3\tau,\ \dots, spaced one doubling time apart. With a doubling time of τ=17\tau = 17 years, for instance, it speaks about the population in year 00, year 1717, year 3434, year 5151, and so on, and has nothing at all to say about year 2525, which is not a grid point. The continuous model, handed the same λ\lambda, returns a value at every real time tt, the instants between the grid points included.

The two are joined in the natural way. Stop treating kτk\tau as a whole number of completed doublings and instead let it range over every non-negative real value tt, and p0eλ(kτ)p_0\, e^{\lambda\,(k\tau)} becomes p0eλtp_0\, e^{\lambda t}, the Malthus solution exactly. Filling in the instants between the grid points is the whole of what separates the discrete model from the continuous one.

This is a reassuring outcome. Two genuinely different starting points — one continuous and built on calculus, the other discrete and built on plain counting — converge on the very same formula. The continuous model is not a distortion accepted for the convenience of calculus; it is the natural interpolation of the discrete picture, the smooth curve threaded through the grid points that the discrete model pins down. That agreement is what lets us lean on continuous models for the rest of this page with a clear conscience.

An aside: interest rates

The exponential p0eλtp_0\, e^{\lambda t} that the Malthus model produced is worth pausing on, because it is not really a fact about populations at all. It is a fact about constant proportional growth: any quantity that grows by a fixed fraction of itself in each equal stretch of time obeys an exponential of exactly this shape. A population is one instance. Money in an interest-bearing bank account is another, and it turns out to be governed by the very same equation. The short detour through it is worth taking, because it makes a point that runs through all of modeling: a model is a mathematical structure, and one and the same structure can describe situations that have nothing physical in common.

Start with a principal KK, an initial sum of money placed in an account, and suppose the bank offers a nominal interest rate of RR percent per year. It is tidier to carry the rate as a plain fraction than as a percentage, so write

r=R100,r = \frac{R}{100},

turning a quoted rate of R=5%R = 5\% into r=0.05r = 0.05.

If the bank pays interest just once a year, each year multiplies the balance by 1+r1 + r. One year on, the account holds K(1+r)K(1 + r); the year after, K(1+r)2K(1 + r)^2; and after nn years,

K(1+r)n.K\,(1 + r)^{n}.

Often, though, interest is added more than once a year — this is compound interest, the arrangement in which interest already credited goes on to earn interest of its own. Compounding monthly slices the annual rate into twelve equal parts of r/12r/12 and applies one each month, which over nn years is 12n12n separate steps:

K(1+r12)12n.K\left(1 + \frac{r}{12}\right)^{12n}.

Compounding daily slices the year into 365365 steps of r/365r/365 apiece, for 365n365n steps across nn years:

K(1+r365)365n.K\left(1 + \frac{r}{365}\right)^{365n}.

The pattern is plain: compounding more often means more steps, each one smaller. Carry that to its limit. Let NN be the number of compounding steps per year and let NN \to \infty, so that interest is credited neither monthly nor daily but continuously, in infinitely many infinitely small installments. The balance after nn years is then a limit:

limNK(1+rN)Nn=Kern.\lim_{N \to \infty} K\left(1 + \frac{r}{N}\right)^{Nn} = K\, e^{rn}.

This limiting arrangement is called continuous compounding.

Why the limit gives an exponential

The whole step rests on one standard limit, itself one of the ways the exponential function is defined:

ex=limm(1+xm)m.e^{x} = \lim_{m \to \infty} \left(1 + \frac{x}{m}\right)^{m}.

Our expression is not quite in that shape. Its base carries the fraction r/Nr/N while its exponent is NnNn, whereas the standard limit needs one and the same symbol in the fraction’s denominator and in the exponent. So make the two agree. Multiply r/Nr/N above and below by nn, which changes nothing since n/n=1n/n = 1:

rN=rnNn.\frac{r}{N} = \frac{r\,n}{N\,n}.

The balance after nn years now reads

K(1+rnNn)Nn.K\left(1 + \frac{r\,n}{N\,n}\right)^{Nn}.

Write m=Nnm = Nn for the total number of compounding steps taken across the whole nn years. Sending NN \to \infty sends mm \to \infty along with it, and the balance becomes

K(1+rnm)m.K\left(1 + \frac{r\,n}{m}\right)^{m}.

This is the standard limit exactly, with x=rnx = rn. As mm \to \infty the bracket tends to erne^{rn}, so the balance under continuous compounding is KernK\, e^{rn}.

Now set this beside Malthus. Continuous compounding grows a principal to KernK\, e^{rn} after nn years; the Malthus model grows a population to p0eλtp_0\, e^{\lambda t} after time tt. These are the same formula. The principal KK stands exactly where the starting population p0p_0 stood, the interest rate rr where the growth rate λ\lambda stood, and the elapsed years nn where the time tt stood. A continuously compounded bank account is, in every mathematical respect, a Malthusian population: money “reproduces” at a constant rate per unit held, just as Malthus’s individuals do, and it grows just as relentlessly, with no ceiling anywhere to slow it down. That is a comfortable arrangement for whoever is collecting the interest, and the banks have long known it.

Because the two models are identical, every consequence of one is a consequence of the other, the doubling time included. How long must a sum sit before it is worth twice the original KK? Under annual compounding the balance has doubled once K(1+r)τ=2KK(1 + r)^\tau = 2K; dividing by KK and taking logarithms,

τ=ln2ln(1+r).\tau = \frac{\ln 2}{\ln(1 + r)}.

Under continuous compounding the doubling condition is Kerτ=2KK\, e^{r\tau} = 2K instead, and the same two moves give

τ=ln2r.\tau = \frac{\ln 2}{r}.

This last one is precisely the population relation λτ=ln2\lambda \tau = \ln 2 from before, now with rr playing the part of λ\lambda.

The two formulas look different, but for the modest rates a bank actually pays they very nearly agree, and both fold into a rule simple enough to do in your head. For small rr the logarithm ln(1+r)\ln(1 + r) sits very close to rr itself: at r=0.05r = 0.05 it equals 0.04880.0488, barely different, so the annual-compounding τ\tau all but lands on the continuous one. And ln2=0.693\ln 2 = 0.693\ldots is near enough to 0.70.7 that

τ0.7r=70R,\tau \approx \frac{0.7}{r} = \frac{70}{R},

the final step using r=R/100r = R/100. This is the rule of 70: to get the doubling time in years, divide 7070 by the interest rate written as a percentage. A balance at R=7%R = 7\% doubles in about a decade; at R=2%R = 2\% it takes about 3535 years. And since the population model is the same model, the shortcut carries over to it unchanged — a species growing at 2%2\% a year doubles roughly every 3535 years.

Is exponential growth realistic?

The Malthus model commits a population to pure exponential growth, climbing without limit for as long as time runs. Before refining it, the blunt question is worth asking head-on: does any real population behave like that? The honest answer is for a while, yes — but not forever.

Over a bounded stretch of time, real data can follow an exponential almost exactly. The standard illustration is world population between 1700 and 1961: across those two and a half centuries it tracked an exponential closely, at an annual growth rate of about 0.020.02 (around 2%2\%), which by the rule of 70 means the population doubled roughly every 3535 years, or 34.6734.67 to be precise. That clean fit is partly a fluke of the window. The period itself was anything but uniform — wars and the 1918 influenza pandemic held growth back while the industrial revolution pushed it forward — and the curve looks smoothly exponential only because those opposing forces happened to roughly cancel.

Stretch the window, though, and the exponential always fails. A steady 2%2\% rate would have doubled world population yet again by around 1996; it did not. No population grows without bound, and the reason is the one thing the Malthus model leaves out entirely: resources are finite. Food, water, space, air — none of them is unlimited, and as a population swells, its members compete ever harder for a supply that does not grow with them. That competition acts as a brake, dragging the growth rate down. So in general exponential growth is not realistic, and the next refinement is built precisely to give a population a ceiling it approaches rather than a climb that never ends.

A first refinement: Verhulstian saturation

The Malthus model came with a verdict attached: a real population tracks its exponential for a while, then finite resources intervene and growth has to slow. A model meant to be realistic has to build that slowdown in. The first refinement that does so is due to Pierre-François Verhulst and his contemporaries, working in the 19th century, and its organizing idea is saturation — growth that eases off as a population fills its environment, levelling out at a finite saturation limit rather than climbing without end.

The Malthus model cannot produce that behavior, and the reason traces to a single assumption: its growth rate is constant, pinned at one value whether the population is sparse or desperately overcrowded. That is the assumption Verhulst overturns.

In the Malthus model the birth rate γ\gamma and the death rate δ\delta were fixed numbers. Verhulst lets each one respond to the population itself: the more crowded the habitat, the harder reproduction becomes and the more dangerous life gets. The simplest way to build that in is to let each rate fall or rise along a straight line as the population changes.

The Verhulstian saturation refinement replaces the constant birth and death rates of the Malthus model with linear birth and death rates — each one a linear function of the current population p(t)p(t):

γ(t)=γ0γ1p(t),δ(t)=δ0+δ1p(t).\gamma(t) = \gamma_0 - \gamma_1\, p(t), \qquad \delta(t) = \delta_0 + \delta_1\, p(t).

The baseline rates γ0\gamma_0 and δ0\delta_0 are the values the rates take at vanishing population, and the coefficients γ1\gamma_1 and δ1\delta_1 measure how strongly the population feeds back on each rate. The four constants are required to satisfy

γ0>δ0>0,γ1,δ1>0,\gamma_0 > \delta_0 > 0, \qquad \gamma_1, \delta_1 > 0,

so that a crowded population breeds slower and dies faster, while a sparse one still grows.

Each rate is a constant baseline plus a term strictly proportional to p(t)p(t), with no curvature and no higher powers. What those proportional terms do depends entirely on their sign, and the two signs are deliberately opposite:

  • the birth rate carries a minus sign, γ0γ1p(t)\gamma_0 - \gamma_1\, p(t), so a larger population lowers it — a crowded habitat reproduces less per unit of time;
  • the death rate carries a plus sign, δ0+δ1p(t)\delta_0 + \delta_1\, p(t), so a larger population raises it — competition for finite food, water, and space makes a crowded habitat deadlier.

Both effects pull in the same direction: they brake growth. As p(t)p(t) climbs, γ(t)\gamma(t) slides down while δ(t)\delta(t) rises, and the gap between them — the surplus of births over deaths that drives the population upward — keeps narrowing.

Those sign conditions are not arbitrary. That γ1\gamma_1 and δ1\delta_1 are positive is exactly what makes the feedback a brake and not an accelerator: a growing population then loses births and gains deaths, rather than the reverse. And γ0>δ0\gamma_0 > \delta_0 makes the baseline birth rate beat the baseline death rate, so a small, uncrowded population still grows — without that, the population could only ever decline, leaving no saturation to speak of, just a slow slide to extinction.

The rates have also changed in their bookkeeping. In the Malthus model the birth and death rates were counted per individual — offspring per individual per unit of time — and the population’s total change was recovered by multiplying by the headcount p(t)p(t). Verhulst’s γ(t)\gamma(t) and δ(t)\delta(t) are counted for the population as a whole instead: births and deaths per unit of time across the entire population, with the “per individual” dropped. It is a small change in what the symbols measure, but it changes how they assemble into an equation of motion for p(t)p(t), which is the next step.

With the rates set up this way, the population can no longer run away. As it grows the braking strengthens, with γ(t)\gamma(t) falling and δ(t)\delta(t) rising, until the two rates meet. At that population the births exactly offset the deaths, the net growth drops to zero, and the population stops changing. That balance point is a finite, positive number, and it is the saturation limit the whole refinement was built to produce — it has a name.

The carrying capacity KK of a saturating population is the saturation limit it approaches as time runs on, limtp(t)=K\lim_{t \to \infty} p(t) = K. It is the population size at which the falling birth rate and the rising death rate coincide, so that births balance deaths and growth halts. The carrying capacity is finite and strictly positive,

0<K<,0 < K < \infty,

which is exactly the statement that the population neither grows without bound nor dwindles to nothing — it settles at a ceiling, and that ceiling lies above zero.

So the refinement amounts to a single substitution — the constant rates of Malthus become linear ones — and everything else follows from it. What that substitution does to the population over time is not visible yet: the linear rates still have to be folded into a differential equation for p(t)p(t), and that equation solved. Doing so is the next step, and the solution will also return an explicit formula for KK built from the four constants, turning the bare claim that a carrying capacity exists into an actual number.

Can the birth rate go negative?

The formula γ(t)=γ0γ1p(t)\gamma(t) = \gamma_0 - \gamma_1\, p(t), taken at face value, keeps falling as the population grows: past zero, and on into negative numbers, once p(t)p(t) is large enough. A negative birth rate is nonsense — nothing produces a negative number of offspring — so it is worth seeing why the model never actually lands there.

The argument needs only the constants’ signs. The birth rate is really a function of how many individuals there are, not of the clock: at a population of size pp, it equals γ0γ1p\gamma_0 - \gamma_1\, p, and the death rate equals δ0+δ1p\delta_0 + \delta_1\, p. At the carrying capacity the population stops growing, so births and deaths exactly balance once the population reaches the size KK:

γ0γ1K=δ0+δ1K.\gamma_0 - \gamma_1\, K = \delta_0 + \delta_1\, K.

The right-hand side is a sum of positive numbers, hence strictly positive — so the left-hand side, the birth rate at population KK, is strictly positive too. It is not zero but a genuine positive number. At any population smaller than KK the birth rate γ0γ1p\gamma_0 - \gamma_1\, p is larger still, since a smaller population subtracts less from γ0\gamma_0. So across the whole range a saturating population occupies, from a sparse start up to its ceiling KK, the birth rate stays comfortably positive. It would fall to zero only once the population reached the size γ0/γ1\gamma_0 / \gamma_1, and since the rate is still positive at KK and keeps decreasing beyond it, that size lies somewhere past KK, among populations too large for the environment to sustain — sizes a saturating population drifts away from rather than toward.

The saturation equation

The linear birth and death rates describe how fast a population reproduces and dies, but they are not yet a model: on their own they say nothing about how the population moves. Turning them into an equation of motion for p(t)p(t) is the short step this section takes — short, because most of the work was already done for Malthus.

Recall how the Malthus model was assembled, because the step here mirrors it. There the birth and death rates were counted per individual, so the population’s change over an interval had to be scaled up by the headcount p(t)p(t) before it meant anything. The linear rates are bookkept differently, as noted when they were introduced: γ(t)\gamma(t) and δ(t)\delta(t) already count births and deaths for the whole population per unit of time. With the headcount thus baked in, building a difference equation and passing to the limit — the route already taken for Malthus — leaves the rate of change as births minus deaths outright, with no p(t)p(t) factor anywhere:

p˙(t)=γ(t)δ(t).\dot p(t) = \gamma(t) - \delta(t).
From the difference equation to the ODE

The derivation runs just as it did for the Malthus model, only with the new rates. Stand at time tt with p(t)p(t) individuals and step forward by a small interval Δt\Delta t. Across that interval the whole population produces γ(t)Δt\gamma(t)\, \Delta t births and suffers δ(t)Δt\delta(t)\, \Delta t deaths — each rate is already a population-wide count per unit of time, so it is simply multiplied by the elapsed time, with no headcount factor needed. After the step, the population is the old count adjusted by both:

p(t+Δt)=p(t)+γ(t)Δtδ(t)Δtp(t + \Delta t) = p(t) + \gamma(t)\, \Delta t - \delta(t)\, \Delta t

Subtract p(t)p(t) to isolate the change, and collect the two rate terms:

p(t+Δt)p(t)=(γ(t)δ(t))Δtp(t + \Delta t) - p(t) = \big(\gamma(t) - \delta(t)\big)\, \Delta t

Divide both sides by the time step Δt\Delta t:

p(t+Δt)p(t)Δt=γ(t)δ(t)\frac{p(t + \Delta t) - p(t)}{\Delta t} = \gamma(t) - \delta(t)

The left-hand side is the difference quotient of pp across [t,t+Δt][t,\, t + \Delta t]; letting Δt0\Delta t \to 0 turns it into the derivative p˙(t)\dot p(t) by definition. The right-hand side carries no Δt\Delta t, so the limit passes it through untouched. What remains is the saturation model’s equation of motion,

p˙(t)=γ(t)δ(t).\dot p(t) = \gamma(t) - \delta(t).

Now substitute the linear forms. Taking γ(t)=γ0γ1p(t)\gamma(t) = \gamma_0 - \gamma_1\, p(t) and δ(t)=δ0+δ1p(t)\delta(t) = \delta_0 + \delta_1\, p(t) and subtracting, the equation becomes

p˙(t)=γ0δ0(γ1+δ1)p(t).\dot p(t) = \gamma_0 - \delta_0 - (\gamma_1 + \delta_1)\, p(t).

The right-hand side is a linear function of the population: a constant γ0δ0\gamma_0 - \delta_0, less a multiple of p(t)p(t). This is already the model’s equation, but it reads better repackaged. Define two constants,

m=γ1+δ1,K=γ0δ0γ1+δ1.m = \gamma_1 + \delta_1, \qquad K = \frac{\gamma_0 - \delta_0}{\gamma_1 + \delta_1}.

The first, mm, is the coefficient of p(t)p(t); the second, KK, is built so that mKm K equals the constant term γ0δ0\gamma_0 - \delta_0. With those choices the equation factors neatly, collapsing to a compact and very suggestive form:

p˙(t)=m(p(t)K).\dot p(t) = -m\,\big(p(t) - K\big).

Those two names are worth dwelling on, because neither is mere shorthand.

The constant m=γ1+δ1m = \gamma_1 + \delta_1 is a sum of two positive numbers, so m>0m > 0. It sets the pace of the model: it gathers how sharply the birth rate falls and the death rate climbs as the population grows into a single number, measuring how briskly the population responds to its own size.

The constant KK is the one promised earlier. The carrying capacity was introduced as a claim — a finite, positive saturation level the model would somehow have to produce. Here it is, produced:

K=γ0δ0γ1+δ1.K = \frac{\gamma_0 - \delta_0}{\gamma_1 + \delta_1}.

It is finite because the denominator γ1+δ1\gamma_1 + \delta_1 is nonzero, and strictly positive because the sign conditions on the rates make numerator and denominator both positive: γ0>δ0\gamma_0 > \delta_0 gives γ0δ0>0\gamma_0 - \delta_0 > 0, and γ1,δ1>0\gamma_1, \delta_1 > 0 gives γ1+δ1>0\gamma_1 + \delta_1 > 0. So 0<K<0 < K < \infty is no longer an assumption — it is a consequence of the four constants the model began with. The bare claim has become a number.

The differential equation tells the population how to change from one instant to the next, but not where to begin. Populations that start at different sizes trace different curves, all of them obeying the same equation — so the equation on its own describes a whole family of curves, not a single one. To pick out the one curve a particular population follows, the model needs a second fact: the population’s size at the start, the initial condition p(0)=p0p(0) = p_0. The equation and this initial condition together make the model complete, and — as with the Malthus model — its solution can be written in closed form.

The Verhulst saturation model describes a single species whose birth and death rates vary linearly with the population. Its size p(t)p(t) satisfies the ODE

p˙(t)=m(p(t)K),\dot p(t) = -m\,\big(p(t) - K\big),

with initial condition p(0)=p0p(0) = p_0. The two constants are m=γ1+δ1>0m = \gamma_1 + \delta_1 > 0, which sets the speed of the response, and the carrying capacity K=(γ0δ0)/(γ1+δ1)>0K = (\gamma_0 - \delta_0)/(\gamma_1 + \delta_1) > 0. The solution is

p(t)=K+(p0K)emt.p(t) = K + (p_0 - K)\, e^{-m t}.
Solving the equation by shifting back to Malthus

The equation p˙(t)=m(p(t)K)\dot p(t) = -m\,(p(t) - K) looks new, but one change of variable turns it into one already solved. Measure the population not from zero but from the carrying capacity: let

u(t)=p(t)Ku(t) = p(t) - K

be the gap between the current population and KK. Since KK is a constant, the gap and the population change at the same rate, u˙(t)=p˙(t)\dot u(t) = \dot p(t), and the equation rewrites cleanly as

u˙(t)=mu(t).\dot u(t) = -m\, u(t).

This is the Malthus equation exactly: a quantity whose rate of change is a fixed multiple of the quantity itself. Only the names differ — the gap uu stands where the population stood, and the constant m-m stands where the growth rate λ\lambda stood. So its solution is the Malthus exponential under that same renaming. Malthus’s

p(t)=p0eλtp(t) = p_0\, e^{\lambda t}

becomes, with uu written for pp, the constant m-m for λ\lambda, and the starting gap u(0)u(0) for the starting population p0p_0,

u(t)=u(0)emt.u(t) = u(0)\, e^{-m t}.

The starting gap u(0)u(0) is not a new unknown — it follows from the definition of uu. Setting t=0t = 0 in u(t)=p(t)Ku(t) = p(t) - K and using the initial condition p(0)=p0p(0) = p_0,

u(0)=p(0)K=p0K.u(0) = p(0) - K = p_0 - K.

Putting that into the exponential gives the gap at every time tt:

u(t)=(p0K)emt.u(t) = (p_0 - K)\, e^{-m t}.

One step is left: the model asks for the population, not the gap. The definition u(t)=p(t)Ku(t) = p(t) - K rearranges directly to

p(t)=u(t)+K,p(t) = u(t) + K,

and substituting the gap just found for u(t)u(t) produces the solution in full:

p(t)=K+(p0K)emt.p(t) = K + (p_0 - K)\, e^{-m t}.

So the saturation model is not new behavior at all: it is Malthusian change measured from KK instead of from zero. And because m>0m > 0, the effective growth rate m-m is negative, so this Malthusian piece decays rather than explodes.

With the solution in hand, the population’s entire future can be read straight off the formula p(t)=K+(p0K)emtp(t) = K + (p_0 - K)\, e^{-m t}. It has just two pieces: the fixed number KK, and a time-varying term (p0K)emt(p_0 - K)\, e^{-m t}. Because m>0m > 0, the exponential emte^{-m t} equals 11 at t=0t = 0 and decays steadily toward zero, so that second term always shrinks away — whatever it does on the way, the population is bound for KK.

What the starting population decides is how the approach happens, through the sign of p0Kp_0 - K:

  • if p0>Kp_0 > K, so the population starts above its carrying capacity, then p0Kp_0 - K is positive: the second term is positive and shrinking, and p(t)p(t) descends toward KK from above;
  • if p0<Kp_0 < K, so the population starts below capacity, then p0Kp_0 - K is negative: the second term is negative and shrinking in magnitude, and p(t)p(t) climbs toward KK from below;
  • if p0=Kp_0 = K exactly, the second term is zero for all time, and the population holds at KK forever.

Let time run on without bound and the two cases merge into one. The exponential emte^{-m t} tends to zero, the time-varying term vanishes with it, and the population converges on its carrying capacity:

limtp(t)=K.\lim_{t \to \infty} p(t) = K.

This is the saturation the refinement set out to deliver: starting high or starting low, every population the model describes is drawn to the same finite level KK and settles there — no unbounded boom, and no slide to extinction.

p(t)=K+(p0K)emtp(t) = K + (p_0 - K)\, e^{-m t}

The figure puts that behavior in plain view. Each curve is one solution p(t)p(t), started from a different population p0p_0; the dashed line is the carrying capacity KK. The curves beginning above KK bend down toward it and those beginning below climb up to it, but every one of them flattens onto the dashed line — the limit p(t)Kp(t) \to K, seen directly. The approach is fast then slow: the exponential emte^{-m t} sheds most of the gap to KK early on, so each curve closes in quickly and then eases through the final stretch. Wherever a population starts, the model funnels it to the single level KK.

Is saturation realistic?

The saturation model earns its keep. Its solution rises or falls to the carrying capacity KK and settles there — and because KK is the level the population approaches as time runs on without end, it also goes by the name pp_\infty. That bounded behavior is the whole point of the refinement: where Malthus sent a population climbing forever toward infinity, the saturation model holds it to a finite ceiling. For any population living on limited resources — which is to say every real one — that is a genuine step toward realism.

And yet it is still not realistic, and the flaw shows the moment the clock starts. Picture a single pair of rabbits loosed into vast empty grassland — land that could in time feed millions of them. With only two rabbits and all that room, nothing whatsoever holds reproduction back, and the population ought to take off like a Malthusian exponential: slow at first, with just two rabbits to breed, then faster and faster as their numbers swell. The saturation model does the opposite. Its growth rate is set by the gap KpK - p between the current population and the distant ceiling — and that gap is at its widest exactly when the population is smallest, at the very start. So the population grows fastest right at the start, and its growth slows a little more with every step after that, the whole way up to KK. The rabbits behave as if they could feel a ceiling getting closer and were holding back for it — when in fact they have room for millions more.

What realism asks for is a slowdown that comes later. While the population is small and its surroundings empty, it should grow like the Malthus model — an accelerating, exponential take-off. Only as it starts to crowd its limit should it switch to the saturation model’s behavior, bending over and easing onto KK. Both halves are already pictured on this page: the exponential climb in the Malthus figure, the saturating approach in the figure just above this section. A realistic history splices the two together, and spliced, it has the shape of an S — curving upward through the early boom, then curving over as it nears KK, with a single turning point where it passes from one half to the other. The saturation model has only the second half: its curve bends toward the ceiling from the very first instant, with no exponential phase before it and no turning point at all. Supplying that missing first half, and the turn into the second, is the work of the second refinement.

A second refinement: logistic growth

The saturation model gave a population a finite ceiling but spent realism getting it: its brake is active from the very first instant, even when there is nothing yet to brake against. The second refinement keeps the ceiling but rebuilds the brake so its strength depends on the population itself — weak when the population is small, strong only as the population grows. Done right, this produces the S-shape the previous section asked for.

The way to build a brake that scales with the population is to write the rate of change as a product of two factors:

p˙(t)=(abp(t))p(t),\dot p(t) = \big(a - b\, p(t)\big)\, p(t),

with positive constants aa and bb, the first much larger than the second: ab>0a \gg b > 0. The second factor, p(t)p(t), is just the current population — the “more makes more” multiplier already familiar from the Malthus model. The first factor, abp(t)a - b\, p(t), is the new piece: an effective per-population growth rate that starts at aa when the population is vanishing and shrinks linearly toward zero as the population grows. That first factor is the brake — a number that punishes size.

The product of the two reads naturally as exponential growth with a built-in brake, and the two regimes can be read straight off it.

  • When pp is small, the brake term bpb\, p is tiny next to aa, so abpaa - b\, p \approx a. The equation collapses to p˙ap\dot p \approx a\, p — the Malthus equation with growth rate aa. The population takes off exponentially, exactly as it should in an empty habitat.
  • As pp grows, bpb\, p catches up to aa, the first factor abpa - b\, p shrinks, and with it the effective growth rate. Growth slows, the curve starts to bend, and the brake — invisible until now — takes over.

The condition aba \gg b is what cleanly separates those two regimes. Because bb is so small, the brake term bpb\, p stays insignificant for a long stretch of population sizes, letting the Malthusian phase play out fully before saturation begins to bite. Take bb comparable to aa instead and the brake would press from the start, throwing the model back to the saturation behavior the refinement was meant to leave behind.

Distributing the product across p(t)p(t) rewrites the equation in a second, equally useful form:

p˙(t)=ap(t)bp(t)2.\dot p(t) = a\, p(t) - b\, p(t)^2.

The two forms say the same thing arithmetically but emphasize different ideas. The product form (abp)p(a - b p)\, p makes the modelling intent visible — Malthus’s pp multiplied by a slowing factor — while the expanded form names the new ingredient explicitly: pure Malthus growth apa\, p corrected by a quadratic term bp2-b\, p^2 that grows faster than the population and eventually overwhelms it. Both will be useful later.

The logistic growth model is the second refinement of Malthus: a single-species model whose effective per-population growth rate decreases linearly with the population, producing a Malthusian early phase that brakes itself into saturation. Its size p(t)p(t) satisfies the ODE

p˙(t)=(abp(t))p(t)=ap(t)bp(t)2,\dot p(t) = \big(a - b\, p(t)\big)\, p(t) = a\, p(t) - b\, p(t)^2,

with positive constants ab>0a \gg b > 0 and initial condition p(0)=p0p(0) = p_0. The two forms of the right-hand side are algebraically identical; both are commonly used.

The same model is just as often written in the equivalent carrying-capacity form

p˙(t)=λp(t)(1p(t)K),\dot p(t) = \lambda\, p(t)\left(1 - \frac{p(t)}{K}\right),

which carries the carrying capacity KK directly in the equation rather than leaving it to be derived. It matches the forms above with λ=a\lambda = a and K=a/bK = a/b. The solution is

p(t)=ap0bp0+(abp0)eat.p(t) = \frac{a\, p_0}{b\, p_0 + (a - b\, p_0)\, e^{-a t}}.
Why the two forms are the same model

Distribute λp(t)\lambda\, p(t) across the bracket of the carrying-capacity form:

p˙(t)=λp(t)λKp(t)2.\dot p(t) = \lambda\, p(t) - \frac{\lambda}{K}\, p(t)^2.

This has the exact shape of the expanded standard form p˙=apbp2\dot p = a\, p - b\, p^2: a multiple of pp minus a multiple of p2p^2. Two equations of that shape describe the same model precisely when their matching coefficients agree, and reading off the coefficient of pp and the coefficient of p2p^2 in turn pins down the dictionary between the two parametrizations:

a=λ,b=λK.a = \lambda, \qquad b = \frac{\lambda}{K}.

The first identity says λ\lambda is nothing new: it is the standard model’s aa, the growth rate the population runs at while it is still small and the brake bpb\, p is negligible. The second rearranges to give the carrying capacity in terms of the standard constants,

K=λb=ab,K = \frac{\lambda}{b} = \frac{a}{b},

which is exactly the level the closed-form solution settles onto as tt \to \infty, recovered here straight from the equation instead of from the limit. So the two forms are one model written two ways: the pair (a,b)(a, b) foregrounds the growth rate and the strength of the brake, while the pair (λ,K)(\lambda, K) foregrounds the growth rate and the ceiling the population is climbing toward.

A note on what is not in the derivation. For the Malthus model and the saturation model, the equation of motion was built up from a per-individual or per-population bookkeeping of births and deaths over a small step Δt\Delta t, and passing to the limit gave the ODE. No such build-up happens here: the logistic ODE is posited directly, as a modelling choice for the shape of the per-population growth rate. The interpretation of aa and bb — and the case for the quadratic term over, say, a cubic one — is taken up later in this chapter; for now, the equation is the model.

Deriving that closed form is more involved than for the previous two models. The right-hand side is quadratic in pp rather than linear, so the change-of-variable trick that solved the saturation equation no longer applies. The full derivation pairs separation of variables with a partial-fraction decomposition; the latter doesn’t earn enough use elsewhere in this chapter to develop from scratch here, so we take the formula as given and turn next to what it actually does.

Reading the logistic curve

With the logistic growth model in hand, the same questions surface that we asked of the saturation model: where does the population end up, and what shape does the journey take?

The limit is read straight off the closed-form solution. As tt \to \infty, the exponential eate^{-a t} vanishes (since a>0a > 0), and the denominator bp0+(abp0)eatb\, p_0 + (a - b\, p_0)\, e^{-a t} collapses to just bp0b\, p_0, leaving

limtp(t)=ap0bp0=ab.\lim_{t \to \infty} p(t) = \frac{a\, p_0}{b\, p_0} = \frac{a}{b}.

The starting size p0p_0 cancels. Every solution ends up at the same level, set only by the model’s two constants — so saturation is built into the logistic curve just as it was into the Verhulst one. The level a/ba/b earns the same name, carrying capacity, only with a new formula:

K=ab.K = \frac{a}{b}.

What the starting point decides is how the population approaches KK, and the comparison with the saturation model splits the cases.

  • If p0<a/bp_0 < a/b, the population starts below carrying capacity. It rises toward KK with the S-shape the refinement was built to deliver: an accelerating early climb while the brake term bpb\, p is still tiny, then a bend over the top as the brake catches up, easing onto KK in the final stretch. The turn happens at the inflection point p=K/2p = K/2, where the curve switches from accelerating to decelerating, and the bound p(t)<a/bp(t) < a/b holds for every tt.
  • If p0>a/bp_0 > a/b, the population starts above carrying capacity. It descends monotonically toward KK from above with no inflection point — the same monotone descent the saturation model produced for populations starting above their ceiling. The bound p(t)>a/bp(t) > a/b holds throughout.
  • If p0=a/bp_0 = a/b exactly, the population is already at its carrying capacity and stays there for all time.

The S-curve in the first case is exactly the shape asked for earlier — a Malthusian boom in the empty-habitat phase and a saturating tail near the ceiling, joined by a single turning point. Earlier those were two regimes that would have had to be spliced by hand. Here they aren’t a splice at all: one equation produces both, and the inflection where the regimes meet emerges from the formula on its own.

p(t)=ap0bp0+(abp0)eatp(t) = \frac{a\, p_0}{b\, p_0 + (a - b\, p_0)\, e^{-a t}}

The figure shows several solution curves started from different p0p_0, with the dashed line marking the carrying capacity K=a/bK = a/b. Curves below KK trace the characteristic S — slow at first, then a fast climb through the middle, then a gentle bend onto the dashed line — while curves above KK slide down to it directly. All of them level off on the same line.

To put numbers to the formula, the model has been fitted to census figures for the population of the United States from 1790 to 1950, giving

a=0.03134,b=1.55871010.a = 0.03134, \qquad b = 1.5587 \cdot 10^{-10}.

The Malthusian rate a3.1%a \approx 3.1\% per year matches the early-American population boom, and the brake coefficient bb is small enough that the quadratic term bp2b\, p^2 only seriously bites once the population reaches the hundreds of millions. Substituting gives a carrying capacity of K=a/b2108K = a/b \approx 2 \cdot 10^8, roughly the U.S. population at the upper end of the fitting window.

With saturation built in and a realistic S-shape, the logistic model is decidedly more powerful than the two before it. What it still doesn’t capture is anything from outside the single species — no other species interacting with it, no external influences operating on it at all. Supplying those — first a framework for several species sharing an environment, then specific patterns like competition and predator–prey — is the work of the rest of this page.

Why quadratic, and not cubic?

The logistic ODE was posited directly as a modeling choice, with the quadratic brake bp2-b\, p^2 taken on faith. We come back to that choice now. The exponent isn’t forced by the math: a cubic brake cp3-c\, p^3, or some power in between, would also produce a bounded, saturating curve. Picking the power is a modeling decision. The choice of two, though, has a clean interpretation that makes it the natural pick.

The picture is one of pairwise interaction. In a population of size pp, fix attention on a single individual and ask how much it is disturbed by the others — by competition for food, water, space, mates. The simplest assumption is that this disturbance grows in proportion to how many others are around: an individual surrounded by 100100 others is disturbed roughly 100100 times as much as one surrounded by just one. So the per-individual disturbance is proportional to pp.

But the equation of motion tracks the whole population, not one individual. The community-wide disturbance is the per-individual amount summed across all pp individuals, each one contributing p\propto p:

pindividuals  ×  pper-individual disturbance  =  p2.\underbrace{p}_{\text{individuals}} \;\times\; \underbrace{p}_{\text{per-individual disturbance}} \;=\; p^2.

So the brake is quadratic because it is the product of two factors of pp — one for how many individuals feel the disturbance, another for how strongly each is disturbed by its neighbors. It is the slogan the whole population disturbs the whole population made precise. A cubic term would correspond to disturbance from triples of individuals interacting at once rather than pairs — admissible, but with no equally simple reading.

Read in that light, the two terms of p˙=apbp2\dot p = a\, p - b\, p^2 are opposite sides of the same crowd. The linear apa\, p is the population’s total Malthusian growth contribution, scaling one-for-one with the headcount — each individual contributes its share independently of the others. The quadratic bp2-b\, p^2 is the disturbance working against that growth, scaling pair-by-pair. The brake is one power higher than the drive because the brake comes from interactions and the drive does not.

An aside: two generalizations

Logistic-like growth can also be obtained from two more general formulations of the population dynamics. Neither is common in practice — the standard p˙=(abp)p\dot p = (a - b\, p)\, p remains dominant — but they are worth naming, for completeness.

The first lets the growth rate depend on time:

p˙(t)=λ(t)p(t),\dot p(t) = \lambda(t)\, p(t),

with λ(t)\lambda(t) positive, monotonically decreasing, and continuous. The picture is a Malthusian model whose rate is no longer constant: the population still grows by a fixed fraction of itself per unit time, but that fraction fades as the years pass. Each condition does its own job: positive for the initial exponential climb, monotonically decreasing so that climb slows down over time, and continuous for mathematical reasons.

The second is more general still: the growth rate depends on the population itself,

p˙(t)=f(p(t))p(t),\dot p(t) = f(p(t))\, p(t),

with f(p)f(p) positive, monotonically decreasing, and tending to zero as tt \to \infty. This is a super-class that includes the logistic growth model as a special case — there f(p)=abpf(p) = a - b\, p, linear in pp, vanishing at p=a/b=Kp = a/b = K. Empirically this family is sufficient to describe closed populations — populations without external influences.

Another possibility: oscillations

The models so far all approach saturation smoothly. A natural question is whether a population might overshoot its limit, swing back below, and gradually settle in — the shape of a damped oscillation. There is a standard equation that produces exactly that:

p¨(t)+μp˙(t)+ω2(p(t)p)=0,\ddot p(t) + \mu\, \dot p(t) + \omega^2\,(p(t) - p_\infty) = 0,

a linear damped oscillator with μ>0\mu > 0, 4ω2μ204\omega^2 - \mu^2 \geq 0, and limit pp_\infty. With p(0)=p0p(0) = p_0, its solution is

p(t)=(p0p)eμt/2cos ⁣(ω2μ24  t)+p,p(t) = (p_0 - p_\infty)\, e^{-\mu t/2}\, \cos\!\left(\sqrt{\omega^2 - \tfrac{\mu^2}{4}}\;t\right) + p_\infty,

three pieces doing three jobs: the constant pp_\infty pins down the limit, the cosine produces the oscillation, and the decaying exponential eμt/2e^{-\mu t/2} shrinks that oscillation over time so the curve eventually settles.

What makes this qualitatively new is the second derivative p¨\ddot p — the equation now tracks not just how fast the population grows but how that growth rate itself is changing. The first derivative has a clean reading as net growth; the second derivative, the rate at which the rate changes, has no equally clean biological meaning, and without one there is little reason to bring it into a single-species model. Oscillations do show up naturally once two interacting species enter the picture — and that is where this page goes next.

More than one species

Every model so far has been a single species in isolation. The next step is coexistence — several species sharing an environment and influencing one another’s growth — and the simplest case is two species, PP and QQ, tracked by their headcounts p(t)p(t) and q(t)q(t). Two species means two equations of motion, one per population, and the modeling choice is whether the two species feel each other or not.

If they ignore one another — separate habitats, no shared resources, no predation — the system decouples. Each population evolves on its own, governed only by its own headcount, and the whole arrangement is just the logistic growth model (or one of its predecessors) written twice. Nothing genuinely new happens.

The case that does call for new tools is the opposite one: each species’ growth rate depends on both populations. Rabbits and foxes are the standard picture — more rabbits feed more foxes, more foxes kill more rabbits — and neither population can be tracked without watching the other. Each equation keeps the now-familiar shape, a population multiplied by its growth rate, only the growth rate of each species is now a function of both populations.

The two-species model describes two coupled species PP and QQ. Their populations p(t)p(t) and q(t)q(t) satisfy the system of ODEs

p˙(t)=f(p(t),q(t))p(t),q˙(t)=g(p(t),q(t))q(t).\dot p(t) = f(p(t), q(t))\, p(t), \qquad \dot q(t) = g(p(t), q(t))\, q(t).

The functions ff and gg are the growth rates of PP and QQ, each one a function of both populations. They are only meaningful for non-negative arguments, since populations cannot be negative.

The growth rates ff and gg generalize the constant λ\lambda of the Malthus model and the linear factor abpa - b\,p of the logistic growth model: the same “headcount times rate” structure as before, only with the rate now allowed to feel both populations at once.

The first question to ask of any such system is when it settles into a state that never changes: a pair (pˉ,qˉ)(\bar p, \bar q) at which neither species changes, p˙=q˙=0\dot p = \dot q = 0 together, so the system would sit there forever if it ever arrived. Each equation is a product of two factors, the population and its growth rate, so each derivative vanishes the moment either factor does.

A stationary point (also called a steady state) of the two-species model is a pair (pˉ,qˉ)(\bar p, \bar q) at which both derivatives vanish,

p˙=q˙=0,\dot p = \dot q = 0,

so the system started at (pˉ,qˉ)(\bar p, \bar q) stays there for all time.

The name records what the system does at the pair, not how big the populations are: the state is stationary — no growth, no decay, for either species. Each derivative is a product — p˙=f(pˉ,qˉ)pˉ\dot p = f(\bar p, \bar q)\, \bar p and q˙=g(pˉ,qˉ)qˉ\dot q = g(\bar p, \bar q)\, \bar q, a growth rate times a population — and a product is zero when either factor is zero. So a pair can be stationary in two ways. A population sitting at zero, pˉ=0\bar p = 0 or qˉ=0\bar q = 0, zeroes its own derivative no matter what its growth rate is doing: a degenerate stationary point, with one species simply extinct and any survivor balancing only against itself. The other way keeps both species present and instead drives both growth rates to zero, f(pˉ,qˉ)=g(pˉ,qˉ)=0f(\bar p, \bar q) = g(\bar p, \bar q) = 0 — the genuinely interesting case, and the one with its own name.

An equilibrium point (also called a coexistence point) is a stationary point at which both populations are strictly positive,

pˉ>0,qˉ>0.\bar p > 0, \qquad \bar q > 0.

With both populations nonzero, the derivatives can vanish only if both growth rates do, so an equilibrium point is exactly a solution of f(pˉ,qˉ)=g(pˉ,qˉ)=0f(\bar p, \bar q) = g(\bar p, \bar q) = 0 with positive coordinates. Every equilibrium point is a stationary point; the converse fails whenever one of the populations sits at zero.

This is the kind of stability the rest of the chapter chases: both species hanging on indefinitely, neither outgrowing the other, neither dying out. Whether a particular system has an equilibrium is one question, answered by solving f=g=0f = g = 0 and checking the positivity of the resulting pair. Whether the system actually settles into the equilibrium from nearby starting points is another question entirely, and the next section takes it up.

Stability of equilibria

The first question about a two-species system is whether it has an equilibrium at all, answered by solving f=g=0f = g = 0 and checking that the resulting pair has both components positive. The second question is whether the system cares: an equilibrium exists in the equations whether or not the dynamics ever go near it, and the system may simply pass the pair by, or actively flee from it, or be drawn straight in. Which of those happens depends on what the populations p(t)p(t) and q(t)q(t) do when the system is started near (pˉ,qˉ)(\bar p, \bar q). Geometrically, the populations trace a curve through the (p,q)(p, q)-plane as time runs — the system’s trajectory — and the standard vocabulary classifies what nearby trajectories do into three cases.

A trajectory of a two-species model is the curve (p(t),q(t))(p(t), q(t)) traced through the (p,q)(p, q)-plane as time runs forward. For a 2D ODE system more generally, the trajectory is the curve (x(t),y(t))(x(t), y(t)) in the state plane.

The most demanding of the three is the one where the populations not only reach the equilibrium from a nearby start but stay there once they do.

An equilibrium point (pˉ,qˉ)(\bar p, \bar q) is attractive when populations started near it both reach the equilibrium and stay there. From any starting pair (p0,q0)(p_0, q_0) close enough to (pˉ,qˉ)(\bar p, \bar q), the system arrives at the equilibrium, at some finite time or in the limit as tt \to \infty; once there, the populations stay at (pˉ,qˉ)(\bar p, \bar q) for all later time. This is the kind of equilibrium two coexisting species genuinely settle into.

The opposite extreme is the one where nothing nearby reaches the equilibrium at all.

An equilibrium point (pˉ,qˉ)(\bar p, \bar q) is repulsive when populations started near it move away from the equilibrium. The pair is still a balance in the strict sense, since starting the system exactly on (pˉ,qˉ)(\bar p, \bar q) leaves it there forever, but the slightest perturbation grows over time, carrying the populations farther from the equilibrium rather than back to it.

In between is the mixed case, where some starting pairs feed in and others push out.

A saddle point is an equilibrium point (pˉ,qˉ)(\bar p, \bar q) that pulls populations in for some starting pairs (p0,q0)(p_0, q_0) while pushing them away for others. The set of starting pairs that actually reach the equilibrium is thin, so for generic starts a saddle behaves like a repulsive equilibrium, except populations are often pulled close to (pˉ,qˉ)(\bar p, \bar q) first before being pushed away.

Telling the three cases apart from the equations themselves is the work of linear stability analysis: the Jacobian of the system, evaluated at the equilibrium, has eigenvalues whose real parts classify the equilibrium as attractive, repulsive, or a saddle. The linked page is the full lookup table — six rows covering every generic case — and a later section in this chapter applies the criterion to the two-species setting specifically. The immediate next step is to revisit the arms race of two superpowers, and watch all three behaviors emerge in a system that is mathematically a two-species model, with military budgets standing in for headcounts.

A worked example: the arms race

The model returns in essentially the form it had when first introduced. The picture is deliberately spare. Two countries are tracked, labeled XX and YY (historically, the United States and the Soviet Union at the height of the Cold War). Each carries one number, its military expenditure at time tt, written x(t)x(t) and y(t)y(t).

The arms race of two superpowers is the two-variable linear ODE system

x˙(t)=u(x,y)=mx(t)+ay(t)+c,y˙(t)=v(x,y)=bx(t)ny(t)+d,\begin{aligned} \dot x(t) = u(x, y) &= -m\, x(t) + a\, y(t) + c, \\ \dot y(t) = v(x, y) &= b\, x(t) - n\, y(t) + d, \end{aligned}

for the military expenditures x(t)x(t) and y(t)y(t) of two superpowers XX and YY, with six positive constants

a,b,c,d,m,n>0.a,\, b,\, c,\, d,\, m,\, n > 0.

The rate functions u(x,y)u(x, y) and v(x,y)v(x, y) each gather three contributions: the disarmament rates mm and nn (domestic resistance to growing one’s own budget, per unit of one’s own current budget); the armament rates aa and bb (the response to the rival’s spending, per unit of the rival’s budget); and the baseline contributions cc and dd (constant additions to one’s own armament, independent of either budget — a negative baseline would represent a constant push toward disarmament instead).

Read either equation term by term and the modeling intent reads off directly. Take the XX line:

  • mx(t)-m\, x(t): the more XX already spends, the harder it gets to justify spending even more — domestic political and economic resistance scales with the existing budget. The minus sign makes this a brake on the rate.
  • +ay(t)+a\, y(t): the more the rival spends, the more pressure there is to keep up — rivalry scales with the enemy’s budget. The plus sign makes this a driver.
  • +c+c: a constant baseline pulling toward more spending no matter what either side is doing.

The YY equation has the same shape with the roles reversed: the brake ny-n\, y scales with YY‘s own budget, and the driver +bx+b\, x scales with the rival’s. Whether the combined system runs away, settles to a balance, or oscillates depends on whether the armament coefficients aa and bb win against the disarmament coefficients mm and nn — the question the next sections take up.

Because every right-hand-side term is linear in xx and yy, the system collapses into matrix form. Gathering the linear parts into a 2×22 \times 2 matrix and the constants into a vector,

(x˙(t)y˙(t))=(mabn)(x(t)y(t))+(cd).\begin{pmatrix} \dot x(t) \\ \dot y(t) \end{pmatrix} = \begin{pmatrix} -m & a \\ b & -n \end{pmatrix} \begin{pmatrix} x(t) \\ y(t) \end{pmatrix} + \begin{pmatrix} c \\ d \end{pmatrix}.

The diagonal entries carry each country’s own self-restraint, with their negative signs; the off-diagonal entries carry the cross-influence from the rival, with positive signs.

The arms race is a coupled two-variable ODE system in the spirit of the two-species model of the previous section, but in a simpler shape, in two ways.

  • The right-hand sides are linear in xx and yy. The two-species rate functions ff and gg were left general, allowing any dependence at all; here they are first-degree polynomials with no squared or product terms. A linear system is the easiest possible kind to analyze and the honest first place to apply the eigenvalue criterion.
  • The system is not in the headcount-times-rate form p˙=f(p,q)p\dot p = f(p, q)\, p, q˙=g(p,q)q\dot q = g(p, q)\, q. Military budgets do not reproduce in proportion to themselves, so x˙\dot x is not a multiple of xx, and y˙\dot y is not a multiple of yy. The more general unfactored shape x˙=u(x,y)\dot x = u(x, y), y˙=v(x,y)\dot y = v(x, y) used in linear stability analysis is the right shape for this model.

Equilibria of the arms race

The arms-race ODE is a linear system in (x,y)(x, y) — every right-hand-side term is linear in the budgets, plus a constant. Rewriting it in matrix form,

(x˙(t)y˙(t))=A(x(t)y(t))+(cd),A=(mabn),\begin{pmatrix} \dot x(t) \\ \dot y(t) \end{pmatrix} = A \begin{pmatrix} x(t) \\ y(t) \end{pmatrix} + \begin{pmatrix} c \\ d \end{pmatrix}, \qquad A = \begin{pmatrix} -m & a \\ b & -n \end{pmatrix},

isolates the coefficient matrix AA, which is essentially the object that decides everything about the equilibria. Every question we’d ask about them reduces to a condition on the single scalar

detA=(m)(n)ab=mnab.\det A = (-m)(-n) - ab = mn - ab.

The two products in that expression have natural physical readings. mnmn is the combined self-restraint — each country’s own disarmament rate multiplied together. abab is the combined cross-pressure — each country’s reaction rate to the rival’s spending, multiplied together. So a sign condition on detA\det A is just a comparison between mnmn and abab. Two takeaways cover the whole picture.

A unique stationary point exists when mnabmn \ne ab. A stationary point is a pair (xˉ,yˉ)(\bar x, \bar y) where both rates vanish, u(xˉ,yˉ)=v(xˉ,yˉ)=0u(\bar x, \bar y) = v(\bar x, \bar y) = 0. For this linear system, such a pair exists and is unique exactly when the coefficient matrix AA is invertible. Since detA=mnab\det A = mn - ab, invertibility (detA0\det A \ne 0) is just mnabmn \ne ab. In model terms: as long as the combined self-restraint and the combined cross-pressure aren’t in the knife-edge balance mn=abmn = ab, the system has a single budget pair at which neither superpower’s spending changes. The borderline mn=abmn = ab is degenerate (no unique stationary point) and we set it aside for now.

Both rates vanish at (xˉ,yˉ)(\bar x, \bar y), so the trajectory started exactly there never moves: the constant function

(x(t)y(t))=(xˉyˉ)t\begin{pmatrix} x(t) \\ y(t) \end{pmatrix} = \begin{pmatrix} \bar x \\ \bar y \end{pmatrix} \qquad \forall t

is therefore a special solution of the ODE, called the stationary solution.

The stationary point is a positive, attractive equilibrium when mn>abmn > ab. Two requirements have to hold for the stationary point to count as a genuine, well-behaved equilibrium: both coordinates must be strictly positive (a negative military budget is meaningless), and small departures must be damped back rather than amplified. Both reduce to the same inequality: detA>0\det A > 0, i.e. mn>abmn > ab. Positivity follows because xˉ\bar x and yˉ\bar y always share the sign of detA\det A; stability follows because linear stability analysis classifies the system via the eigenvalues of its Jacobian, which is AA everywhere, and the model’s sign constraints reduce that eigenvalue analysis to a condition on detA\det A alone. Three cases fall out:

  • detA>0\det A > 0 (mn>abmn > ab, restraints win): the equilibrium is attractive.
  • detA<0\det A < 0 (mn<abmn < ab, cross-pressures win): the stationary point has negative coordinates and is a saddle.
  • detA=0\det A = 0 (mn=abmn = ab): degenerate, as set aside above.

In model terms: when restraints win, any small departure from equilibrium is damped down faster than the two countries can amplify it back at each other, and the budgets are drawn to (xˉ,yˉ)(\bar x, \bar y) no matter where they start. When cross-pressures win, a small rise on one side drives a larger rise on the other, which drives a larger rise back on the first, and the budgets escalate without bound.

Why positivity and stability both reduce to detA>0\det A > 0

Positivity. Setting the right-hand sides of the ODE to zero gives the linear system

mxˉ+ayˉ=c,bxˉnyˉ=d,\begin{aligned} -m\,\bar x + a\,\bar y &= -c, \\ b\,\bar x - n\,\bar y &= -d, \end{aligned}

which any standard 2×22 \times 2 method (substitution, elimination, Cramer’s rule) solves to

xˉ=nc+admnab,yˉ=bc+mdmnab.\bar x = \frac{n\,c + a\,d}{mn - ab}, \qquad \bar y = \frac{b\,c + m\,d}{mn - ab}.

Each numerator is a sum of products of positive constants, hence strictly positive, and the common denominator is detA=mnab\det A = mn - ab. So xˉ\bar x and yˉ\bar y always share the sign of detA\det A.

Stability. From linear stability analysis, the equilibrium is attractive when both eigenvalues of AA have negative real parts. Two algebraic identities about eigenvalues do the work:

Same-sign eigenvalues summing to a negative number can only be both negative. So detA>0\det A > 0 forces both eigenvalues negative, hence the equilibrium is attractive.

When detA<0\det A < 0 instead, the eigenvalues have opposite signs and the stationary point is a saddle. When detA=0\det A = 0, one eigenvalue is zero — the degenerate case.

Trajectories of the arms race

The previous section classified the arms-race system’s behavior abstractly, using only the sign of detA\det Awhether an equilibrium exists, whether trajectories converge to it or escape from it — without ever drawing a trajectory. We now pick three concrete sets of constants and watch what the trajectories actually do. Each scenario lands in a different qualitative regime, and each also corresponds to a different political argument made about the Cold War arms race.

Equilibrium

The first scenario fixes the six constants like this:

(x˙(t)y˙(t))=(11/21/21)(x(t)y(t))+(3/20).\begin{pmatrix} \dot x(t) \\ \dot y(t) \end{pmatrix} = \begin{pmatrix} -1 & 1/2 \\ 1/2 & -1 \end{pmatrix} \begin{pmatrix} x(t) \\ y(t) \end{pmatrix} + \begin{pmatrix} 3/2 \\ 0 \end{pmatrix}.

The two countries share the same disarmament rate, m=n=1m = n = 1, and the same armament rate, a=b=1/2a = b = 1/2. Only the baselines, c=3/2c = 3/2 and d=0d = 0, break the symmetry between them. The determinant of the coefficient matrix is

detA=(1)(1)1212=114=34>0,\det A = (-1)(-1) - \tfrac{1}{2} \cdot \tfrac{1}{2} = 1 - \tfrac{1}{4} = \tfrac{3}{4} > 0,

equivalently mn=1>14=abmn = 1 > \tfrac{1}{4} = ab — the combined self-restraint beats the combined cross-pressure. By the analysis above, the system has a unique stationary point with strictly positive coordinates, and it is an attractive equilibrium. The eigenvalues of AA confirm this directly: solving det(AλI)=0\det(A - \lambda I) = 0 gives

λ1=12,λ2=32,\lambda_1 = -\tfrac{1}{2}, \qquad \lambda_2 = -\tfrac{3}{2},

both real and strictly negative — the eigenvalue signature of an attractor. The detA>0\det A > 0 shortcut from the previous section spares us this calculation, but the two routes agree.

Computing the equilibrium (xˉ,yˉ)(\bar x, \bar y)

Setting both rates to zero gives a linear system in (xˉ,yˉ)(\bar x, \bar y),

xˉ+12yˉ+32=0,12xˉyˉ=0,\begin{aligned} -\bar x + \tfrac{1}{2}\,\bar y + \tfrac{3}{2} &= 0, \\ \tfrac{1}{2}\,\bar x - \bar y &= 0, \end{aligned}

which the explicit formulas derived above solve directly:

xˉ=nc+admnab=132+12034=2,yˉ=bc+mdmnab=1232+1034=1.\bar x = \frac{n c + a d}{mn - ab} = \frac{1 \cdot \tfrac{3}{2} + \tfrac{1}{2} \cdot 0}{\tfrac{3}{4}} = 2, \qquad \bar y = \frac{b c + m d}{mn - ab} = \frac{\tfrac{1}{2} \cdot \tfrac{3}{2} + 1 \cdot 0}{\tfrac{3}{4}} = 1.

So the equilibrium sits at (xˉ,yˉ)=(2,1)(\bar x, \bar y) = (2, 1).

To watch a specific trajectory the model produces, we pick a starting state at t=0t = 0. The pair (x0,y0)(x_0, y_0) is a free input to the model, not something derived from the equations: we choose where the budgets sit initially, and the ODE then determines everything that happens afterwards. Take

(x0,y0)=(12,32),(x_0, y_0) = (\tfrac{1}{2}, \tfrac{3}{2}),

so country XX starts low at 12\tfrac{1}{2} and country YY starts higher at 32\tfrac{3}{2} — both off the equilibrium (2,1)(2, 1) but in its neighborhood.

Why we don’t write a closed-form (x(t),y(t))(x(t), y(t)) here

The Malthus, saturation, and logistic sections each ended with a closed-form solution p(t)p(t) — a function we could plug p0p_0 into and read off the population at any later tt. We don’t write the analogous formula (x(t),y(t))(x(t), y(t)) for the arms race. A closed form does exist (every 2D linear ODE has one, built from the eigenvalues and eigenvectors of AA), but the qualitative behavior we care about — does the trajectory converge to the equilibrium, escape it, or oscillate around it? — is already pinned down by the determinant and eigenvalue analysis above, without ever evaluating the formula at a specific tt.

So “follow the trajectory from (x0,y0)(x_0, y_0) doesn’t mean plug (x0,y0)(x_0, y_0) into a closed-form solution that takes tt as input — there isn’t one written down. We do still plug them into something, though — the ODE itself, just iteratively. Start at (x0,y0)(x_0, y_0); read the velocity (x˙,y˙)(\dot x, \dot y) there by plugging the state into the ODE’s right-hand sides; take a tiny step of size Δt\Delta t in that direction to arrive at (x0+x˙Δt,  y0+y˙Δt)(x_0 + \dot x\, \Delta t,\; y_0 + \dot y\, \Delta t); plug the new state back into the ODE for a new velocity; step again; and assemble the trajectory out of all those tiny steps. The figures below are computed exactly that way, by numerical simulation — and that iterative stepping is all (x(t),y(t))(x(t), y(t)) ever needed to be.

Two complementary diagrams help see what happens next. The familiar one plots each budget against time — a time-series plot with tt on the horizontal axis and x(t)x(t), y(t)y(t) on the vertical. The other plots the two budgets against each other in a single plane, with no time axis at all.

A phase portrait of a 2D ODE system x˙=u(x,y)\dot x = u(x, y), y˙=v(x,y)\dot y = v(x, y) is a plot in the (x,y)(x, y)-plane — the system’s state space — showing two pieces of information at once:

  • a direction field: at each point of the plane, an arrow pointing in the direction (u(x,y),v(x,y))\big(u(x, y),\, v(x, y)\big) that the system would move from that state;
  • one or more trajectories, each curve tracing how the system evolves from a chosen initial state.

Time is implicit — it does not appear on either axis but advances along each trajectory as the system runs. A trajectory always follows the arrows: at every point it passes through, its tangent direction matches the local arrow’s.

Phase portrait for this scenario. The blue dot marks the starting state (x0,y0)=(1/2,3/2)(x_0, y_0) = (1/2, 3/2); the blue curve is the trajectory running forward in time; the red dot is the equilibrium (xˉ,yˉ)=(2,1)(\bar x, \bar y) = (2, 1). Every direction-field arrow in the neighborhood of the equilibrium points roughly toward it, and the trajectory glides smoothly into the red dot and settles there.

The same trajectory plotted against time, with x(t)x(t) in red and y(t)y(t) in green over t[0,10]t \in [0, 10]. XX’s budget climbs monotonically from 12\tfrac{1}{2} toward 22, while YY‘s budget falls from 32\tfrac{3}{2}, dips briefly below 11, then rises back to settle at 11. The undershoot in y(t)y(t) is a consequence of the trajectory’s two exponentially decaying components — at rates 12-\tfrac{1}{2} and 32-\tfrac{3}{2} — fading at different speeds: not every linear combination of two decaying exponentials approaches its limit from one side.

The two views agree on the same conclusion: every starting state near (2,1)(2, 1) is pulled in by the dynamics and held there. The two budgets settle into a stable balance — no runaway escalation, and no escape from the equilibrium once reached — which is exactly what an attractive equilibrium is supposed to deliver.

Pro-arms-race politicians during the Cold War made exactly this argument — keep buying more tanks; eventually we’ll hit the limit, and peace will be on earth. An attractive equilibrium with positive coordinates is precisely that story: both budgets climb toward a finite ceiling and settle there. Critics of the arms race told a different story, and the next scenario is where that story gets its mathematical form.

Explosion

The second scenario keeps the symmetric structure of the first but turns the dials: less self-restraint, more cross-pressure, and one negative baseline.

(x˙(t)y˙(t))=(3/4113/4)(x(t)y(t))+(1/25/4).\begin{pmatrix} \dot x(t) \\ \dot y(t) \end{pmatrix} = \begin{pmatrix} -3/4 & 1 \\ 1 & -3/4 \end{pmatrix} \begin{pmatrix} x(t) \\ y(t) \end{pmatrix} + \begin{pmatrix} 1/2 \\ -5/4 \end{pmatrix}.

The constants are now m=n=34m = n = \tfrac{3}{4} (down from 11) and a=b=1a = b = 1 (up from 12\tfrac{1}{2}): each country reacts more strongly to the rival’s spending and pushes back less against its own existing budget. The baselines are c=12c = \tfrac{1}{2} and d=54d = -\tfrac{5}{4}. The negative dd sits slightly outside the model definition’s c,d>0c, d > 0 requirement, but reads naturally within the framework as a constant push toward disarmament on YY‘s side — the interpretation the model’s wording flagged when it was first introduced.

The determinant of the coefficient matrix now flips sign:

detA=(34)(34)11=9161=716<0,\det A = (-\tfrac{3}{4})(-\tfrac{3}{4}) - 1 \cdot 1 = \tfrac{9}{16} - 1 = -\tfrac{7}{16} < 0,

equivalently mn=916<1=abmn = \tfrac{9}{16} < 1 = ab — the combined cross-pressure now beats the combined self-restraint. By the analysis above, the system still has a unique stationary point (since detA0\det A \neq 0), but it is now a saddle rather than an attractor (since detA<0\det A < 0). The eigenvalues of AA confirm this directly: solving det(AλI)=0\det(A - \lambda I) = 0 gives

λ1=14,λ2=74,\lambda_1 = \tfrac{1}{4}, \qquad \lambda_2 = -\tfrac{7}{4},

one positive, one negative — the eigenvalue signature of a saddle.

Computing the stationary point (xˉ,yˉ)(\bar x, \bar y)

Same formulas as the previous scenario, applied to the new constants:

xˉ=nc+admnab=3412+1(54)716=78716=2,\bar x = \frac{n c + a d}{mn - ab} = \frac{\tfrac{3}{4} \cdot \tfrac{1}{2} + 1 \cdot (-\tfrac{5}{4})}{-\tfrac{7}{16}} = \frac{-\tfrac{7}{8}}{-\tfrac{7}{16}} = 2,yˉ=bc+mdmnab=112+34(54)716=716716=1.\bar y = \frac{b c + m d}{mn - ab} = \frac{1 \cdot \tfrac{1}{2} + \tfrac{3}{4} \cdot (-\tfrac{5}{4})}{-\tfrac{7}{16}} = \frac{-\tfrac{7}{16}}{-\tfrac{7}{16}} = 1.

So the stationary point sits at (xˉ,yˉ)=(2,1)(\bar x, \bar y) = (2, 1) — by coincidence the same coordinates as the equilibrium in the previous scenario. Both coordinates are strictly positive, so it still qualifies as an equilibrium point (even though it is not an attractive one). The negative baseline d<0d < 0 is what makes the positivity possible: with all six constants positive, the previous-section argument predicted that detA<0\det A < 0 would force the stationary point’s coordinates to be negative — and indeed, swapping dd for any positive value here would push the equilibrium into the negative quadrant, an unphysical place for two military budgets. The negative baseline flips the numerator’s sign and brings the equilibrium back into the positive quadrant.

Take the starting state (x0,y0)=(54,94)(x_0, y_0) = (\tfrac{5}{4}, \tfrac{9}{4}): country XX starts close to its equilibrium value of 22, while country YY starts well above its equilibrium of 11.

Phase portrait for this scenario. The blue dot marks the starting state (x0,y0)=(54,94)(x_0, y_0) = (\tfrac{5}{4}, \tfrac{9}{4}); the blue curve is the trajectory running forward in time; the red dot is the stationary point (xˉ,yˉ)=(2,1)(\bar x, \bar y) = (2, 1), not an attractor here since one eigenvalue is positive. The trajectory bends in toward the red dot along the stable eigendirection (the negative-eigenvalue one), then catches the unstable eigendirection (the positive-eigenvalue one) and shoots out of the visible window.

Same trajectory plotted against time, with x(t)x(t) in red and y(t)y(t) in green over t[0,10]t \in [0, 10]. Both budgets first dip briefly toward their equilibrium values — XX from 54\tfrac{5}{4} toward 22, YY from 94\tfrac{9}{4} toward 11 — but past about t4t \approx 4 the growing exponential component (at rate 14\tfrac{1}{4}) takes over and both climb without bound.

The two views agree: the equilibrium is real but unreachable. A trajectory approaches it only long enough for the decaying exponential component (rate 74-\tfrac{7}{4}) to fade out, after which the growing component (rate 14\tfrac{1}{4}) takes over and pushes the state apart exponentially. The stationary point still exists in principle — sit a budget pair exactly at (2,1)(2, 1) and neither side ever changes — but no nearby trajectory ever lands there.

This is the mathematical form of the argument peace movements made against the Cold War’s pro-arms-race politicians: you keep buying more and more, and there is no end in sight. An equilibrium of mutual restraint may exist on paper, but the dynamics push every actual trajectory away from it. No ceiling, no balance, just exponential escalation.

Spiral

The third scenario keeps the symmetric magnitudes m=n=34m = n = \tfrac{3}{4} and a=b=1|a| = |b| = 1 from the previous one, but flips the sign of bb — producing an asymmetric cross-response between the two countries.

(x˙(t)y˙(t))=(3/4113/4)(x(t)y(t))+(05/2).\begin{pmatrix} \dot x(t) \\ \dot y(t) \end{pmatrix} = \begin{pmatrix} -3/4 & 1 \\ -1 & -3/4 \end{pmatrix} \begin{pmatrix} x(t) \\ y(t) \end{pmatrix} + \begin{pmatrix} 0 \\ 5/2 \end{pmatrix}.

The constants are now m=n=34m = n = \tfrac{3}{4}, a=1a = 1, b=1b = -1, c=0c = 0, d=52d = \tfrac{5}{2}. Two of them sit outside the model definition’s strict a,b,c,d,m,n>0a, b, c, d, m, n > 0 requirement, and need framing.

The sign flip on bb is the substantial one. The model originally treats bb as YY‘s armament rate — a positive coefficient measuring how strongly YY matches XX‘s spending. A negative bb inverts that reading entirely: YY now reacts to XX‘s escalation by decreasing its own budget rather than increasing it. Read as a national posture, YY has gone concessive — the more XX arms, the less we arm — a kind of unilateral restraint in the face of rival escalation. XX on the other hand still behaves conventionally (a>0a > 0, “we match the rival”). So the system is no longer describing two superpowers locked in mutual escalation; it is describing a mismatched pair, one aggressive country and one peace-leaning one.

The c=0c = 0 is the milder deviation: XX has no constant baseline push toward arming, only its rival-response and self-restraint terms. It sits at the boundary of the model’s c>0c > 0 requirement rather than violating it.

The determinant of the coefficient matrix is

detA=(34)(34)1(1)=916+1=2516>0.\det A = (-\tfrac{3}{4})(-\tfrac{3}{4}) - 1 \cdot (-1) = \tfrac{9}{16} + 1 = \tfrac{25}{16} > 0.

By the analysis above, the system has a unique stationary point (since detA0\det A \neq 0), and the eigenvalue-based attractive verdict still applies: trA=32<0\operatorname{tr} A = -\tfrac{3}{2} < 0 together with detA>0\det A > 0 forces both eigenvalues to have negative real parts, the signature of an attractor. But the eigenvalues themselves now come out complex rather than real. Solving det(AλI)=0\det(A - \lambda I) = 0:

λ1,2=34±i,\lambda_{1,2} = -\tfrac{3}{4} \pm i,

a complex-conjugate pair with negative real part 34-\tfrac{3}{4} and imaginary parts ±1\pm 1. So the system has an attractive equilibrium, but the imaginary parts add rotation to the radial attraction — trajectories don’t just approach the equilibrium, they spiral into it.

Computing the stationary point (xˉ,yˉ)(\bar x, \bar y)

Same formulas as the previous scenarios, applied to the new constants:

xˉ=nc+admnab=340+1522516=522516=85,\bar x = \frac{n c + a d}{mn - ab} = \frac{\tfrac{3}{4} \cdot 0 + 1 \cdot \tfrac{5}{2}}{\tfrac{25}{16}} = \frac{\tfrac{5}{2}}{\tfrac{25}{16}} = \frac{8}{5},yˉ=bc+mdmnab=(1)0+34522516=1582516=65.\bar y = \frac{b c + m d}{mn - ab} = \frac{(-1) \cdot 0 + \tfrac{3}{4} \cdot \tfrac{5}{2}}{\tfrac{25}{16}} = \frac{\tfrac{15}{8}}{\tfrac{25}{16}} = \frac{6}{5}.

So the equilibrium sits at (xˉ,yˉ)=(85,65)(\bar x, \bar y) = (\tfrac{8}{5}, \tfrac{6}{5}). Both coordinates are strictly positive — even with b<0b < 0 and c=0c = 0 outside the model’s strict requirements, the positivity falls out cleanly: c=0c = 0 kills the bcbc and ncnc terms (where b<0b < 0 would otherwise matter), leaving each numerator with a single positive contribution from dd, and the denominator detA=2516\det A = \tfrac{25}{16} is positive too. So this is an equilibrium point, and combined with the eigenvalue verdict above, an attractive equilibrium — specifically of the spiral kind.

Take the starting state (x0,y0)=(12,114)(x_0, y_0) = (\tfrac{1}{2}, \tfrac{11}{4}): country XX starts at a low budget, YY at a notably high one, both well off the equilibrium.

Phase portrait for this scenario. The blue dot marks the starting state (x0,y0)=(12,114)(x_0, y_0) = (\tfrac{1}{2}, \tfrac{11}{4}); the blue curve is the trajectory running forward in time; the red dot is the attractive equilibrium (xˉ,yˉ)=(85,65)(\bar x, \bar y) = (\tfrac{8}{5}, \tfrac{6}{5}). The trajectory curls partway around the equilibrium before tightening into it — the visual signature of complex eigenvalues with negative real part, where the rotation (from the imaginary parts ±1\pm 1) sweeps the path around the equilibrium while the radial pull (from the real part 34-\tfrac{3}{4}) tightens it inward.

Same trajectory plotted against time, with x(t)x(t) in red and y(t)y(t) in green. Each budget overshoots its equilibrium value before settling: XX climbs from 12\tfrac{1}{2} past 85\tfrac{8}{5} to a peak around 22, then drifts back down to 85\tfrac{8}{5}; YY falls from 114\tfrac{11}{4} past 65\tfrac{6}{5} to a low near 1.11.1, then rises back to 65\tfrac{6}{5}. The overshoot is the time-domain signature of the imaginary parts ±1\pm 1; the eventual settling, of the negative real part 34-\tfrac{3}{4}.

The two views agree: even with YY‘s unconventional cross-response — retreating in response to XX‘s escalation rather than matching it — the system still settles into a stable, positive arms balance. The asymmetric strategy doesn’t destabilize anything; it just changes the manner in which the equilibrium is reached, from the monotone approach of the first scenario to a spiraling one with overshoot before convergence. A behavioral pattern that looks counterintuitive — one side giving in while the other escalates — can settle into a stable balance just as readily as the symmetric “both restrained” case, in this model. It merely takes a more roundabout path to get there.

One caveat worth naming, now that all three scenarios have played out. An attractive equilibrium guarantees the budgets converge to a finite pair (xˉ,yˉ)(\bar x, \bar y) — but it says nothing about what those values are. Plug in different baselines, restraints, and cross-pressures and the same kind of attractor can land at (10,10)(10, 10), at (10,109)(10, 10^9), or anywhere else in the positive quadrant. “Peace through balance” only reads as peaceful if the balance itself is one humans would recognize as peaceful: a scenario where one country settles at 1010 tanks while the rival settles at a billion is mathematically still an attractive equilibrium — the dynamics hold the imbalance steady — but it is not what the politicians arguing for the arms race had in mind. The model classifies whether a system converges; whether the destination it converges to is desirable is a separate question, decided by the equilibrium’s actual coordinates and how lopsided they are relative to each other.

There is a deeper caveat too, and it questions the word stable itself. The eigenvalue verdict is a statement about the trajectories of two budgets: started near the equilibrium, they return to it. It is not a statement about whether the two governments will accept the balance the model predicts. Picture an equilibrium that the constants happen to place at (x,y)=(100,1)(x, y) = (100, 1), with country XX a hundred times better armed than its rival. The dynamics call this stable; the strategic logic of the Cold War might not, since a side that finds itself overwhelmingly ahead may simply attack, equilibrium or no equilibrium. Mathematical stability is about where the curves go, not about whether the actors tracing them will sit still once they arrive.

That gap points at something the model leaves out. Each country in the arms-race system reacts to its own budget through the brake and to the rival’s budget through the driver, but never to the difference between the two. A fuller model would make the gap x(t)y(t)x(t) - y(t) a force of its own: a large positive gap, with XX far ahead, should drive YY to arm and close the distance, while a large negative gap should let XX ease off — the comparative logic of a two-power standard, the doctrine behind Britain’s Naval Defence Act of 1889, which held that the Royal Navy be kept at least as strong as the next two largest navies combined. Folding such difference-driven terms into the equations is the natural next refinement. Rather than chase it, we step back up to the general theory the arms race has been a deliberately linear special case of: two genuinely interacting species, with the eigenvalue criterion applied to them directly.

The two-species Jacobian

The arms race was a linear stand-in; the genuine two-species model has growth rates ff and gg that may depend on both populations in any way at all, so analyzing its equilibria means applying the eigenvalue criterion to the system as it stands. Collect the two right-hand sides into a single vector-valued function

F(p,q)=(f(p,q)pg(p,q)q),F(p, q) = \begin{pmatrix} f(p, q)\, p \\ g(p, q)\, q \end{pmatrix},

whose roots (the pairs (pˉ,qˉ)(\bar p, \bar q) where it is zero) are exactly the stationary points of the system. We already know which of those roots matter most: when both components of a stationary point are strictly positive, it is an equilibrium, a state where the two species genuinely coexist. The criterion from linear stability analysis reads the verdict off the Jacobian of FF at that equilibrium: the equilibrium (pˉ,qˉ)(\bar p, \bar q) is attractive when every eigenvalue of JF(pˉ,qˉ)J_F(\bar p, \bar q) has a negative real part. This is a sufficient condition, taken from the stability theory rather than re-derived here.

To build that Jacobian, differentiate FF at the equilibrium (pˉ,qˉ)(\bar p, \bar q) entry by entry. The off-diagonal entries are single partial derivatives, but each diagonal entry differentiates a product of a growth rate and its own population, so the product rule adds one extra term:

JF(pˉ,qˉ)=(fp(pˉ,qˉ)pˉ+f(pˉ,qˉ)fq(pˉ,qˉ)pˉgp(pˉ,qˉ)qˉgq(pˉ,qˉ)qˉ+g(pˉ,qˉ)),J_F(\bar p, \bar q) = \begin{pmatrix} f_p(\bar p, \bar q)\, \bar p + f(\bar p, \bar q) & f_q(\bar p, \bar q)\, \bar p \\ g_p(\bar p, \bar q)\, \bar q & g_q(\bar p, \bar q)\, \bar q + g(\bar p, \bar q) \end{pmatrix},

where a subscript denotes a partial derivative, fp=f/pf_p = \partial f / \partial p and so on. Now use the defining property of the equilibrium: there both growth rates vanish, f(pˉ,qˉ)=g(pˉ,qˉ)=0f(\bar p, \bar q) = g(\bar p, \bar q) = 0, so the two product-rule leftovers on the diagonal disappear, leaving the compact form

JF(pˉ,qˉ)=(fp(pˉ,qˉ)pˉfq(pˉ,qˉ)pˉgp(pˉ,qˉ)qˉgq(pˉ,qˉ)qˉ).J_F(\bar p, \bar q) = \begin{pmatrix} f_p(\bar p, \bar q)\, \bar p & f_q(\bar p, \bar q)\, \bar p \\ g_p(\bar p, \bar q)\, \bar q & g_q(\bar p, \bar q)\, \bar q \end{pmatrix}.

The eigenvalues of this 2×22 \times 2 matrix carry the verdict, and what they come out to depends entirely on the signs of its four partial derivatives. Those signs are set by how the two species actually affect each other — so this is the point where the biology of the situation enters the math. Three standard constellations describe the ways two species can be wired together, told apart by how each species’ growth responds to the other being around:

  • competition (also concurrence): neither species hunts the other, but both need the same food, water, and territory, so more of one species leaves less to go around for the other — lions and leopards living off the same prey.
  • predator–prey: one species is the other’s food, so more prey lets the predators multiply, while more predators thin out the prey — foxes and rabbits.
  • symbiosis: each species does better when the other is around, so the two populations help each other grow.

The next sections work through the first two in detail. Each one fixes the signs of fp,fq,gp,gqf_p, f_q, g_p, g_q differently and gets a different equilibrium story out of the very same Jacobian.

Competition

In a competition scenario the two species are not predator and prey — neither eats the other — but they fight over the same finite resources: the same prey, the same water, the same territory. Lions and leopards on one savanna are the stock picture. The defining feature is that every influence, within a species and between the species, is negative. More of either population is bad for the growth of either species:

fp(p,q), fq(p,q), gp(p,q), gq(p,q)  <  0for p,q>0.f_p(p, q), \ f_q(p, q), \ g_p(p, q), \ g_q(p, q) \;<\; 0 \qquad \text{for } p, q > 0.

Read term by term, fp(p,q)<0f_p(p, q) < 0 says PP‘s own crowding slows PP (a lion is hindered by too many other lions chasing the same kill), and fq(p,q)<0f_q(p, q) < 0 says QQ‘s presence slows PP as well (leopards taking a share of that kill). The growth rate gg of QQ tells the mirror-image story through gp(p,q)g_p(p, q) and gq(p,q)g_q(p, q). Everyone is disturbed by everyone.

These signs do most of the stability work for free. With all four partial derivatives negative, the Jacobian JF(pˉ,qˉ)J_F(\bar p, \bar q) from the previous section automatically has a negative trace — its diagonal entries fp(pˉ,qˉ)pˉf_p(\bar p, \bar q)\, \bar p and gq(pˉ,qˉ)qˉg_q(\bar p, \bar q)\, \bar q are both negative, since the populations are positive. So the only thing left standing between this system and an attractive equilibrium is the sign of the determinant, and the sufficient condition is

fp(pˉ,qˉ)gq(pˉ,qˉ)fq(pˉ,qˉ)gp(pˉ,qˉ)>0.f_p(\bar p, \bar q)\, g_q(\bar p, \bar q) - f_q(\bar p, \bar q)\, g_p(\bar p, \bar q) > 0.

In words: the product of the two self-influences must outweigh the product of the two cross-influences — each species must interfere with itself more than it interferes with the other. Biologically that is the usual case: a lion contends daily with the rest of its own pride, while the leopards a couple of valleys over barely register.

Why negative trace and positive determinant mean attractive

The condition above is exactly a positive-determinant condition on the Jacobian. Recall its form at the equilibrium,

JF(pˉ,qˉ)=(fp(pˉ,qˉ)pˉfq(pˉ,qˉ)pˉgp(pˉ,qˉ)qˉgq(pˉ,qˉ)qˉ).J_F(\bar p, \bar q) = \begin{pmatrix} f_p(\bar p, \bar q)\, \bar p & f_q(\bar p, \bar q)\, \bar p \\ g_p(\bar p, \bar q)\, \bar q & g_q(\bar p, \bar q)\, \bar q \end{pmatrix}.

Pulling the shared factor pˉ\bar p out of the top row and qˉ\bar q out of the bottom row, its determinant factors as

detJF(pˉ,qˉ)=pˉqˉ(fp(pˉ,qˉ)gq(pˉ,qˉ)fq(pˉ,qˉ)gp(pˉ,qˉ)),\det J_F(\bar p, \bar q) = \bar p\, \bar q \,\big(f_p(\bar p, \bar q)\, g_q(\bar p, \bar q) - f_q(\bar p, \bar q)\, g_p(\bar p, \bar q)\big),

and since pˉ,qˉ>0\bar p, \bar q > 0 at an equilibrium, detJF(pˉ,qˉ)>0\det J_F(\bar p, \bar q) > 0 holds exactly when that bracketed combination is positive — the sufficient condition stated above. Together with the negative trace, two eigenvalue identities finish the argument:

Same-sign eigenvalues that add to a negative number can only both be negative (or, when they are a complex-conjugate pair, have negative real part). Either way every eigenvalue has a negative real part, so the equilibrium is attractive. This is the same trace-and-determinant shortcut that settled the arms race.

To turn the scenario into something solvable, take the simplest growth rates that respect the competition signs — linear ones:

f(p,q)=a1+a2p+a3q,g(p,q)=a4+a5p+a6q,\begin{aligned} f(p, q) &= a_1 + a_2\, p + a_3\, q, \\ g(p, q) &= a_4 + a_5\, p + a_6\, q, \end{aligned}

a baseline plus one coefficient per population. The competition assumptions pin down every sign: the baselines a1,a4>0a_1, a_4 > 0 (each species can grow while both populations are small), and the four interaction coefficients a2,a3,a5,a6<0a_2, a_3, a_5, a_6 < 0 (every crowding effect hurts). These coefficients are the partial derivatives — fp=a2f_p = a_2, fq=a3f_q = a_3, gp=a5g_p = a_5, gq=a6g_q = a_6, all constant now — so the attractiveness condition fpgqfqgp>0f_p g_q - f_q g_p > 0 becomes a plain inequality among them,

a2a6a3a5>0,i.e.a2a6>a3a5:a_2 a_6 - a_3 a_5 > 0, \qquad \text{i.e.} \qquad a_2 a_6 > a_3 a_5:

self-interference beats cross-interference, exactly as before.

The growth rates ff and gg are linear here, but the system itself is not. Each right-hand side f(p,q)pf(p, q)\, p and g(p,q)qg(p, q)\, q is a linear function times a population, hence quadratic in (p,q)(p, q) — unlike the arms race, whose right-hand sides were genuinely linear. That is why the Jacobian really does change from point to point, and why it has to be evaluated at the equilibrium rather than read off once and for all.

Because the combination a2a6a3a5a_2 a_6 - a_3 a_5 is also the determinant of the linear system f=g=0f = g = 0, the same inequality that buys attractiveness also makes that system non-degenerate: it has a unique solution, a single stationary point, automatically attractive. The one thing the signs do not yet guarantee is that this stationary point is a real equilibrium, with both populations strictly positive. That last check is the next step.

Solving f=g=0f = g = 0 is a two-equation, two-unknown problem, and the determinant a2a6a3a5a_2 a_6 - a_3 a_5 — nonzero by the attractiveness condition — is exactly what lets it be solved uniquely. Cramer’s rule gives

pˉ=a3a4a1a6a2a6a3a5,qˉ=a1a5a4a2a2a6a3a5.\bar p = \frac{a_3 a_4 - a_1 a_6}{a_2 a_6 - a_3 a_5}, \qquad \bar q = \frac{a_1 a_5 - a_4 a_2}{a_2 a_6 - a_3 a_5}.
Solving the system for (pˉ,qˉ)(\bar p, \bar q)

Move the baselines to the right-hand side to put the system in standard form,

a2pˉ+a3qˉ=a1,a5pˉ+a6qˉ=a4,\begin{aligned} a_2\, \bar p + a_3\, \bar q &= -a_1, \\ a_5\, \bar p + a_6\, \bar q &= -a_4, \end{aligned}

whose coefficient matrix is (a2a3a5a6)\begin{pmatrix} a_2 & a_3 \\ a_5 & a_6 \end{pmatrix} with determinant a2a6a3a5a_2 a_6 - a_3 a_5. Cramer’s rule replaces one column at a time with the right-hand side:

pˉ=det(a1a3a4a6)a2a6a3a5=a3a4a1a6a2a6a3a5,qˉ=det(a2a1a5a4)a2a6a3a5=a1a5a4a2a2a6a3a5.\bar p = \frac{\det\begin{pmatrix} -a_1 & a_3 \\ -a_4 & a_6 \end{pmatrix}}{a_2 a_6 - a_3 a_5} = \frac{a_3 a_4 - a_1 a_6}{a_2 a_6 - a_3 a_5}, \qquad \bar q = \frac{\det\begin{pmatrix} a_2 & -a_1 \\ a_5 & -a_4 \end{pmatrix}}{a_2 a_6 - a_3 a_5} = \frac{a_1 a_5 - a_4 a_2}{a_2 a_6 - a_3 a_5}.

Every entry of both numerator matrices is in fact negative: the substituted column carries a1-a_1 and a4-a_4, negative because the baselines a1,a4a_1, a_4 are positive, and the remaining coefficients a2,a3,a5,a6a_2, a_3, a_5, a_6 are already negative by the competition assumptions. So in each determinant the two products are positive — each is a negative times a negative — and the minus sign that appears in the numerator is the one built into the determinant formula adbcad - bc, not a sign carried by any of the coefficients.

The denominator is the determinant, positive by assumption; a zero denominator would signal no unique solution — the degenerate case held off until later. So the stationary point is well-defined and, as established, attractive. Whether it counts as an equilibrium rides only on the positivity check pˉ>0\bar p > 0 and qˉ>0\bar q > 0, and working those two inequalities through the coefficient signs collapses them into a single chain:

a2a5>a1a4>a3a6.\frac{a_2}{a_5} > \frac{a_1}{a_4} > \frac{a_3}{a_6}.
Where the positivity chain comes from

Both fractions pˉ\bar p and qˉ\bar q share the positive denominator a2a6a3a5>0a_2 a_6 - a_3 a_5 > 0, so each is positive exactly when its numerator is.

For qˉ>0\bar q > 0 we need a1a5a4a2>0a_1 a_5 - a_4 a_2 > 0, i.e. a1a5>a2a4a_1 a_5 > a_2 a_4. Divide both sides by a4a5a_4 a_5; since a4>0a_4 > 0 and a5<0a_5 < 0 the product a4a5a_4 a_5 is negative, which flips the inequality:

a1a4<a2a5.\frac{a_1}{a_4} < \frac{a_2}{a_5}.

For pˉ>0\bar p > 0 we need a3a4a1a6>0a_3 a_4 - a_1 a_6 > 0, i.e. a3a4>a1a6a_3 a_4 > a_1 a_6. Divide by a4a6a_4 a_6, again negative (since a4>0a_4 > 0, a6<0a_6 < 0), flipping the inequality:

a3a6<a1a4.\frac{a_3}{a_6} < \frac{a_1}{a_4}.

Stack the two results and the chain a2a5>a1a4>a3a6\tfrac{a_2}{a_5} > \tfrac{a_1}{a_4} > \tfrac{a_3}{a_6} falls out. Each ratio is a quotient of two like-signed coefficients, so all three are positive numbers being ordered.

When the coefficients obey this ordering, both populations come out positive, the stationary point is a genuine coexistence equilibrium, and — attractiveness already baked in — the two competing species settle into it from any nearby start.

One boundary case is worth flagging now. When a2a6=a3a5a_2 a_6 = a_3 a_5 — self-interference and cross-interference in exact balance — the determinant vanishes, the unique-solution argument collapses, and the attractiveness condition fails along with it. The linear model can still be made sense of in this degenerate case, but the outcome changes character: instead of one coexistence point, the system can drift to a state where one species dies out altogether. Two such degenerate examples come later.

Competition: worked examples

The competition theory is concrete enough now to run on numbers. Each example below fixes the six coefficients a1,,a6a_1, \dots, a_6, checks the attractiveness condition a2a6a3a5>0a_2 a_6 - a_3 a_5 > 0 and the positivity of the resulting stationary point, then follows one trajectory both as a phase portrait and as a plot against time — the same two-panel reading used for the arms race. Together they walk through the cases the theory left open: a clean coexistence equilibrium, two flavors of extinction, and two degenerate systems where the attractiveness condition fails outright.

Equilibrium

The first example is the well-behaved one, where every condition the previous section asked for holds. The two linear growth rates are

f(p,q)=52+32458p324q,g(p,q)=78+332338p78q,\begin{aligned} f(p, q) &= \tfrac{5}{2} + \tfrac{\sqrt 3}{24} - \tfrac{5}{8}\,p - \tfrac{\sqrt 3}{24}\,q, \\ g(p, q) &= \tfrac{7}{8} + \tfrac{3\sqrt 3}{2} - \tfrac{3\sqrt 3}{8}\,p - \tfrac{7}{8}\,q, \end{aligned}

with coefficients a1=52+324a_1 = \tfrac{5}{2} + \tfrac{\sqrt 3}{24}, a2=58a_2 = -\tfrac{5}{8}, a3=324a_3 = -\tfrac{\sqrt 3}{24}, a4=78+332a_4 = \tfrac{7}{8} + \tfrac{3\sqrt 3}{2}, a5=338a_5 = -\tfrac{3\sqrt 3}{8}, a6=78a_6 = -\tfrac{7}{8}. The two baselines a1,a4a_1, a_4 are positive and the four interaction coefficients a2,a3,a5,a6a_2, a_3, a_5, a_6 are negative — exactly the competition sign pattern.

The attractiveness check is the determinant condition a2a6a3a5>0a_2 a_6 - a_3 a_5 > 0:

a2a6a3a5=(58)(78)(324)(338)=3564364=12>0.a_2 a_6 - a_3 a_5 = \left(-\tfrac{5}{8}\right)\left(-\tfrac{7}{8}\right) - \left(-\tfrac{\sqrt 3}{24}\right)\left(-\tfrac{3\sqrt 3}{8}\right) = \tfrac{35}{64} - \tfrac{3}{64} = \tfrac{1}{2} > 0.

Self-interference beats cross-interference, so the stationary point is unique and attractive. The quick certificate for that verdict is the pair of eigenvalues of the coefficient matrix A=(a2a3a5a6)A = \begin{pmatrix} a_2 & a_3 \\ a_5 & a_6 \end{pmatrix}, which here come out to 12-\tfrac{1}{2} and 1-1 — both real and negative. Negative eigenvalues mean trA<0\operatorname{tr} A < 0 and detA>0\det A > 0, and since the determinant a2a6a3a5a_2 a_6 - a_3 a_5 is exactly the bracketed factor in detJF(pˉ,qˉ)=pˉqˉ(a2a6a3a5)\det J_F(\bar p, \bar q) = \bar p\, \bar q\,(a_2 a_6 - a_3 a_5), the positive sign carries straight over to the Jacobian that actually governs stability. (The eigenvalues of AA are not themselves the eigenvalues of JFJ_F — that matrix scales the rows by pˉ\bar p and qˉ\bar q — but their signs are what the attractiveness argument needs, and those transfer.)

Solving the system for (pˉ,qˉ)(\bar p, \bar q)

Using the Cramer’s-rule solution from the previous section,

pˉ=a3a4a1a6a2a6a3a5,qˉ=a1a5a4a2a2a6a3a5,\bar p = \frac{a_3 a_4 - a_1 a_6}{a_2 a_6 - a_3 a_5}, \qquad \bar q = \frac{a_1 a_5 - a_4 a_2}{a_2 a_6 - a_3 a_5},

with the denominator the determinant 12\tfrac{1}{2} just computed. The 3\sqrt 3 pieces cancel in each numerator:

a3a4a1a6=324(78+332)+78(52+324)=948+3516=2,a_3 a_4 - a_1 a_6 = -\tfrac{\sqrt 3}{24}\left(\tfrac{7}{8} + \tfrac{3\sqrt 3}{2}\right) + \tfrac{7}{8}\left(\tfrac{5}{2} + \tfrac{\sqrt 3}{24}\right) = -\tfrac{9}{48} + \tfrac{35}{16} = 2,a1a5a4a2=338(52+324)+58(78+332)=9192+3564=12,a_1 a_5 - a_4 a_2 = -\tfrac{3\sqrt 3}{8}\left(\tfrac{5}{2} + \tfrac{\sqrt 3}{24}\right) + \tfrac{5}{8}\left(\tfrac{7}{8} + \tfrac{3\sqrt 3}{2}\right) = -\tfrac{9}{192} + \tfrac{35}{64} = \tfrac{1}{2},

where in each line the two 33=3\sqrt 3 \cdot \sqrt 3 = 3 rational leftovers combine and the lone 3\sqrt 3 terms cancel against each other. So pˉ=2/12=4\bar p = 2 / \tfrac{1}{2} = 4 and qˉ=12/12=1\bar q = \tfrac{1}{2} / \tfrac{1}{2} = 1.

Both coordinates of (pˉ,qˉ)=(4,1)(\bar p, \bar q) = (4, 1) are strictly positive, so the stationary point is a genuine coexistence equilibrium, and with the determinant verdict already in hand, an attractive one.

Take the starting state (p0,q0)=(14,3)(p_0, q_0) = (\tfrac{1}{4}, 3): species PP starts scarce, well below its equilibrium value of 44, while QQ starts crowded, three times its equilibrium of 11.

Phase portrait for this scenario. The blue dot marks the starting state (p0,q0)=(14,3)(p_0, q_0) = (\tfrac{1}{4}, 3); the blue curve is the trajectory running forward in time; the red dot is the attractive equilibrium (pˉ,qˉ)=(4,1)(\bar p, \bar q) = (4, 1). From any nearby start the vector field sweeps the state into the red dot.

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red over t[0,10]t \in [0, 10]. PP climbs from 14\tfrac{1}{4} up to its equilibrium value of 44 along a smooth S-shaped curve; QQ first rises above its starting value, then turns around and settles down to 11.

The two curves settle to the same equilibrium, but they get there in visibly different shapes — and the difference is the first genuinely two-species effect on this page. PP’s curve is the familiar logistic one: a scarce population growing into the room left for it, leveling off at its carrying value with no overshoot. QQ does something a single-species model can never produce. It climbs for a while, reaches a peak above its eventual level, and only then comes back down to settle at 11. That hump is the imprint of the other species: while PP is still scarce, QQ has the habitat largely to itself and grows past its long-run share; as PP fills in and starts competing for the same resources, QQ‘s growth rate is pushed negative and it recedes to the level the two can sustain together. A single rise-and-fall like this is the mildest form of the oscillation two coupled populations can show — not a numerical artifact or a special case, but the ordinary behavior of a system where each population’s fortunes depend on the other’s.

Because the equilibrium is attractive, it is also robust to a shove. Cull part of either population by hand and you have simply moved to a new nearby start; the same vector field takes the state back to (4,1)(4, 1). Both panels show this directly — every trajectory in the neighborhood of the red dot flows into it — so a one-time disturbance to the populations heals itself rather than knocking the system onto a different path.

Extinction of

The next example keeps the competition setup but breaks the attractiveness condition, and the result is one species dying out. The growth rates are

f(p,q)=7182312p2512q,g(p,q)=7382512p2312q,\begin{aligned} f(p, q) &= \tfrac{71}{8} - \tfrac{23}{12}\,p - \tfrac{25}{12}\,q, \\ g(p, q) &= \tfrac{73}{8} - \tfrac{25}{12}\,p - \tfrac{23}{12}\,q, \end{aligned}

so a2=2312a_2 = -\tfrac{23}{12}, a3=2512a_3 = -\tfrac{25}{12}, a5=2512a_5 = -\tfrac{25}{12}, a6=2312a_6 = -\tfrac{23}{12} — still all four negative, a legitimate competition model. But this time the determinant goes the wrong way:

a2a6a3a5=(2312)(2312)(2512)(2512)=529144625144=23<0.a_2 a_6 - a_3 a_5 = \left(-\tfrac{23}{12}\right)\left(-\tfrac{23}{12}\right) - \left(-\tfrac{25}{12}\right)\left(-\tfrac{25}{12}\right) = \tfrac{529}{144} - \tfrac{625}{144} = -\tfrac{2}{3} < 0.

Cross-interference now outweighs self-interference: each species hinders the other more than it hinders itself. The eigenvalues of the coefficient matrix AA make the consequence explicit — they are 4-4 and 16\tfrac{1}{6}, of opposite sign. A negative determinant forces exactly that split (the two eigenvalues multiply to detA<0\det A < 0, so they cannot share a sign), and one positive eigenvalue is all it takes to turn the stationary point into a saddle: attractive along one direction, repulsive along another, an attractor from no direction at all.

Solving the system for (pˉ,qˉ)(\bar p, \bar q)

Setting f=g=0f = g = 0 and clearing denominators (multiply each equation by 2424) gives

46pˉ+50qˉ=213,50pˉ+46qˉ=219.\begin{aligned} 46\,\bar p + 50\,\bar q &= 213, \\ 50\,\bar p + 46\,\bar q &= 219. \end{aligned}

Adding the two equations gives 96(pˉ+qˉ)=43296(\bar p + \bar q) = 432, i.e. pˉ+qˉ=92\bar p + \bar q = \tfrac{9}{2}; subtracting the first from the second gives 4pˉ4qˉ=64\,\bar p - 4\,\bar q = 6, i.e. pˉqˉ=32\bar p - \bar q = \tfrac{3}{2}. So pˉ=3\bar p = 3 and qˉ=32\bar q = \tfrac{3}{2}.

Here is the first subtlety. The stationary point (pˉ,qˉ)=(3,32)(\bar p, \bar q) = (3, \tfrac{3}{2}) has both coordinates positive, so by the definition it is a genuine coexistence equilibrium — a state where PP and QQ could in principle live side by side forever. What it is not is attractive. Because it is a saddle, almost every trajectory that comes near it is eventually pushed away, so the equilibrium exists on paper but plays no part in where the populations actually end up. It is a real equilibrium that the dynamics simply pass by.

Take the starting state (p0,q0)=(14,12)(p_0, q_0) = (\tfrac{1}{4}, \tfrac{1}{2}), both populations small.

Phase portrait for this scenario. The blue dot is the start (p0,q0)=(14,12)(p_0, q_0) = (\tfrac{1}{4}, \tfrac{1}{2}); the red dot ringed in red is the saddle equilibrium (pˉ,qˉ)=(3,32)(\bar p, \bar q) = (3, \tfrac{3}{2}). The trajectory rises away from the origin, bends well short of the equilibrium, and runs up the qq-axis: PP‘s population is driven toward zero while QQ survives. The ring marks a coexistence point the trajectory never reaches.

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red. Both populations shoot up at first while resources are plentiful, but as crowding sets in the stronger competitor wins out: q(t)q(t) climbs and levels off near the capacity it can hold on its own, while p(t)p(t) peaks, turns over, and decays toward zero. The early hump in p(t)p(t) is the same two-species rise-and-fall seen before — only here it is the prelude to extinction rather than to coexistence.

The second subtlety is visible in both panels at once: the trajectory runs into a boundary. In the phase portrait it climbs the qq-axis where p=0p = 0; in the time plot p(t)p(t) sinks to the bottom of the frame. That boundary is the extinction of PP — the state where one of the two populations has vanished and only QQ is left. The dynamics never reach the coexistence equilibrium; they carry the state to the edge of the positive quadrant, where the two-species problem collapses into a one-species one. What happens to the survivor after that is the subject of the next example.

What becomes of alone

With PP extinct, is the rest of time a golden age for QQ? Not really — and seeing why is a good check on the model. Once p=0p = 0, one of the two equations drops out entirely (there is no PP left to evolve), and the other has its pp-dependence switched off. Substituting p=0p = 0 into QQ‘s growth rate leaves

q˙(t)=g(0,q)q=(7382312q)q=738q2312q2.\dot q(t) = g(0, q)\, q = \left(\tfrac{73}{8} - \tfrac{23}{12}\, q\right) q = \tfrac{73}{8}\, q - \tfrac{23}{12}\, q^2.

This is no longer a two-species system at all. It is exactly the logistic growth model q˙=(abq)q\dot q = (a - b\,q)\,q, with a=738a = \tfrac{73}{8} and b=2312b = \tfrac{23}{12} — the same one-species equation studied earlier on this page. The survivor’s whole future is governed by the single-species theory the two-species framework was built on top of, which is the consistency one would hope for: knock a coexistence model down to one population and it should reduce to the one-population model, not to something foreign.

The logistic carrying capacity follows from the two constants,

K=ab=73/823/12=7312823=8761844.761,K = \frac{a}{b} = \frac{73/8}{23/12} = \frac{73 \cdot 12}{8 \cdot 23} = \frac{876}{184} \approx 4.761,

To turn that into an explicit curve over time, the logistic solution needs one more input: a starting value. That comes from the handoff between the two phases. Restart the clock so that t=0t = 0 is the moment PP goes extinct, and let q0q_0 be the size of QQ at that instant — reading it off the end of the previous example’s trajectory gives q04.8q_0 \approx 4.8. The general logistic solution is the formula derived earlier,

q(t)=aq0bq0+(abq0)eat,q(t) = \frac{a\, q_0}{b\, q_0 + (a - b\, q_0)\, e^{-a t}},

and it is now just a matter of plugging in the three numbers a=738a = \tfrac{73}{8}, b=2312b = \tfrac{23}{12}, and q04.8q_0 \approx 4.8. Doing so gives

q(t)43.89.20.075e9.125t,limtq(t)=ab4.761.q(t) \approx \frac{43.8}{9.2 - 0.075\, e^{-9.125\, t}}, \qquad \lim_{t \to \infty} q(t) = \frac{a}{b} \approx 4.761.

There is a small surprise in the numbers. QQ is found at q04.8q_0 \approx 4.8 the moment PP disappears, which is a touch above its solo carrying capacity of 4.7614.761 — while PP was still around, the two-species transient briefly carried QQ past the level it can hold on its own. With the competitor gone, the logistic dynamics ease that small excess back down, and QQ settles onto a/ba/b and stays there. The negative sign on the 0.075e9.125t0.075\, e^{-9.125 t} term in the denominator is the trace of that: it makes q(t)q(t) approach its limit from above rather than below, the descending branch of the logistic curve rather than the familiar S. So the end state is not a runaway QQ but a QQ resting at precisely the saturation level the one-species model predicts — the two-species story handing off cleanly to the one-species one.

Extinction of

The saddle example lost a species because its coexistence equilibrium repelled almost every trajectory. This next example reaches extinction too, but by an entirely different mechanism — and lining the two up shows that “one species dies out” can come from opposite stability pictures. The growth rates are

f(p,q)=7333274p3316q,g(p,q)=138+12333p134q,\begin{aligned} f(p, q) &= 7 - \tfrac{3\sqrt 3}{32} - \tfrac{7}{4}\,p - \tfrac{3\sqrt 3}{16}\,q, \\ g(p, q) &= -\tfrac{13}{8} + 12\sqrt 3 - 3\sqrt 3\,p - \tfrac{13}{4}\,q, \end{aligned}

so a2=74a_2 = -\tfrac{7}{4}, a3=3316a_3 = -\tfrac{3\sqrt 3}{16}, a5=33a_5 = -3\sqrt 3, a6=134a_6 = -\tfrac{13}{4}. The determinant this time is comfortably positive:

a2a6a3a5=(74)(134)(3316)(33)=91162716=4>0,a_2 a_6 - a_3 a_5 = \left(-\tfrac{7}{4}\right)\left(-\tfrac{13}{4}\right) - \left(-\tfrac{3\sqrt 3}{16}\right)\left(-3\sqrt 3\right) = \tfrac{91}{16} - \tfrac{27}{16} = 4 > 0,

and the eigenvalues of the coefficient matrix AA are 1-1 and 4-4, both real and negative. By every test from the theory section this is the good case: self-interference beats cross-interference, the stationary point is unique, and it is attractive. There is no saddle here — trajectories really do get pulled in.

Solving the system for (pˉ,qˉ)(\bar p, \bar q)

The Cramer’s-rule formulas give, with the determinant 44 in the denominator,

a3a4a1a6=3316(138+123)+134(73332)=274+914=16,a_3 a_4 - a_1 a_6 = -\tfrac{3\sqrt 3}{16}\left(-\tfrac{13}{8} + 12\sqrt 3\right) + \tfrac{13}{4}\left(7 - \tfrac{3\sqrt 3}{32}\right) = -\tfrac{27}{4} + \tfrac{91}{4} = 16,a1a5a4a2=33(73332)+74(138+123)=27329132=2,a_1 a_5 - a_4 a_2 = -3\sqrt 3\left(7 - \tfrac{3\sqrt 3}{32}\right) + \tfrac{7}{4}\left(-\tfrac{13}{8} + 12\sqrt 3\right) = \tfrac{27}{32} - \tfrac{91}{32} = -2,

with the 3\sqrt 3 terms cancelling in each line just as in the first example. So pˉ=164=4\bar p = \tfrac{16}{4} = 4 and qˉ=24=12\bar q = \tfrac{-2}{4} = -\tfrac{1}{2}.

And there is the catch. The attractive stationary point is (pˉ,qˉ)=(4,12)(\bar p, \bar q) = (4, -\tfrac{1}{2}), and its second coordinate is negative. A population of 12-\tfrac{1}{2} is not a thing in the world, so this point lies outside the positive quadrant where the model means anything — it is not an equilibrium, because an equilibrium has to have both coordinates strictly positive. So the system has a perfectly good attractor that no real trajectory can ever occupy, because reaching it would require QQ to go negative.

What the trajectory does instead is head toward that out-of-bounds attractor and hit the floor on the way. As the state is drawn down toward q=12q = -\tfrac{1}{2}, the QQ-population falls through every positive value and presses against q=0q = 0 — extinction of QQ — while PP climbs toward its share of the doomed attractor near 44. The axis q=0q = 0 can’t be crossed (no population goes negative under these dynamics), so the realized end state is QQ extinct and PP settling onto the carrying capacity it holds on its own.

Take the starting state (p0,q0)=(14,12)(p_0, q_0) = (\tfrac{1}{4}, \tfrac{1}{2}), the same small-population start as before.

Phase portrait for this scenario. The blue dot is the start (p0,q0)=(14,12)(p_0, q_0) = (\tfrac{1}{4}, \tfrac{1}{2}); the trajectory swings up briefly and then is pulled down onto the pp-axis, where q=0q = 0. The attractor that is bending it down sits at (4,12)(4, -\tfrac{1}{2}), below the axis and off the bottom of the frame — so no equilibrium dot is drawn, because there is no equilibrium in the region the model lives in.

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red. q(t)q(t) jumps up at first while resources are abundant, then is dragged down to zero as the attractor pulls it below the axis; p(t)p(t) climbs and levels off near 44. The collapse of QQ is sharp because the dynamics here are fast.

The two extinction examples reach the same place — one species gone, the other holding at its solo capacity — from opposite mathematical situations. In the saddle case the coexistence equilibrium existed (both coordinates positive) but repelled trajectories, so the populations were pushed off it toward extinction. Here the stationary point attracts trajectories but doesn’t exist as an equilibrium (one coordinate negative), so the populations are pulled toward a place they can’t physically be, and extinction is what happens when they hit the boundary trying to get there. Existence without attractiveness, or attractiveness without existence — either gap is enough to cost a species. A genuine, lasting coexistence needs both at once.

Degeneration: parallel nullclines

The last two examples sit on the boundary the theory flagged: a2a6=a3a5a_2 a_6 = a_3 a_5, where the determinant is exactly zero and the whole machinery of “unique stationary point, automatically attractive” stops applying. The growth rates are deliberately simple,

f(p,q)=4p2q,g(p,q)=62p4q,\begin{aligned} f(p, q) &= 4 - p - 2q, \\ g(p, q) &= 6 - 2p - 4q, \end{aligned}

and the determinant condition fails right at the edge:

a2a6a3a5=(1)(4)(2)(2)=44=0.a_2 a_6 - a_3 a_5 = (-1)(-4) - (-2)(-2) = 4 - 4 = 0.

To see what a zero determinant does to the geometry, it helps to picture two special lines in the (p,q)(p, q)-plane. On the line where f=0f = 0, the growth rate of PP is zero, so p˙=fp=0\dot p = f\,p = 0 and PP momentarily stops changing; on the line where g=0g = 0, the growth rate of QQ is zero, so q˙=gq=0\dot q = g\,q = 0 and QQ momentarily stops changing. A line on which one of the two populations holds still like this is called a nullclinenull because a rate of change is zero along it. So the system has a PP-nullcline, the line f=0f = 0, and a QQ-nullcline, the line g=0g = 0.

Phase portrait for this scenario. The two parallel nullclines are drawn in: f=0f = 0 (orange) and g=0g = 0 (violet), never crossing. The red dots are the two stationary states (4,0)(4, 0) and (0,32)(0, \tfrac{3}{2}) where the nullclines meet the axes. From the start (p0,q0)=(1,4)(p_0, q_0) = (1, 4) (blue dot) the trajectory drops as both populations decline, then bends right along the pp-axis as QQ dies out and PP recovers, ending on (4,0)(4, 0).

A point where the two nullclines cross is one where PP and QQ stop changing at the very same instant — which is exactly the coexistence stationary point the system f=g=0f = g = 0 asks for. Finding that stationary point is therefore the same as finding where the two lines intersect. Here, though, the two nullclines turn out to be parallel and never cross, so there is no such point: no coexistence stationary point at all. That is what the zero determinant looks like geometrically.

The two nullclines, and why they never meet

Each nullcline is a straight line, found from its two axis intercepts.

For f=0f = 0, i.e. 4p2q=04 - p - 2q = 0: setting q=0q = 0 gives p=4p = 4, and setting p=0p = 0 gives q=2q = 2. So f=0f = 0 is the line through (4,0)(4, 0) and (0,2)(0, 2).

For g=0g = 0, i.e. 62p4q=06 - 2p - 4q = 0: dividing by 22 first gives the tidier 3p2q=03 - p - 2q = 0, with intercepts p=3p = 3 (at q=0q = 0) and q=32q = \tfrac{3}{2} (at p=0p = 0). So g=0g = 0 is the line through (3,0)(3, 0) and (0,32)(0, \tfrac{3}{2}).

Both lines have the same slope — each is a line of constant p+2qp + 2q — so they are parallel. Writing the system f=g=0f = g = 0 in matrix form makes the failure algebraic rather than visual:

(1224)(pq)=(46).\begin{pmatrix} 1 & 2 \\ 2 & 4 \end{pmatrix} \begin{pmatrix} p \\ q \end{pmatrix} = \begin{pmatrix} 4 \\ 6 \end{pmatrix}.

The coefficient matrix has determinant 1422=01 \cdot 4 - 2 \cdot 2 = 0, so it is non-invertible and the system has no unique solution. Dividing the second row by 22 exposes the contradiction directly:

p+2q=4andp+2q=3,p + 2q = 4 \qquad \text{and} \qquad p + 2q = 3,

two demands on the same quantity p+2qp + 2q that can never both hold. The system is not just short of a unique solution — it has no solution. Geometrically, the two parallel lines never meet.

No coexistence point, then. But the system is not without stationary states — they just sit on the axes instead of the interior. A state is stationary when p˙=fp=0\dot p = f\,p = 0 and q˙=gq=0\dot q = g\, q = 0. With ff and gg never simultaneously zero, the only way to satisfy both is to send one of the populations to zero, which kills one product regardless of the growth rate:

  • q=0q = 0 together with f=0f = 0: the second equation holds because q=0q = 0; the first needs f=0f = 0, i.e. 4p=04 - p = 0, giving the point (4,0)(4, 0).
  • p=0p = 0 together with g=0g = 0: the first equation holds because p=0p = 0; the second needs g=0g = 0, i.e. 64q=06 - 4q = 0, giving the point (0,32)(0, \tfrac{3}{2}).

These two points, (4,0)(4, 0) and (0,32)(0, \tfrac{3}{2}), are where each nullcline crosses an axis. Strictly they are stationary states, not coexistence equilibria — each has one population already at zero, so neither describes two species living together. Each is the end of an extinction: (4,0)(4, 0) is ”QQ gone, PP holding at 44”, and (0,32)(0, \tfrac{3}{2}) is ”PP gone, QQ holding at 32\tfrac{3}{2}”. Until now every example had either one coexistence equilibrium or none; the degenerate case is the first with two stationary states to choose between.

And the system does choose, based on where it starts. Take (p0,q0)=(1,4)(p_0, q_0) = (1, 4): both growth rates are strongly negative there, so both populations fall at first, but qq — starting high and with the steeper rate — crashes far faster than pp. By the time the state nears the axes, QQ has effectively vanished, and with the competitor gone PP recovers and climbs to the capacity 44 it holds alone. The trajectory lands on (4,0)(4, 0).

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red. q(t)q(t) falls steeply from 44 to zero — extinction of QQ — while p(t)p(t) dips briefly and then climbs to settle at 44.

So the degenerate model still resolves to a definite outcome, but it has given up the clean story of the non-degenerate case. There is no coexistence equilibrium to attract anything; there are two extinction states instead, and which one the populations reach is decided by the starting balance rather than by the model alone. Tilt the initial populations the other way and the same equations would carry the system to (0,32)(0, \tfrac{3}{2}), extinguishing PP instead.

Degeneration: a line of equilibria

The determinant can vanish in a second, qualitatively different way. The previous example had parallel nullclines that never met; this one has nullclines that coincide entirely. The growth rates are

f(p,q)=8p2q,g(p,q)=162p4q,\begin{aligned} f(p, q) &= 8 - p - 2q, \\ g(p, q) &= 16 - 2p - 4q, \end{aligned}

with the same singular sign pattern,

a2a6a3a5=(1)(4)(2)(2)=44=0,a_2 a_6 - a_3 a_5 = (-1)(-4) - (-2)(-2) = 4 - 4 = 0,

but now gg is not merely parallel to ff — it is exactly twice it, g(p,q)=2f(p,q)g(p, q) = 2\,f(p, q). The two growth rates vanish on the very same line, p+2q=8p + 2q = 8. Where the parallel case had no coexistence point, this case has a coexistence point everywhere along a line: every state on p+2q=8p + 2q = 8 has both f=0f = 0 and g=0g = 0, so both p˙\dot p and q˙\dot q vanish there. The system has not one stationary point, and not none, but a whole continuum of them.

Why the system has infinitely many solutions

Writing f=g=0f = g = 0 in matrix form,

(1224)(pq)=(816),\begin{pmatrix} 1 & 2 \\ 2 & 4 \end{pmatrix} \begin{pmatrix} p \\ q \end{pmatrix} = \begin{pmatrix} 8 \\ 16 \end{pmatrix},

the coefficient matrix is the same singular one as in the parallel case, with determinant 1422=01 \cdot 4 - 2 \cdot 2 = 0. The difference is on the right. The second row is exactly twice the first — on both sides, since 28=162 \cdot 8 = 16 — so the second equation says nothing the first didn’t already. What looked like two constraints is really one, p+2q=8p + 2q = 8, and a single linear equation in two unknowns is satisfied by a whole line of (p,q)(p, q) pairs. This is the consistent version of rank deficiency: in the parallel case the second row was 2×2\times the first on the left but not on the right, an outright contradiction; here it matches on both sides, so instead of no solution there are infinitely many.

The stationary set is the segment of p+2q=8p + 2q = 8 inside the positive quadrant, running from (8,0)(8, 0) on the pp-axis to (0,4)(0, 4) on the qq-axis. Its interior points — like (2,3)(2, 3), (4,2)(4, 2), (6,1)(6, 1) — have both coordinates strictly positive, so unlike the parallel case these are genuine coexistence equilibria, and there is an unbroken continuum of them at every mixing ratio the line allows.

Phase portrait for this scenario. The red line is the continuum of stationary states p+2q=8p + 2q = 8, every point of it an equilibrium. The vector field on both sides points toward this line. From the start (p0,q0)=(14,3)(p_0, q_0) = (\tfrac{1}{4}, 3) (blue dot) the trajectory runs up to the line and halts where it meets it — a different start would halt at a different point of the same line.

What happens to a trajectory is now a question about a line rather than a point. Off the line, one of ff or gg is nonzero, so the populations move; the vector field everywhere points toward the line p+2q=8p + 2q = 8. A trajectory drifts until it reaches the line and then stops, because every point of the line is stationary. Which point it stops at is fixed entirely by where it started. Take (p0,q0)=(14,3)(p_0, q_0) = (\tfrac{1}{4}, 3): with PP scarce and QQ plentiful, the state climbs the short distance to the line and settles near the QQ-rich end of it.

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red. p(t)p(t) stays low while q(t)q(t) rises a little, and both flatten out the moment the state reaches the stationary line — this is just one of the infinitely many outcomes the model allows.

There is one more twist worth naming. Every point on that line is attractive, even though the determinant condition for attractiveness is violated outright (detA=0\det A = 0). The sufficient condition from the theory — negative trace and positive determinant — was always sufficient, not necessary: its failure does not prove a stationary point repels. Here the failure coincides with the richest stability picture on the page, a one-dimensional set of equilibria that draws in every nearby trajectory. What the degeneracy costs is not stability but determinacy: the model no longer predicts a single end state, only the line the end state must lie on. Pin down the outcome and you need more than the equations — you need the starting populations too.

Predator and prey

The other constellation worth working through in full is the predator–prey relationship, where one species is the other’s food. This is the asymmetric case. In competition every influence ran the same way — everyone hurts everyone — but here the two species are wired together with opposite signs: more prey is good for the predator, while more predators is bad for the prey.

Keep the roles fixed: let PP be the predator and QQ the prey, so QQ is what PP eats — foxes and rabbits are the stock picture. Three of the four influences are still negative, exactly as in competition, and only one flips sign:

fp(p,q), gp(p,q), gq(p,q)  <  0,fq(p,q)  >  0for p,q>0.f_p(p, q), \ g_p(p, q), \ g_q(p, q) \;<\; 0, \qquad f_q(p, q) \;>\; 0 \qquad \text{for } p, q > 0.

Reading them in turn: fp(p,q)<0f_p(p, q) < 0 is the predator’s own crowding (too many foxes chasing the same rabbits); gp(p,q)<0g_p(p, q) < 0 is the prey being thinned out by the predators (more foxes, fewer rabbits); gq(p,q)<0g_q(p, q) < 0 is the prey’s own crowding (rabbits competing among themselves for grass). The one that changes is fq(p,q)>0f_q(p, q) > 0: the predator’s growth rate rises with more prey around — a fox does better when rabbits are plentiful.

That single sign flip is what makes the predator–prey story oscillate rather than settle quietly. More rabbits feed more foxes; more foxes eat down the rabbits; fewer rabbits starve the foxes back down; and with the foxes thinned out the rabbits recover, starting the cycle over. The two populations chase each other around, rising and falling out of step. The full shape of those oscillations comes out of the simplest predator–prey model in the next section; here the goal is just the equilibrium analysis.

The same linear growth rates used for competition carry over,

f(p,q)=a1+a2p+a3q,g(p,q)=a4+a5p+a6q,\begin{aligned} f(p, q) &= a_1 + a_2\, p + a_3\, q, \\ g(p, q) &= a_4 + a_5\, p + a_6\, q, \end{aligned}

only with the predator–prey signs imposed on the coefficients. Since the coefficients are the partial derivatives — fp=a2f_p = a_2, fq=a3f_q = a_3, gp=a5g_p = a_5, gq=a6g_q = a_6 — the sign pattern reads off directly:

a2, a5, a6  <  0,a3  >  0.a_2, \ a_5, \ a_6 \;<\; 0, \qquad a_3 \;>\; 0.

Now comes the payoff. In the competition case, an attractive equilibrium needed an extra inequality — self-interference had to beat cross-interference, a2a6>a3a5a_2 a_6 > a_3 a_5. Here that condition holds for free: with the predator–prey signs, every stationary point that exists is automatically attractive. The whole stability question collapses into a single existence check — find the stationary point, and if both its coordinates are positive, it is an attractive equilibrium, with no determinant inequality left to verify.

Why every predator–prey equilibrium is automatically attractive

The verdict rides on the trace and determinant of the Jacobian at the equilibrium,

JF(pˉ,qˉ)=(fp(pˉ,qˉ)pˉfq(pˉ,qˉ)pˉgp(pˉ,qˉ)qˉgq(pˉ,qˉ)qˉ),J_F(\bar p, \bar q) = \begin{pmatrix} f_p(\bar p, \bar q)\, \bar p & f_q(\bar p, \bar q)\, \bar p \\ g_p(\bar p, \bar q)\, \bar q & g_q(\bar p, \bar q)\, \bar q \end{pmatrix},

the same trace-and-determinant shortcut used for competition. The trace is fp(pˉ,qˉ)pˉ+gq(pˉ,qˉ)qˉf_p(\bar p, \bar q)\, \bar p + g_q(\bar p, \bar q)\, \bar q, and since fp(pˉ,qˉ),gq(pˉ,qˉ)<0f_p(\bar p, \bar q), g_q(\bar p, \bar q) < 0 while pˉ,qˉ>0\bar p, \bar q > 0, it is negative — just as in the competition case. The determinant is where the sign flip pays off:

detJF(pˉ,qˉ)=pˉqˉ(fp(pˉ,qˉ)gq(pˉ,qˉ)fq(pˉ,qˉ)gp(pˉ,qˉ)).\det J_F(\bar p, \bar q) = \bar p\, \bar q\, \big(f_p(\bar p, \bar q)\, g_q(\bar p, \bar q) - f_q(\bar p, \bar q)\, g_p(\bar p, \bar q)\big).

Look at the bracket. The first product fp(pˉ,qˉ)gq(pˉ,qˉ)f_p(\bar p, \bar q)\, g_q(\bar p, \bar q) is a negative times a negative, so it is positive. The second product fq(pˉ,qˉ)gp(pˉ,qˉ)f_q(\bar p, \bar q)\, g_p(\bar p, \bar q) is a positive (fqf_q) times a negative (gpg_p), so it is negative — and it enters with a minus sign, making fq(pˉ,qˉ)gp(pˉ,qˉ)-f_q(\bar p, \bar q)\, g_p(\bar p, \bar q) positive too. The two positive pieces add rather than compete, so the bracket is positive no matter how large the cross-influences are, and detJF(pˉ,qˉ)>0\det J_F(\bar p, \bar q) > 0 automatically. With a negative trace and a positive determinant, the same two eigenvalue identities as before — the determinant is the product of the eigenvalues and the trace is their sum — force both eigenvalues to have negative real part, so the equilibrium is attractive. The competition case had to earn its positive determinant with an extra inequality; the predator–prey case gets it from the sign pattern alone.

So constructing a predator–prey equilibrium is shorter than the competition recipe — it drops the attractiveness test entirely:

  • Solve the 2×22 \times 2 system f=g=0f = g = 0 for the stationary point (pˉ,qˉ)(\bar p, \bar q). The same Cramer’s-rule formulas from the competition case apply, with the determinant a2a6a3a5a_2 a_6 - a_3 a_5 in the denominator — and that determinant is strictly positive by the argument above, so it never vanishes and the solution is unique.
  • Check that the calculated values are positive. If pˉ>0\bar p > 0 and qˉ>0\bar q > 0, the stationary point is a genuine coexistence equilibrium — and it is attractive, with nothing further to test.

The Lotka–Volterra model

The simplest predator–prey model strips the picture down to its bare bones, and it is the famous one: the Lotka–Volterra model, named for Alfred Lotka and Vito Volterra, who arrived at it independently in the 1920s. It throws away every within-species effect and keeps only the cross-species interaction — predators living or dying purely by how much prey there is, prey thriving or being eaten purely by how many predators there are.

In the linear model that means switching off the two self-influence coefficients, a2=a6=0a_2 = a_6 = 0 (no PP-on-PP crowding, no QQ-on-QQ crowding), while keeping the predator–prey signs on the rest. The exterior influences stay unbalanced, a3>0a_3 > 0 and a5<0a_5 < 0, and now the baselines are unbalanced too:

a2=a6=0,a3>0,a5<0,a1<0,a4>0.a_2 = a_6 = 0, \qquad a_3 > 0, \quad a_5 < 0, \qquad a_1 < 0, \quad a_4 > 0.

The two baseline signs carry the biology of an isolated species. The prey’s baseline a4>0a_4 > 0 says that left alone, with no predators around, the prey population grows — rabbits breed. The predator’s baseline a1<0a_1 < 0 says the opposite: with no prey to eat, the predators starve and decline. With the self-terms gone, the growth rates read

f(p,q)=a1+a3q,g(p,q)=a4+a5p,f(p, q) = a_1 + a_3\, q, \qquad g(p, q) = a_4 + a_5\, p,

each depending only on the other population — the predator’s fate set entirely by the prey supply, the prey’s fate set entirely by the predator pressure.

The equilibrium is now easy to write down, because each growth rate involves only one variable. Setting f=0f = 0 and g=0g = 0 gives

0<pˉ=a4a5,0<qˉ=a1a3,0 < \bar p = -\frac{a_4}{a_5}, \qquad 0 < \bar q = -\frac{a_1}{a_3},

and both come out positive on the predator–prey signs.

Solving for the equilibrium

With the self-terms gone, the two equations decouple. f(pˉ,qˉ)=a1+a3qˉ=0f(\bar p, \bar q) = a_1 + a_3\, \bar q = 0 involves only qˉ\bar q, giving qˉ=a1/a3\bar q = -a_1/a_3; and g(pˉ,qˉ)=a4+a5pˉ=0g(\bar p, \bar q) = a_4 + a_5\, \bar p = 0 involves only pˉ\bar p, giving pˉ=a4/a5\bar p = -a_4/a_5. Each is positive: qˉ=a1/a3\bar q = -a_1/a_3 is a negative (a1a_1) over a positive (a3a_3) with a leading minus sign, hence positive, and likewise pˉ=a4/a5\bar p = -a_4/a_5 is a positive over a negative with a minus sign in front. So the Lotka–Volterra equilibrium always exists in the positive quadrant — there is no positivity test to fail.

By the predator–prey result of the previous section, an equilibrium that exists ought to be attractive. But the Lotka–Volterra model sits exactly on the boundary of that argument, and the conclusion fails. With a2=a6=0a_2 = a_6 = 0, the Jacobian’s diagonal entries vanish, leaving

JF(pˉ,qˉ)=(0a3pˉa5qˉ0),J_F(\bar p, \bar q) = \begin{pmatrix} 0 & a_3\, \bar p \\ a_5\, \bar q & 0 \end{pmatrix},

whose trace is exactly zero. The trace was the part of the attractiveness argument that needed the self-influences to be negative; switch them off and the trace is no longer negative, only zero. The eigenvalues turn out to be purely imaginary — their real parts are zero, not negative.

Why the eigenvalues are purely imaginary

The eigenvalues of a 2×22 \times 2 matrix are fixed by its trace and determinant through the characteristic equation

λ2(trJF)λ+detJF=0.\lambda^2 - (\operatorname{tr} J_F)\,\lambda + \det J_F = 0.

Here the trace is zero, so the equation collapses to

λ2+detJF=0,i.e.λ=±detJF.\lambda^2 + \det J_F = 0, \qquad \text{i.e.} \qquad \lambda = \pm\sqrt{-\det J_F}.

The determinant is

detJF(pˉ,qˉ)=a3a5pˉqˉ,\det J_F(\bar p, \bar q) = -a_3 a_5\, \bar p\, \bar q,

which is positive: a3>0a_3 > 0 and a5<0a_5 < 0 make the product a3a5a_3 a_5 negative, so a3a5>0-a_3 a_5 > 0, and pˉ,qˉ>0\bar p, \bar q > 0. This is no surprise — the predator–prey analysis already showed detJF(pˉ,qˉ)>0\det J_F(\bar p, \bar q) > 0 for these signs. The square root of a negative number is imaginary, so

λ=±idetJF,\lambda = \pm i\sqrt{\det J_F},

a conjugate pair sitting exactly on the imaginary axis, with no real part at all.

A zero real part is precisely the case the attractiveness test cannot rule on. Attractiveness demanded eigenvalues with strictly negative real part; repulsion would need a positive real part; here the real part is neither, sitting exactly between the two. The equilibrium is therefore neither attractive nor repulsive. To say what it is, we need a notion of good behavior weaker than attractiveness — a population that doesn’t settle onto the equilibrium but doesn’t run away from it either.

Stability and the Lotka–Volterra orbit

The way out is the idea of stability. Attractiveness asked a lot: that nearby trajectories both stay close and converge onto the equilibrium. There is a softer property worth naming on its own — staying close without the requirement of converging.

A satellite in orbit is the picture to keep in mind. It never falls to the center of the Earth, and it never flies off into space; it just circles, caught at a roughly fixed distance, and without some outside push it stays caught there forever. That is a kind of stability — the orbit is a stable situation — even though the satellite never comes to rest at any single point. The Lotka–Volterra equilibrium is stable in exactly this orbital sense.

A stationary point (pˉ,qˉ)(\bar p, \bar q) is stable when trajectories that start near it stay near it for all later time — they need not converge to the point, only remain within a bounded neighborhood of it. It is unstable when some nearby start is carried far away.

Stability is a weaker demand than attractiveness, and it splits the earlier classification cleanly in two:

  • An attractive equilibrium is stable in the strongest way — nearby trajectories stay close and are pulled all the way in. A neutral center, whose trajectories circle the equilibrium forever on closed orbits (the borderline case in linear stability analysis), is stable as well: the orbits keep a fixed distance and never escape, even though they never arrive.
  • A repulsive equilibrium and a saddle are both unstable — in each, at least one nearby start is driven away.

In eigenvalue terms this is the same cutoff linear stability analysis draws, read for stability rather than for the finer node-versus-spiral distinction: an eigenvalue with negative real part means stable (attractive); a positive real part means unstable (repulsive or a saddle); and purely imaginary eigenvalues, real part exactly zero, are the neutral-center borderline — stable but not attractive.

The Lotka–Volterra equilibrium is exactly that last, borderline case: the purely imaginary pair found above marks a neutral center, so it is stable, and the populations circle it on closed orbits without ever settling down.

Make it concrete with a specific Lotka–Volterra system,

p˙=f(p,q)p,q˙=g(p,q)q,f(p,q)=12+1200q,g(p,q)=15150p.\dot p = f(p, q)\, p, \qquad \dot q = g(p, q)\, q, \qquad f(p, q) = -\tfrac{1}{2} + \tfrac{1}{200}\, q, \quad g(p, q) = \tfrac{1}{5} - \tfrac{1}{50}\, p.

The coefficients carry the Lotka–Volterra signs — no self-terms, baselines a1=12<0a_1 = -\tfrac{1}{2} < 0 and a4=15>0a_4 = \tfrac{1}{5} > 0, cross-influences a3=1200>0a_3 = \tfrac{1}{200} > 0 and a5=150<0a_5 = -\tfrac{1}{50} < 0 — so PP is the predator (it dies off without prey) and QQ the prey (it breeds on its own). The equilibrium follows from the two one-variable equations:

pˉ=a4a5=1/51/50=10,qˉ=a1a3=1/21/200=100.\bar p = -\frac{a_4}{a_5} = -\frac{1/5}{-1/50} = 10, \qquad \bar q = -\frac{a_1}{a_3} = -\frac{-1/2}{1/200} = 100.

So the populations balance at (pˉ,qˉ)=(10,100)(\bar p, \bar q) = (10, 100) — ten predators to a hundred prey, the predators the rarer of the two, as one would expect. By the analysis above this center is stable but not attractive, so a population started away from it should neither spiral in nor fly out, but loop around it forever.

Phase portrait of the Lotka–Volterra system. The red ring marks the equilibrium (10,100)(10, 100). The trajectory from the start (p0,q0)=(10,50)(p_0, q_0) = (10, 50) (blue dot) neither approaches the ring nor flees it — it traces a single closed loop around the center and returns to where it began, then repeats forever. Every other start traces its own closed loop at its own distance; the equilibrium is the still center they all circle, like satellites at different altitudes.

The same trajectory against time, with p(t)p(t) in green and q(t)q(t) in red. Both populations rise and fall in a steady cycle that repeats without damping — the signature of a neutral center. Predator and prey oscillate at the same period but out of step: each surge in the prey q(t)q(t) is followed, a little later, by a surge in the predators p(t)p(t) feeding on them, which then drives the prey back down — the chase described at the start of the section, drawn out in time.

Two features of this picture are worth drawing out. The first is that the closed orbit is not unique: it is just the loop this starting pair happens to sit on. Each initial condition picks out its own orbit, and the orbits nest around the center like rings. That has a sharp practical consequence — intervene in the system, say by culling some animals, and you do not nudge the populations back toward the cycle they were on; you drop them onto a different orbit, and they circle that one ever after. There is no built-in tendency to return to the orbit you left, because none of the orbits is singled out over the others. This is exactly what “stable but not attractive” buys you and what it costs: the populations stay bounded, but they never forget a disturbance.

The second is the danger lurking at the edges. The orbits swing wide, and the larger ones pass close to the axes — in the time plot p(t)p(t) very nearly grazes zero at the bottom of each predator trough. An orbit that actually reached an axis would mean a population hitting zero, which is extinction. So a large enough swing, or an intervention that throws the system onto a wide enough orbit, can carry one of the species to the brink — and the same neutral stability that keeps the populations cycling is what denies them any pull back from the edge.