Population Laboratories

Welcome — start here.

Welcome to the Population Laboratories. Eight rooms of interactive simulations about a single question: what stops a population from growing? The first four answer it from inside the species — crowding, resources, and time lags. The last four answer it from outside: two rooms where another species eats the same food, one where another species eats you, and one where both things happen at once and the answer stops being obvious.

How to use the rooms

Every room follows the same pattern: set the parameters with the sliders and buttons at the top, press Run, and read the panels that fill in below. The whole trajectory is computed the moment you press Run and then played back to you, so you can pause anywhere, drag the History Scrubber at the bottom of most rooms back and forth, and replay any moment you like. In the Overshoot Room it is worth using deliberately: stepping one generation at a time is what turns the cobweb diagram from a tangle into an explanation.

Each room carries its own guidance, so this page stays short. A Start here panel — the first thing in the room, above everything else — says what the room shows and suggests what to try first; a What to notice panel below the simulation says what the run was for, and points to the other rooms that take the idea further. Previous and Next at the foot of each room walk them in order. Follow those and the eight rooms read as one argument rather than eight separate toys.

Between the run and the payoff sits What this model assumes: the things the room is quietly taking for granted, and — where there is one — the room that stops taking them for granted. This is worth reading. Most of these laboratories exist precisely to relax an assumption an earlier one made, so what looks like a convenient simplification in one room turns out to be the whole subject of another. It is also the honest answer to "but real populations are not like that", which is true of every model here and is the point rather than an objection.

Between the two sits the equation the room is running. Underneath it is a collapsible What each symbol means key: open it and every letter in the equation above is named, said plainly, and placed against what the earlier rooms called it. Nothing in a room requires reading the algebra — but nothing in the algebra is left unexplained either.

Some rooms are deterministic: the same settings always give exactly the same curve, because the equations contain no chance. Others draw births and deaths at random, so running twice will not give the same answer twice — the parameters set tendencies, never outcomes. Each room says which kind it is.

The small red ? buttons beside a control or a panel explain what it does, what the numbers mean, and what to look for. If something on screen is unclear, there is usually a ? next to it.

Words worth pinning down

These seventeen come up again and again. Each one is underlined wherever it appears in a room — click it, anywhere in the tool, for a short explanation. They are gathered here too:

  • Population — a group of the same species, in one place, that could interbreed — the unit everything here is measured in.
  • Per-capita rate — per individual, per unit of time. Ask of every rate whether it is this or a population total.
  • Density dependence — a birth or death rate that changes with crowding. Only this can regulate a population.
  • Intrinsic rate of increase (r) — the per-capita growth rate of a population that nothing is holding back.
  • Carrying capacity (K) — the size at which births balance deaths, so the population stops changing.
  • Equilibrium — a state in which nothing is changing — and the real question is whether it attracts.
  • Intraspecific vs. interspecific competition — competition within a species versus between species. The balance between them decides every coexistence result in the lab.
  • Demographic stochasticity — the coin-flip nature of individual births and deaths, which matters most when numbers are small.
  • Phase plane — a graph of one species against another, with time nowhere on it.
  • Isocline (nullcline) — the line on a phase plane along which one species stops changing.
  • Invasion criterion — can this species increase when it is rare? Ask it of both species and you have the outcome.
  • Competitive exclusion — two species making a living in exactly the same way cannot persist together.
  • R* — the resource level at which a consumer breaks even; the lower one wins.
  • Functional response — how many prey one predator eats, as a function of how many there are.
  • Limit cycle — a permanent oscillation whose size belongs to the parameters, not to where the run started.
  • Trophic cascade — an effect that travels down a food chain and changes a level the predator never touches.
  • Niche — the conditions and resources a population needs to persist. Two species with identical niches cannot coexist.

The through-line

The eight rooms fall into four parts, and each part dismantles an assumption the one before it was allowed to make. Part I takes a single population on its own: first with nothing in its way, which turns out to be impossible for long, and then with individuals getting under each other's feet, which bends the curve into the familiar S. Part II asks where that ceiling actually comes from — not a number belonging to the species, but the resource the environment can supply — and then shows that even a perfectly self-limiting population need not settle down quietly: delay the feedback by one generation and it can cycle forever, or become genuinely unpredictable while obeying a perfectly deterministic rule. Part III adds a second species that wants the same food, first as a bare coefficient that produces the four classic outcomes of competition theory, then mechanistically, with explicit food on the table: with one resource, whoever survives on less of it wins; with two, the species can divide the world between them. Part IV changes the relationship — the second species is now the diner, not a rival — and then puts competition and predation in the same community, where everything learned separately stops being reliable.

By the last room the honest answer to "what stops this population from growing?" is that you cannot tell by looking at the population, or even at the pair. You have to look at the whole community.

Working through the rooms in order is recommended, but each one stands on its own.

One word to watch: in Parts I and II, competition means competition among members of a single species — the crowding that regulates it from within. From Part III on it usually means competition between species. The rooms keep the two apart, and which one dominates decides every coexistence result in the lab.

Part I — A population on its own

Nothing outside the species. Growth with nothing in its way, and then with the neighbours in it.

01The Growth Room

Unlimited growth & its impossibility

A population in which nothing pushes back: every individual does equally well however crowded the world becomes. It is the population that cannot exist, and the baseline every other room is measured against.

→ Open the Growth Room

02The Crowding Room

Intraspecific competition & the logistic curve

Individuals start to get in each other’s way. Births fall, deaths rise, and where the two lines cross the population stops growing — that crossing point is the carrying capacity.

→ Open the Crowding Room

Part II — Where the ceiling comes from

The carrying capacity stops being a given number — and then it stops holding still.

03The Resource Room

Where carrying capacity actually comes from

K was a given number in the previous room. Here it is not: food is supplied, eaten and runs short, and the ceiling emerges from the arithmetic. What the consumers leave behind turns out to matter more than how many of them there are.

→ Open the Resource Room

04The Overshoot Room

Delayed density dependence: cycles & chaos

Breed once a year and this year’s crowding sets next year’s numbers. That single generation of delay is enough to turn a well-behaved population into one that cycles forever — or one that becomes genuinely unpredictable while obeying a perfectly deterministic rule.

