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.
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.
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.
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.
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.
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.
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.
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.
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.
Cookies
These laboratories count visits with Google Analytics, which stores a cookie in your browser — but only if you have accepted, either here or anywhere on the lab site, which shares your answer. Nothing is stored and nothing is sent until you do, and every room works the same either way. .
Questi laboratori contano le visite con Google Analytics, che salva un cookie nel tuo browser — ma solo se hai acconsentito, qui o in qualunque pagina del sito del laboratorio, che condivide la tua risposta. Finché non acconsenti non viene salvato né inviato nulla, e ogni stanza funziona allo stesso modo in entrambi i casi.
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.
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.
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.
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.
More parameters — the Allee effect
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.
dN/dt = N·(e·a·R − m)
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.
More parameters — change the environment mid-run
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.
What each symbol means
Not yet run
Press Run and the population's eventual behaviour will be diagnosed here from the last third of the series.
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.
dNB/dt = rBNB(1 − (NB + αBANA)/KB)
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.
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.
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.
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.
dNi/dt = Ni·(e·Σj aij·Rj − mi)
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.
Not yet run
Press Run. With a single resource the outcome can be predicted from the R* table alone, without simulating anything.
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.
dP/dt = e·f(N)·P − m·P
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.
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.
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.
dNB/dt = rBNB(1 − (NB + αBANA)/KB) − aBNBP
dP/dt = P·(e(aANA + aBNB) − m)
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.
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.
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).