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.

Zero-growth isoclines for stable coexistence, with trajectories converging to the interior equilibrium.

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.

dN1dt=r1N1 ⁣(1N1+α12N2K1)dN2dt=r2N2 ⁣(1N2+α21N1K2)\begin{aligned} \frac{dN_1}{dt} &= r_1 N_1\!\left(1 - \frac{N_1 + \alpha_{12} N_2}{K_1}\right) \\ \frac{dN_2}{dt} &= r_2 N_2\!\left(1 - \frac{N_2 + \alpha_{21} N_1}{K_2}\right) \end{aligned}

Here rir_i is the intrinsic growth rate of species ii, KiK_i is its carrying capacity, and αij\alpha_{ij} is the per-capita competitive effect of species jj on species ii. If α12=1\alpha_{12} = 1, an individual of species 2 counts exactly like an individual of species 1 in crowding species 1; α12<1\alpha_{12} < 1 means interspecific competition is weaker than intraspecific.

Zero-growth isoclines

A zero-growth isocline for a species is the set of (N1,N2)(N_1, N_2) where that species neither grows nor declines. Setting dN1dt=0\frac{dN_1}{dt}=0 gives the line N1=K1α12N2N_1 = K_1 - \alpha_{12} N_2, and setting dN2dt=0\frac{dN_2}{dt}=0 gives N2=K2α21N1N_2 = K_2 - \alpha_{21} N_1.

The way these two lines sit in the N1N_1N2N_2 plane determines the outcome, giving four cases.

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 N1=K1N_1 = K_1) when its per-capita growth rate is positive there, which reduces to K2>α21K1K_2 > \alpha_{21} K_1. By symmetry species 1 invades species 2’s equilibrium when K1>α12K2K_1 > \alpha_{12} K_2.

Combining, coexistence is stable when

α12<K1K2andα21<K2K1,\alpha_{12} < \frac{K_1}{K_2} \quad\text{and}\quad \alpha_{21} < \frac{K_2}{K_1},

which implies α12α21<1\alpha_{12}\,\alpha_{21} < 1: interspecific competition must be weaker than intraspecific for both species. When instead α12α21>1\alpha_{12}\alpha_{21} > 1 (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. α12α21<1\alpha_{12}\alpha_{21} < 1). 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 K1=1000K_1 = 1000, K2=800K_2 = 800, α12=0.6\alpha_{12} = 0.6, and α21=0.7\alpha_{21} = 0.7.

Check the two invasion conditions:

K1K2=1000800=1.25>0.6=α12,K2K1=8001000=0.80>0.7=α21.\frac{K_1}{K_2} = \frac{1000}{800} = 1.25 > 0.6 = \alpha_{12}, \qquad \frac{K_2}{K_1} = \frac{800}{1000} = 0.80 > 0.7 = \alpha_{21}.

Both hold (equivalently α12α21=0.42<1\alpha_{12}\alpha_{21} = 0.42 < 1), so the species stably coexist. The interior equilibrium is

N1=K1α12K21α12α21=10000.680010.42=5200.58897,N_1^* = \frac{K_1 - \alpha_{12} K_2}{1 - \alpha_{12}\alpha_{21}} = \frac{1000 - 0.6\cdot 800}{1 - 0.42} = \frac{520}{0.58} \approx 897, N2=K2α21K11α12α21=8000.710000.58=1000.58172.N_2^* = \frac{K_2 - \alpha_{21} K_1}{1 - \alpha_{12}\alpha_{21}} = \frac{800 - 0.7\cdot 1000}{0.58} = \frac{100}{0.58} \approx 172.

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.