→ Open the Overshoot Room

Part III — A second species at the same table

Competition, first as a bare coefficient and then as a shared dinner.

05The Neighbours Room

Interspecific competition: the Lotka–Volterra model

A second species that wants the same things. Four outcomes are possible, only one of them is coexistence, and which one you get has nothing to do with who grows faster.

→ Open the Neighbours Room

06The Coexistence Room

Competitive exclusion, R*, and niche partitioning

The same competition, but now the two species share explicit, tracked food, so competition happens for a reason. With one resource, whoever survives on less of it wins; with two, they can divide the world between them.

→ Open the Coexistence Room

Part IV — Being eaten

A species that wants you rather than your food — and then a whole community, where competition and predation happen at once. This is also where the lab turns on itself, repairing a century-old model one assumption at a time.

07The Predator Room

Predator–prey cycles, and a famous model’s fragility

A second species that eats the first. Neither population can settle, because each is the other’s reason for changing — and the century-old model describing it turns out to be too fragile to believe until you repair it, one assumption at a time.

→ Open the Predator Room

08The Keystone Room

Keystone predation & apparent competition

Competition and predation in one community. A predator can be the reason a competitor survives rather than the reason it dies, and two species that compete for nothing at all can still drive each other out.

→ Open the Keystone Room

A note on this beta

This is a beta version and may still contain bugs — we're continually working to improve each room. If you run into problems, have questions, or have suggestions, please get in touch with Lino Ometto at lino.ometto@unipv.it.

Acknowledgements

These laboratories were conceived and directed by Lino Ometto, who set the scientific content, the pedagogical design, the user interface design, and the choices behind every model. The simulation code, its implementation, and the explanatory texts were written collaboratively with Claude, Anthropic's AI assistant, using Claude Code.

The Growth Room

Unlimited growth – Nothing pushes back, so growth never stops. The population that cannot exist.

Start here

What it shows. A population in which nothing interferes: every individual has the same chance of giving birth and the same chance of dying, however crowded the world becomes. Births and deaths are drawn at random for each individual, so you see both the smooth exponential prediction and the noisy reality around it.

Try this. Run the defaults and switch the vertical axis from linear to logarithmic — the curve becomes a straight line, which is the signature of exponential growth. Then set the birth rate just barely above the death rate and run 20 replicate populations starting from 5 individuals. Finally, switch Compare two populations on and give population 2 a slightly higher death rate: two runs, identical in every other respect, on the same chart.

dN/dt = (b − d)·N = r·N
The population changes by a fixed amount per individual per unit time. Because the increment is proportional to how many individuals there already are, growth accelerates without limit. r is the intrinsic rate of increase.
What each symbol means
N
The number of individuals alive at that moment — the only thing this model keeps track of.
dN/dt
How fast N is changing: individuals gained or lost per unit of time. Above zero the population is growing, below zero it is shrinking.
b
Birth rate, per capita: one individual's chance of reproducing in a unit of time. Here it is the same for everybody, however crowded the world becomes.
d
Death rate, per capita: one individual's chance of dying in a unit of time. Also unaffected by crowding — which is exactly what makes this population impossible.
r
The intrinsic rate of increase, r = b − d. One number standing in for the two: above zero the population grows without limit, below zero it dwindles to nothing.
Set up the runseven choices — three more if you compare two populations — then press Run.
Set the parameters and press Run.
The population
Time0
Individuals NIndividuals N₁10
Individuals N₂10
r = b − dr₁0.20
r₂0.10
Doubling timeDoubling time ₁3.5
Doubling time ₂6.9
Population size over time —
Solid lines are simulated populations, in which each birth and each death is an independent random event. The dashed line is the textbook prediction N₀ert, which assumes no chance at all. With two populations on the chart each keeps its own colour, and each gets its own dashed prediction in that colour: the gap between the two solid lines is the whole effect of the parameters you changed.
Per-capita growth rate vs. density
Flat. An individual in a crowd of ten thousand does exactly as well as one in a crowd of ten — the defining assumption of this room. With two populations there are two flat lines, one per r, and the gap between them never changes with density.
Total growth rate vs. density
A straight line through the origin: the bigger the population, the faster it adds individuals, forever. Two populations give two lines of different slope — r is the slope, and nothing about density changes it.

Press Run. Each individual independently gives birth at rate b and dies at rate d, so the population grows by a factor of er per unit time on average — but only on average.

What this model assumes

  • Nothing gets in the way. Every individual has the same chance of giving birth and the same chance of dying however crowded the world becomes: b and d do not depend on N. This is the assumption the rest of the lab exists to break. Lifted in the room, where both rates bend with density.
  • The environment is inexhaustible. There is no food in this model, no space, nothing that can be used up — which is why the curve has nothing to level off against. Lifted in the room, where the ceiling is something the environment supplies.
  • Individuals are interchangeable. No age, no sex, no size, no genotype: one number describes the population completely. Real populations have structure, and a thousand newborns behave nothing like a thousand adults.
  • Births and deaths fall where they will, in continuous time. Each individual's events are drawn independently of every other's — no seasons, no breeding pulse, no generations arriving together. Lifted in the room, where the whole population turns over at once.
  • Nothing arrives and nothing leaves. The population is closed. Immigration is one of the commonest reasons a small real population persists when a model says it should not.
  • The rates never change. b and d are fixed for the whole run: no good years and bad years, no drought, no epidemic.

What to notice

The per-capita growth rate is a flat line: an individual in a crowd of ten thousand does exactly as well as one in a crowd of ten. That is the assumption this room rests on, and it is the assumption every later room breaks. Notice too that with a small starting population some replicates go extinct even though the average is growing — a positive growth rate is not a guarantee, because chance acts on individuals rather than on averages.

Where this goes next. The room makes individuals get in each other's way, which is the smallest possible repair to this model. Every other room in the lab is a different answer to the question this one leaves open: what actually stops the curve?

Exactly what this room simulates

