Competition and Coexistence
When two species use the same limiting resources, each depresses the other’s growth — yet countless species manage to coexist. The Lotka–Volterra competition model and modern coexistence theory explain when a competitor wins, when both persist, and when the winner depends on who arrives first.
The competition model
We extend logistic growth to two species that compete. Each species limits itself, and also feels its competitor through a conversion coefficient.
Here is the intrinsic growth rate of species , is its carrying capacity, and is the per-capita competitive effect of species on species . If , an individual of species 2 counts exactly like an individual of species 1 in crowding species 1; means interspecific competition is weaker than intraspecific.
Zero-growth isoclines
A zero-growth isocline for a species is the set of where that species neither grows nor declines. Setting gives the line , and setting gives .
The way these two lines sit in the – plane determines the outcome, giving four cases.
- Species 1 wins — species 1’s isocline lies entirely outside species 2’s; species 2 is driven to extinction from any starting point.
- Species 2 wins — the mirror image; species 1 is excluded.
- Priority effects (bistable, founder control) — the isoclines cross, but the interior equilibrium is unstable; whichever species establishes first excludes the other.
- Stable coexistence — the isoclines cross with a stable interior equilibrium; both species persist.
The interior equilibrium exists at the intersection, but only in the coexistence case is it a stable node that trajectories approach.
The coexistence condition
Stable coexistence requires that each species can invade when rare — the mutual invasibility criterion. Species 2 can invade a resident species 1 (sitting at ) when its per-capita growth rate is positive there, which reduces to . By symmetry species 1 invades species 2’s equilibrium when .
Combining, coexistence is stable when
which implies : interspecific competition must be weaker than intraspecific for both species. When instead (each isocline crossing so interspecific competition dominates), we get priority effects.
The competitive exclusion principle is the boundary case: two species competing for a single limiting resource in exactly the same way cannot coexist indefinitely — one excludes the other.
Modern coexistence terms
Contemporary theory reframes these conditions as a balance of two forces. Stabilizing niche differences describe how strongly each species limits itself relative to its competitor; they push toward coexistence by making rare species grow faster (self-limitation exceeding cross-limitation, i.e. ). Fitness differences describe the overall competitive advantage of one species over the other; they push toward exclusion. Species coexist when stabilizing niche differences are large enough to overcome their fitness difference — a useful lens for anything from plant communities to competing pathogen strains.
Worked example
Let , , , and .
Check the two invasion conditions:
Both hold (equivalently ), so the species stably coexist. The interior equilibrium is
In code
We draw the isoclines and overlay a few trajectories.
R
library(deSolve)
comp <- function(t, y, p) {
with(as.list(c(y, p)), {
dN1 <- r1 * N1 * (1 - (N1 + a12 * N2) / K1)
dN2 <- r2 * N2 * (1 - (N2 + a21 * N1) / K2)
list(c(dN1, dN2))
})
}
p <- c(r1 = 0.5, r2 = 0.5, K1 = 1000, K2 = 800, a12 = 0.6, a21 = 0.7)
t <- seq(0, 100, by = 0.2)
for (y0 in list(c(N1 = 50, N2 = 700), c(N1 = 900, N2 = 50))) {
out <- ode(y = y0, times = t, func = comp, parms = p)
cat(tail(out[, "N1"], 1), tail(out[, "N2"], 1), "\n")
}
# Both start points converge near (897, 172): stable coexistence
Python
import numpy as np
from scipy.integrate import solve_ivp
r1, r2, K1, K2, a12, a21 = 0.5, 0.5, 1000, 800, 0.6, 0.7
def comp(t, y):
N1, N2 = y
return [r1*N1*(1 - (N1 + a12*N2)/K1),
r2*N2*(1 - (N2 + a21*N1)/K2)]
for y0 in ([50, 700], [900, 50]):
sol = solve_ivp(comp, (0, 200), y0, t_eval=[200])
print(sol.y[:, -1]) # both -> [~897, ~172]: coexistence
[896.34570986 172.37913759]
[896.31173928 172.36258286]
Julia
using DifferentialEquations
function comp!(du, u, p, t)
N1, N2 = u
r1, r2, K1, K2, a12, a21 = p
du[1] = r1*N1*(1 - (N1 + a12*N2)/K1)
du[2] = r2*N2*(1 - (N2 + a21*N1)/K2)
end
p = (0.5, 0.5, 1000.0, 800.0, 0.6, 0.7)
for u0 in ([50.0, 700.0], [900.0, 50.0])
sol = solve(ODEProblem(comp!, u0, (0.0, 200.0), p), Tsit5())
println(sol.u[end]) # both -> [~897, ~172]: coexistence
end
Why it matters
Competition theory is the backbone of community ecology: it predicts which species assemble together, why invaders sometimes take over and sometimes fail, and how biodiversity is maintained. The invasion criterion and the niche-versus-fitness framing guide restoration, invasion risk assessment, and the study of coexisting strains of parasites and pathogens.