Births and deaths are drawn independently for every individual in every time step (a Poisson birth–death process), so replicate populations with identical parameters follow different paths. On the linear axis the chart is drawn up to 200 000 individuals: a population that outgrows it leaves through the top of the panel as a dotted line and keeps climbing, since nothing in the model ever stops it. The logarithmic axis has no such ceiling — it stretches to whatever the run reached, however many powers of ten that takes. The dot field shows one dot per individual up to 1 500, and one dot per several after that; with two populations on the panel each gets its own band and its own dot scale.

The Crowding Room

Intraspecific competition – Every individual added makes life slightly worse for the rest, until growth stops on its own.

Start here

What it shows. The same population, but now individuals get in each other's way — intraspecific competition. The birth rate falls and the death rate rises as the population grows; where the two lines cross, births exactly balance deaths and the population stops changing. That crossing point is the carrying capacity, K.

Try this. Run the defaults and watch the S-shaped curve level off at K. Then start the population above K and run again. Finally, open More parameters, switch on the Allee effect, and start with a very small population. To see one parameter's effect on its own, switch Compare two populations on and change nothing but K between them.

dN/dt = r·N·(1 − N/K)
The logistic equation. The bracket is the fraction of the environment still unused: it equals 1 in an empty world and 0 when the population reaches K. Growth is exponential when rare and vanishes at the carrying capacity.
What each symbol means
N
The number of individuals alive at that moment.
dN/dt
How fast N is changing: individuals gained or lost per unit of time.
r
The intrinsic rate of increase — the per-capita growth rate of a population so rare that nothing is holding it back. It sets how fast the curve climbs, never how high.
K
The carrying capacity — the size at which the falling birth rate meets the rising death rate, so growth stops. It sets how high, never how fast.
(1 − N/K)
The brake, and the whole difference from the Growth Room. It is the fraction of the environment still unused: 1 in an empty world, 0 at K, and negative above it, which is what pulls an overshooting population back down.
A
The Allee threshold, present only when the Allee effect is switched on — the switch is in the More parameters drawer at the foot of the controls, and it is off by default, which is why A does not appear in the equation above. The growth term then becomes r(N/A − 1)(1 − N/K): below A the first bracket is negative, so being rare is itself a cause of decline.
Set up the runseven choices — three more if you compare two populations, plus the Allee effect in the drawer — then press Run.
More parameters — the Allee effect
With the Allee effect on, the model becomes dN/dt = r·N·(N/A − 1)·(1 − N/K). Below the threshold A the growth rate is negative: too sparse to find mates, too few to defend the group. A is a second equilibrium — but an unstable one. Each population carries its own switch, so the cleanest demonstration in the room is two populations identical in r, K and N₀, one of them with the effect on.
Set the parameters and press Run.
The population
Time0
Individuals NIndividuals N₁10
Individuals N₂10
N / KN₁ / K₁0.03
N₂ / K₂0.02
Per-capita ratePer-capita rate ₁0.39
Per-capita rate ₂0.39
Population size over time —
The purple line is K. The pale grey curve is what the same population would have done with no crowding at all — the Growth Room's exponential, drawn for comparison. It leaves through the top of the panel within a few time units and carries on as a dotted line; the figure beside the panel says how far.Each population has its own colour and its own purple K line. The pale “no crowding” control curve is left off while two populations share the panel: the comparison here is between them, not with the Growth Room.
Per-capita growth rate vs. density
Falls in a straight line from r at zero density to exactly zero at K. This single line is intraspecific competition. Two populations give two lines: r sets where each one starts, K sets where it reaches zero.
Total growth rate vs. density
A hump peaking at K/2. Both a nearly empty world and a completely full one add individuals slowly, for opposite reasons. With two populations each hump peaks at its own K/2, marked by a dot in that population's colour.
Births and deaths vs. density
The mechanism underneath: birth rate falls with crowding, death rate rises. K is simply where they cross. Here colour keeps its usual meaning — green is births, terracotta deaths — and population 2 is drawn dashed, so each population's own crossing point is its own K.
Step through the run to park exactly on a moment worth looking at — a peak, a crossing, a turning point. The slider also responds to the ← and → keys once you click it.

Press Run. Watch the gap between the logistic curve and the pale exponential open up: that gap is everything the population failed to add because of its own numbers.

What this model assumes

  • Crowding acts instantly. The rates at any moment depend on N at that same moment, so the population feels the crowd the instant it forms. Nothing in nature is that prompt. Lifted in the room, where the feedback is delayed by exactly one generation.
  • K belongs to the species. Carrying capacity is a number you set on a slider rather than something produced by anything, which makes it a description of the outcome and not an explanation of it. Lifted in the room, where K falls out of the bookkeeping instead.
  • Every individual competes equally with every other. Competition is a mean field: no territories, no neighbourhoods, nobody better at it than anybody else. Real competition is local, and local competition is weaker than this.
  • The density dependence is a straight line. Per-capita growth falls linearly from r at N = 0 to zero at K. Nothing obliges nature to be linear, and the shape matters: the Overshoot Room's three maps are three different shapes of this same idea, and they do not behave alike.
  • Only this species counts against K. Nothing else is eating the same food or taking up the same room. Lifted in the and rooms.
  • Nothing eats them. Every death here is a death from crowding. Lifted in the room.

What to notice

Growth is fastest not when the population is small and not when it is large, but exactly halfway, at K/2 — that hump in the dN/dt panel is why fisheries aim to hold stocks near half of carrying capacity. Notice also that K is an attractor: the population converges on it from above as readily as from below. And with an Allee effect, a population that falls below the threshold does not merely grow slowly — it goes extinct.

Where this goes next. This room treats K as a given number belonging to the species. The room takes that apart and shows where K actually comes from; the room keeps the same density dependence but delays it by one generation; and the room adds a second species that also counts against K.

Exactly what this room simulates

The deterministic logistic is integrated with a fourth-order Runge–Kutta scheme. With demographic noise on, births and deaths are instead drawn as independent random events with density-dependent rates b(N) = b₀ − (r/2K)·N and d(N) = d₀ + (r/2K)·N, which have the logistic as their mean. K is an emergent balance point, not a wall: nothing prevents the population from exceeding it, it simply shrinks when it does. With two populations running, each is an entirely separate model — they share only the clock, the noise setting and the number of replicates, and never interact. (Two populations that do feel each other are the Neighbours Room.)

The Resource Room

Where K comes from – Food is supplied, eaten and runs short, and the ceiling is whatever falls out of the bookkeeping.

Start here

What it shows. The room treated K as a given. Here it is not: the environment supplies a resource at a fixed rate, consumers eat it, and their births depend on how much they ate. Both the resource and the consumer are tracked over time, and the population's ceiling emerges from the arithmetic rather than being imposed.

Try this. Run the defaults and watch the resource crash as the consumers build up, then settle. Read off R* — the resource level the consumers grind the environment down to. Now double the supply rate and run again. Finally, switch on Environment shift to cut the supply halfway through a run.

dR/dt = S − l·R − a·R·N
dN/dt = N·(e·a·R − m)
The resource is supplied at rate S, decays at rate l, and is consumed in proportion to how much of it there is and how many consumers there are. Consumers convert what they eat into offspring with efficiency e and die at rate m. Nothing here is a carrying capacity — and yet one appears.
What each symbol means
R
How much resource is standing there at that moment — food, nutrient, prey biomass. Unlike the last room, it is tracked explicitly.
N
The number of consumers eating it.
S
Supply: resource added per unit of time, from outside and regardless of anything else in the model.
l
Loss rate: the fraction of the standing resource that decays, washes away or is otherwise lost per unit of time, with nobody eating it.
a
Attack rate: how much resource one consumer takes per unit of time, per unit of resource present. It is the meeting rate between a consumer and its food.
e
Conversion efficiency: new consumers made per unit of resource eaten. Eating is not the same as breeding, and e is the exchange rate between them.
m
The consumers' per-capita death rate, constant and independent of how well they are eating.
R*
Not in the equations, but what falls out of them: R* = m/(e·a), the resource level at which a consumer exactly breaks even. It is what the population draws the resource down to, and it depends on nothing about the supply.
Set up the runeight choices — two more in the drawer, to change the environment mid-run — then press Run.
More parameters — change the environment mid-run
At the halfway point of the run, the supply rate S is multiplied by this factor and the simulation carries on. The consumers are given no warning and no new traits — only the environment changes.
Set the parameters and press Run.
Resource over time
The dashed purple line is R*, the resource level at which a consumer exactly breaks even. The population can only grow while the resource is above it.
Consumers over time
The dashed purple line is the equilibrium abundance N* — the carrying capacity nobody typed in.
Resource–consumer phase plane
Each point is one moment of the run, plotting how much resource there was against how many consumers. The vertical line is where consumers stop changing (R = R*); the curve is where the resource stops changing. They cross at the equilibrium the system spirals into.
The emergent ceiling
R* (break-even)—
N* (= K)—
Resource now—
Consumers now—
Time0
Resource per capita—
R* = m / (e·a) — notice that the supply rate S is nowhere in it. Enriching the environment raises how many consumers it holds, never the resource level they leave behind.
Step through the run to park exactly on a moment worth looking at — a peak, a crossing, a turning point. The slider also responds to the ← and → keys once you click it.

Press Run. Watch the two panels side by side: every time the consumer curve turns over, the resource is crossing its R* line at that same instant. That is not a coincidence — it is the second equation with dN/dt set to zero.

What this model assumes

  • The resource does not reproduce. It is abiotic — supplied at a constant rate, decaying at a constant rate, like a nutrient in a chemostat. A real food supply is usually itself a population with growth of its own. Lifted in the room, where what is eaten is a population that grows back.
  • A consumer eats in strict proportion to what is there. The functional response is linear: no handling time, no getting full, no upper limit on the rate at which one consumer can eat. Lifted in the room, where a saturating response changes the answer.
  • One consumer and one resource. The whole environment is a single thing that can run short. Lifted in the room, where two consumers meet one resource and then two.
  • Conversion is a constant. Every unit eaten becomes the same amount of consumer, at efficiency e, whatever the consumer's condition and however much it has already eaten.
  • Everything is well mixed. The resource is at the same concentration everywhere, and every consumer meets it at that concentration. Patchiness is the first thing a real environment has.
  • Mortality is a constant. m does not rise when the consumer is starving or when it is crowded — the only thing that can kill this consumer is arithmetic.

What to notice

Doubling the supply roughly doubles the number of consumers but leaves R* exactly where it was: R* depends only on the consumer's own mortality and efficiency, not on how rich the environment is. This is the single most useful fact in the whole lab. Notice too that "carrying capacity" is not a property of a species at all — the same consumer has a different K in every environment.

Where this goes next. The room turns R* into a rule for predicting who wins a competition. If you have not yet met that competition in its simpler, phenomenological form, visit the room first.

Exactly what this room simulates

A MacArthur-style consumer–resource model with an abiotic, chemostat-like resource: supplied at a constant rate S, lost at rate l, and eaten with a linear (type I) functional response. Equilibrium: R* = m/(e·a) and N* = (S − l·R*)/(a·R*). The consumer persists only if it can drive the resource down to R*, that is if S/l > R*. Whether it arrives there in a damped oscillation or slides in without ever overshooting depends on the parameters: linearising about the equilibrium gives complex eigenvalues, and so a spiral, only when S² < 4·m·R*·(S − l·R*), which requires the consumer to die faster than the resource decays (m > l).

The Overshoot Room

Delayed density dependence – This year's crowding fixes next year's numbers, and one generation of delay is enough to break the calm.

Start here

What it shows. Many organisms breed once a year: this year's crowding sets next year's numbers, and nothing can respond in between. That one-generation lag is enough to break the tidy approach to K. Three classic discrete-time models are offered — scramble competition (Ricker), contest competition (Beverton–Holt) and the discrete logistic — along with a cobweb diagram and a live bifurcation diagram.

Try this. Start with Ricker at a low growth rate and watch it glide into K. Raise the rate slowly and watch the approach start to wobble, then split into a two-year cycle, then four, then dissolve. Switch to Beverton–Holt at the same high rate. Then turn on Sensitivity test, which runs a second population differing by one thousandth of an individual.

Nt+1 = Nt·er(1 − Nt/K)
Ricker — scramble competition. Everyone shares the resource equally, so a crowd that exceeds K leaves nearly nothing for anyone and the population crashes far below K rather than easing down to it.
What each symbol means
Set up the runsix choices, then press Run.
Set the parameters and press Run.
Population size, generation by generation —
Dots are generations — there is nothing in between, because nothing happens in between. The purple line is K.
Cobweb
The curve maps this year's population to next year's; the diagonal is "no change". The staircase is the same run you see on the left, walked out geometrically.
Bifurcation diagram
For every growth rate along the bottom, the population's eventual behaviour is plotted: one dot means it settles at a single value, two dots a two-year cycle, a smear means chaos. The gold line marks your current setting.
Long-run behaviour

Not yet run

Press Run and the population's eventual behaviour will be diagnosed here from the last third of the series.

Step one generation at a time and watch the cobweb draw itself — up to the curve, across to the diagonal, up again. The slider also responds to the ← and → keys once you click it.

Press Run, then raise the growth parameter a little at a time and run again after each change. Nothing random is ever added: every wobble you see is produced by the density dependence itself.

What this model assumes

  • Generations do not overlap. The whole population is replaced at every step: the adults that produce the next generation are gone before it arrives. That is what makes the lag exactly one generation, and the lag is what makes cycles and chaos possible at all. The continuous rooms assume the exact opposite.
  • The delay is exactly one generation. Not half, not three. Real lags are distributed across ages and seasons, and a distributed lag is a gentler thing than this one.
  • Nothing random is ever added. Every wobble on the chart is produced by the density dependence itself. That is the room's point, and it is also a simplification: real fluctuations are part rule and part chance, and telling the two apart from a real time series is genuinely hard.
  • K is given, as in the Crowding Room. Lifted in the room.
  • One species, alone. Lifted from the room onwards.
  • N is a real number. The map runs on quantities like 412.7 individuals. Real counts are whole numbers and real censuses are estimates, and both of those blur the sharp distinction between a cycle and chaos that this room draws.

What to notice

Nothing random has been added anywhere: these equations are perfectly deterministic, and the wild fluctuations at high growth rates are generated by the density dependence itself. Yet under chaos the two nearly identical populations diverge completely within a few dozen generations — so a population can be both entirely rule-governed and entirely unpredictable. Contest competition never does this, because no amount of crowding can make it overshoot.

Where this goes next. This is the lab's first source of permanent cycles, and it is an internal one: a single species arguing with its own past. The room produces cycles a second way, out of two species arguing with each other — comparing the two is worth the trip.

Exactly what this room simulates

Three discrete-time maps of intraspecific competition, each a different shape of density dependence. Ricker: N′ = N·exp(r(1 − N/K)), overcompensating. Beverton–Holt: N′ = R₀N / (1 + (R₀−1)N/K) with R₀ = e^r, exactly compensating and monotone for every parameter value. Discrete logistic: N′ = N + rN(1 − N/K), which is the May map and can send N below zero at high r — the run stops if it does. The bifurcation diagram is recomputed live: 400 growth-rate values, 300 generations discarded as transient, the next 120 plotted.

The Neighbours Room

Interspecific competition – Two self-limiting species in one place. Four outcomes are possible, and only one is coexistence.

Start here

What it shows. Two species, each self-limiting exactly as in the room, now also feel each other — interspecific competition. One coefficient per species says how much a competitor counts in the currency of one's own crowding: α = 2 means one individual of the other species is as suppressive as two of your own.

Try this. Step through the four presets — A wins, B wins, Coexistence, Founder control — and after each one look at the phase plane rather than the time series. Then, in the founder-control preset, click at different points in the phase plane to start the run from a different pair of abundances and see the outcome flip.

dNA/dt = rANA(1 − (NA + αABNB)/KA)
dNB/dt = rBNB(1 − (NB + αBANA)/KB)
Two logistic equations, joined by two numbers. αAB is how much one individual of B crowds A, measured in units of A's own individuals: α = 1 means the two species are interchangeable, α < 1 that a competitor matters less than a fellow member of your own species, α > 1 that it matters more.
What each symbol means
NA, NB
The sizes of the two competing species. Each has its own equation, and each equation is the logistic of the Crowding Room with one extra term inside the bracket.
rA, rB
Each species' own intrinsic rate of increase. They govern how fast the outcome arrives, and — this is the room's first surprise — not which outcome it is.
KA, KB
Each species' own carrying capacity: the size it would settle at with the other species absent.
αAB
The effect of B on A: how many of A's own individuals one individual of B is worth as a crowder. α = 1 means the two are interchangeable, α < 1 that a competitor gets in your way less than a member of your own species, α > 1 that it gets in your way more.
αBA
The same number in the other direction. The two are independent — a species can be badly hurt by one that it barely troubles in return.
NA + αABNB
A's crowding, with B's individuals converted into A's currency. Everything the model does comes from comparing this total with KA.
Set up the runnine choices — or take a preset — then press Run.
Pick a preset or set the sliders, then press Run.
Both populations over time —
Dashed lines mark each species' own carrying capacity — where it would have settled if it were alone. The gap between a species' curve and its own dashed line is the cost of having a neighbour.
Outcome

Not yet run

The outcome of Lotka–Volterra competition is fixed by the parameters alone — it can be read off before the simulation is run, and this panel does exactly that.

Phase plane & isoclines click anywhere to restart from that pair of abundances
A's isocline (A stops changing) B's isocline (B stops changing) the trajectory equilibrium point
Invasion criteria

Ask of each species: if it were vanishingly rare while its competitor sat at its own carrying capacity, could it increase? Both answers yes means coexistence; both no means founder control; one of each means exclusion.

Step through the run to park exactly on a moment worth looking at — a peak, a crossing, a turning point. The slider also responds to the ← and → keys once you click it.

Press Run. Then change only the growth rates and run again: the winner will not change, only how long it takes to win.

What this model assumes

  • Competition is one number. α says how much an individual of the other species counts against you, and says nothing about what is being competed for. It is a summary of a mechanism, not the mechanism — which is why this room can tell you the outcome and not the reason. Lifted in the room, where the food is on the table.
  • The coefficients never change. α is fixed: it does not shift with density, with which resource happens to be scarce, or with the season.
  • Each species is logistic on its own. Every assumption the Crowding Room made still binds here, once per species — instant feedback, a given K, a straight-line density dependence.
  • Both species feel each other everywhere at once. No space. Two competitors that never actually meet, because each holds a different patch, coexist perfectly well without satisfying anything this room requires.
  • The environment is constant. Which is why the invasion criteria give one answer for all time. In a varying environment the answer can be different in different years, and that alone is enough to let a loser persist.
  • Nothing eats either of them. Not a harmless simplification: the room adds one shared predator and reverses the outcome this room predicts.

What to notice

Which species wins does not depend on who grows faster: the r sliders change how quickly the outcome arrives but never what it is. What matters is the balance between each species' effect on itself and its effect on the other. Coexistence requires each species to limit itself more than it limits its rival — an α below 1 is this model's way of saying the two occupy a different niche. When the reverse is true, both are stable alone and neither can invade, so whoever arrives first keeps the site.

Where this goes next. The α values here are descriptive — they say that a species suppresses another, not how. The room replaces them with an explicit shared food supply and derives the same outcomes from a mechanism. The room keeps these equations exactly as they are and adds a predator that eats both competitors, which can reverse every answer this room gives.

Exactly what this room simulates

Lotka–Volterra competition, integrated with fourth-order Runge–Kutta; a species is declared extinct and pinned to zero when it drops below 0.5 individuals. The isoclines are the straight lines along which each species' growth is exactly zero: N_A = K_A − α_AB·N_B and N_B = K_B − α_BA·N_A. Their arrangement, not the growth rates, decides the outcome.

The Coexistence Room

Competitive exclusion & niche partitioning – Both species eat the same tracked food, so competition is a shared dinner rather than a coefficient.

Start here

What it shows. The room's competition coefficients are descriptive: they say that a species suppresses another, not how. Here both species eat explicit, tracked resources, so competition happens for a reason. In one resource mode there is a single food supply; in two resources mode there are two, and each species can specialise.

Try this. In one-resource mode, run two species with different mortality rates and read the R* table — then start the eventual loser at ten times the winner's abundance and run again. Switch to two resources and give each species the higher attack rate on a different one. Then make both species prefer the same resource and watch coexistence collapse.

dRj/dt = Sj − l·Rj − Σi aij·Rj·Ni
dNi/dt = Ni·(e·Σj aij·Rj − mi)
The Resource Room's model with a second consumer added, and optionally a second resource. Neither species knows the other exists: they interact only by eating the same food, which is what competition actually is.
What each symbol means
i
Which consumer: i = A or B. The subscript is there because the two species differ only in these numbers, not in the equations they obey.
j
Which resource: j = 1 alone, or 1 and 2 in the two-resource mode.
Rj
The standing amount of resource j.
Ni
The number of individuals of consumer i.
Sj
Supply rate of resource j — how fast it is renewed from outside.
l
Loss rate of the resources when nobody is eating them; the same for both.
aij
Attack rate of consumer i on resource j. These are the numbers that make the two species different, and in the two-resource mode they are what lets each specialise.
e
Conversion efficiency: consumers made per unit of resource eaten.
mi
Per-capita death rate of consumer i.
Σ
A sum. Σi adds up every consumer eating that resource; Σj adds up every resource that consumer eats. With one species and one resource both sums have a single term, and the equations become the Resource Room's exactly.
R*i
Again not written above, but the point of the room: R* = mi/(e·ai), the resource level at which consumer i breaks even. On a single resource the lower R* wins, whatever else is true of either species.
Set up the runeleven choices — three more on two resources — then press Run.
Set the parameters and press Run.
The two competitors over time —
Nothing in these equations lets one species attack, avoid or notice the other. Everything that happens between them happens through the resource.
Outcome

Not yet run

Press Run. With a single resource the outcome can be predicted from the R* table alone, without simulating anything.

Resources over time
Dashed lines are each species' break-even level R* on that resource. A species can only increase while the resource sits above its own line.
Break-even table (R*)
R*ij = mi / (e·aij) is the resource concentration at which species i exactly breaks even on resource j — its births balance its deaths and it neither grows nor shrinks.
Who is limited by what
With two resources, each species' break-even condition becomes a line in resource space, and the two lines can cross. Coexistence needs each species to consume relatively more of whichever resource limits it more.
Step through the run to park exactly on a moment worth looking at — a peak, a crossing, a turning point. The slider also responds to the ← and → keys once you click it.

Press Run. In one-resource mode, try giving the losing species ten times the starting abundance of the winner — and watch it lose anyway.

What this model assumes

  • The resources are abiotic and independent. Each is supplied and decays at its own constant rate, neither grows, and neither affects the other.
  • The resources are substitutable. Growth depends on the sum of what is eaten, so more of one makes up for less of the other. Essential resources — nitrogen and phosphorus, say — do not trade off like this, and their geometry is different.
  • Linear functional responses again. No handling time and no saturation, for either consumer. Lifted in the room.
  • The consumers never touch each other. Each affects the other only by lowering a resource. No fighting, no territory, no chemical warfare — all of which are real and none of which is in these equations.
  • The environment is uniform and unchanging. The R* rule decides the winner because there is only one set of conditions to win under. Vary the environment in time or space and a species that is worse on average can persist on the occasions it is better.
  • Nothing eats the consumers. Lifted in the room.

What to notice

With one resource the species with the lower R* always wins, no matter how abundant the other starts, how fast it grows, or how hungrily it eats: it simply drives the resource below the level its rival needs to break even. This is the competitive exclusion principle, and R* explains it. With two resources, coexistence appears the moment each species is held back mainly by the resource it is better at using — which is what ecologists mean by partitioning a niche.

Where this goes next. This room and the room both reach coexistence through what the competitors do to each other. The room reaches it a third way — through something that eats them both.

Exactly what this room simulates

Mechanistic resource competition: two consumers on one or two abiotic resources, integrated with fourth-order Runge–Kutta; a species is declared extinct and pinned to zero below 0.5 individuals. On a single resource the species with the lower R* = m/(e·a) always excludes the other, regardless of starting abundance, attack rate or growth rate — this is Tilman's R* rule, the mechanistic form of Gause's competitive exclusion principle. With two resources, coexistence requires each species to be limited by the resource it consumes relatively more of.

The Predator Room

Predator and prey – A species that wants you, not your food. Neither population can ever settle.

Start here

What it shows. Two species, one of which eats the other. Three versions of the same pair of equations are offered, and each repairs an assumption in the one before it: the classic Lotka–Volterra model, then a version in which the prey have a carrying capacity of their own, then one in which the predator takes time to handle each prey it catches and so cannot eat without limit.

Try this. Step through the four presets. Under Neutral cycles, click at several different points on the phase plane and watch the cycle change size while the parameters stay put. Then switch to Prey with a ceiling and click the same points — every one of them now ends at the same place. Finally load Paradox of enrichment and drag the prey's carrying capacity K downwards until the cycling stops.

dN/dt = N·g(N) − f(N)·P
dP/dt = e·f(N)·P − m·P
Prey grow and are eaten; predators are born from what they eat and die at a constant rate. g(N) = r or r(1 − N/K) is the prey's own growth; f(N) = aN or aN/(1 + a·h·N) is how many prey one predator takes per unit time. Choosing those two shapes is choosing the model.
What each symbol means
N
The prey population.
P
The predator population.
g(N)
The prey's own per-capita growth with no predators about. It is r in the classic model — prey that would grow forever — and r(1 − N/K) once you give them a ceiling.
f(N)
The functional response: prey taken by one predator per unit of time. It is a·N for a predator that never fills up, and aN/(1 + a·h·N) for one that does. Choosing g and f is choosing the model.
r
The prey's intrinsic rate of increase.
K
The prey's carrying capacity — used only when the prey have a ceiling of their own.
a
Attack rate: how efficiently one predator encounters and catches prey.
h
Handling time: how long a predator spends subduing and digesting one prey item, during which it is hunting nothing. Set h = 0 and the curved response straightens back into a·N.
e
Conversion efficiency: predators made per prey eaten.
m
The predators' per-capita death rate. With no prey at all, this alone empties the second equation.
Set up the runnine choices — one or two more in the other two models, or take a preset — then press Run.
Pick a model, set the sliders, then press Run.
Prey and predators over time —
Time0
Prey N60
Predators P20
Prey equilibrium N*—
Predator equilibrium P*—
Small dots mark the peaks. The predator's peaks always sit to the right of the prey's, by about a quarter of a cycle — predators can only become numerous after their food already has.
Outcome

Not yet run

Whether this pair of species cycles forever, settles down, or breaks apart is fixed by the parameters — and can be read off before anything is simulated.

Phase plane & nullclines click anywhere to restart from that pair of abundances
prey nullcline (prey stop changing) predator nullcline (predators stop changing) the trajectory orbits from other starting points equilibrium
Predicted vs. measured
N* = m/(a(e − m·h)) contains no prey parameters whatsoever, and P* contains no predator ones. Each species' abundance is set by the other species' biology.
The functional response
How many prey one predator takes per unit time, as a function of how many prey there are.
Prey growth vs. predation risk
The same predation seen from the prey's side: a per-capita death rate, drawn against the prey's own per-capita growth rate at the current number of predators.
Step through the run to park exactly on a moment worth looking at — a peak, a crossing, a turning point. The slider also responds to the ← and → keys once you click it.

Press Run. Then press it again from a different starting point: in the classic model the cycle you get is the cycle you started with.

What this model assumes

  • Two species and nothing else. The prey has no other enemy and the predator no other food, so the predator's fate is tied entirely to this one prey. A real predator with something else to eat does not starve when this prey crashes — and that alternative food is what keeps many real predator–prey pairs from cycling as wildly as this. Lifted in the room, where one predator eats two species.
  • Every predator is identical and always hunting. No age structure, no territory, no learning, no giving up on a bad patch. The only thing that ever slows a predator down here is handling time.
  • Predator and prey meet at random. The encounter rate is the product of the two densities — mass action, borrowed from chemistry. Space, hiding places and prey refuges all break it, and a refuge is the classic way a real prey population escapes the cycle.
  • Eating turns into predators at once. The numerical response has no lag: no gestation, no development, no delay between a good year's feeding and the predators it produces. Real predator numbers answer a year or more behind.
  • A prey population left alone grows without limit. In classic mode that is the Growth Room's assumption returning, and it is why prey released by their predator's extinction leave through the top of the panel. Switching the prey's own carrying capacity on is what replaces it.
  • Populations are continuous quantities. The equations would let a hundredth of an individual recover; the half-individual floor that pins a population to zero is the room's one concession to reality, and it is a blunt one.

What to notice

The predator's peaks trail the prey's by a quarter of a cycle, always and for a reason: predators can only build up after their food has, and prey can only recover after the predators have starved. Look hard at the equilibrium too — the prey's equilibrium abundance N* = m/(a(e − m·h)) contains no prey parameters whatsoever. Feeding the prey population better cannot make it commoner; it makes predators commoner instead, and past a threshold it destabilises the pair entirely. Enrichment passing straight through one level to the one above it is the arithmetic behind a trophic cascade.

Where this goes next. The room made cycles out of one species and a time lag; this room makes them out of two species and a feedback, and the limit cycle you get from an enriched environment is a third kind again. The room drops this predator into the room's competition, where its effect on who survives is the opposite of what you would guess.

Exactly what this room simulates

Lotka–Volterra predation, integrated with fourth-order Runge–Kutta at sixteen sub-steps per frame, which holds the classic model's conserved quantity to about one part in 10¹⁰ over a run: the closed orbits on screen are closed in the mathematics, not by accident of the integrator. A population is declared extinct and pinned to zero below 0.5 individuals — the equations themselves permit a prey population of a hundredth of an individual to recover, and that floor is the room's one concession to reality. Prey released by their predator's extinction grow without limit: the time series stays scaled to the cycles and lets them leave through the top of the panel as a dotted line. The equilibrium is N* = m/(a(e − m·h)), P* = N·g(N*)/f(N*); its stability is decided by the sign of g(N*) + N*·g′(N*) − f′(N*)·P*, which is negative (stable) whenever the prey nullcline is falling where the predator nullcline crosses it.

The Keystone Room

Predation meets competition – Two competitors and one predator that eats them both. Its preference decides who survives.

Start here

What it shows. The room's two competitors and the room's predator in a single community — a predator that eats both rivals. The only genuinely new parameters are the two attack rates, which say how hard the predator presses on each competitor, and nearly everything this room demonstrates follows from which of the two is larger. Every run is simulated twice, once as you set it up and once with the predator deleted, so a removal experiment is always on screen.

Try this. Run Keystone predation, then Remove the keystone — identical parameters, predator switched off — and watch a species that was coexisting disappear. Then load Apparent competition, check that both competition coefficients really are zero, and watch one species eliminate the other anyway. Finally take the keystone settings and drag the two attack rates towards each other until the effect collapses.

dNA/dt = rANA(1 − (NA + αABNB)/KA) − aANAP
dNB/dt = rBNB(1 − (NB + αBANA)/KB) − aBNBP
dP/dt = P·(e(aANA + aBNB) − m)
The Neighbours Room's two competitors, with a shared predator added. The only new parameters are the two attack rates: aA and aB say how hard the predator presses on each competitor. Everything this room does follows from which of the two is larger.
What each symbol means
NA, NB
The two competing species — the Neighbours Room's pair, unchanged.
P
The predator, which eats both of them. Switch it off and the first two equations are exactly the Neighbours Room's.
rA, rB · KA, KB
Each competitor's own intrinsic rate of increase and carrying capacity, as before.
αAB, αBA
The competition coefficients: how much one individual of each species crowds the other, measured in that other's own individuals.
aA, aB
The predator's attack rate on each competitor — the only genuinely new parameters in the room. Which of the two is larger is the predator's preference, and everything that happens here follows from it.
e
Conversion efficiency: predators made per prey eaten, whichever species it came from.
m
The predator's per-capita death rate.
Set up the runsixteen choices — or take a preset — then press Run.
Pick a preset or set the sliders, then press Run.
All three populations over time —
Time0
Competitor A60
Competitor B60
Predator P10
The pale dashed lines are the counterfactual: the same two competitors, from the same starting sizes, simulated with no predator at all. The gap between a solid line and its dashed twin is the predator's entire effect on that species.
Outcome

Not yet run

This panel names what the predator did — by comparing the outcome of the competition with it against the outcome without it. Both can be read off the parameters before anything is simulated.

The competitors' phase plane click anywhere to restart from that pair of abundances
A's isocline — solid at the current predator density, faint with none B's isocline, the same two ways the trajectory the predator-free run three-species equilibrium
Invasion criteria
Tolerance of predation
Each line is one competitor's per-capita growth rate when it is rare, as a function of how many predators there are. Where a line crosses zero is the most predation that species can withstand, r/a. The vertical marks are the predator densities each competitor supports on its own.
What the predator is eating
The share of the predator's intake taken from each competitor, moment by moment. A keystone predator's plate is lopsided — and it is lopsided towards the species that would otherwise take over.
Drag slowly through the first part of a keystone run and watch the phase plane: as the predator builds up, the competitors' isoclines slide inwards at different speeds until they cross. That crossing is the coexistence appearing.

Press Run. Then switch the predator off and run again, changing nothing else — the question this room asks is what difference the predator makes.

What this model assumes

  • One predator, eating both competitors and nothing else. The whole community is three species. Every real food web this idea was drawn from has more, and indirect effects travel further in a larger one than they can here.
  • The predator's preference is a fixed attack rate. It does not switch to whichever competitor happens to be commoner. Switching is exactly the behaviour that can turn a keystone predator into an ordinary one, or the reverse, and it is not in these equations.
  • The predator never gets full. A linear functional response, so predation pressure rises without limit as prey become abundant. The room shows what saturation does to that.
  • Competition is still a bare coefficient. Everything the Neighbours Room assumed about α binds here too, so this room inherits a summary where it might have had a mechanism. The room supplies the mechanism.
  • No space, and nowhere to hide. Everything meets everything, uniformly. Paine's real tidepools had rock, tide height and refuges, and where the predator could not reach, the competitive winner won.
  • Nothing evolves and nothing learns. No species can answer predation by changing how it competes, growing a defence, or moving. On the timescale of a real cascade, some of them do.

What to notice

A predator is neither automatically destructive nor automatically a keystone: it restructures a community only when it presses hardest on the species that was winning. Drag the History Scrubber slowly through the start of a keystone run and watch the phase plane — the competitors' isoclines slide inward at different speeds, cross, and a coexistence appears where none existed. Notice too what apparent competition does to fieldwork: two species whose abundances move in opposite directions look exactly like competitors, and need not be competing for anything at all. Both results here are indirect effects — one species changing another's fate along a path it never walks directly, which is what a trophic cascade does between trophic levels and apparent competition does within one.

Where this comes from. This room only makes sense against the room, whose outcome it overturns, and the room, whose predator it borrows. It is also the lab's last word on the opening question: by this point, "what stops this population from growing?" cannot be answered by looking at the population, or even at the pair — only at the whole community.

Exactly what this room simulates

Two Lotka–Volterra competitors and one shared predator with a linear functional response, integrated with fourth-order Runge–Kutta; any population below 0.5 individuals is pinned to zero. Competitor i invades a world holding competitor j and the predator when ri(1 − αijNj*/Ki) − aiPj* > 0, where (Nj*, Pj*) = (m/(e·aj), (rj/aj)(1 − Nj*/Kj)) is the state of a world containing only j and the predator. Both invasion criteria satisfied means coexistence of all three. The three-species equilibrium solves aANA + aBNB = m/e simultaneously with the two competitors' zero-growth conditions. Keystone predation is Paine (1966); apparent competition is Holt (1977).