Chapter 4: The Logistic ODE for Urban Growth
4.1 From Malthus to Verhulst
The simplest model of urban population growth begins with exponential (Malthusian) growth\(dN/dt = rN\), where\(r\) is the intrinsic growth rate. But no city grows exponentially forever—resources, land, infrastructure, and social carrying capacity impose limits. The logistic equation, introduced by Pierre-François Verhulst in 1838, captures this saturation:
$$\frac{dN}{dt} = r \, N \left(1 - \frac{N}{K}\right)$$
Here \(K\) is the carrying capacity—the maximum sustainable population. The term\((1 - N/K)\) represents density-dependent feedback: as \(N \to K\), growth slows to zero.
4.2 Analytical Solution
The logistic equation is separable. We rearrange and integrate:
$$\int \frac{dN}{N(1 - N/K)} = \int r \, dt$$
Using partial fractions on the left side:
$$\frac{1}{N(1 - N/K)} = \frac{1}{N} + \frac{1/K}{1 - N/K}$$
Integrating both sides:
$$\ln N - \ln\left(1 - \frac{N}{K}\right) = rt + C$$
Applying the initial condition \(N(0) = N_0\) and solving for \(N(t)\):
$$\boxed{N(t) = \frac{K}{1 + \left(\frac{K - N_0}{N_0}\right) e^{-rt}}}$$
This is the logistic sigmoid. Key properties:
- • \(N(0) = N_0\)
- • \(N(t) \to K\) as \(t \to \infty\)
- • Inflection point at \(N = K/2\), where growth is fastest
- • Maximum growth rate: \(dN/dt|_{\max} = rK/4\)
4.3 Stability Analysis
Define \(f(N) = rN(1 - N/K)\). The fixed points satisfy \(f(N^*) = 0\):
$$N_1^* = 0, \qquad N_2^* = K$$
Linear stability is determined by the sign of\(f'(N^*)\):
$$f'(N) = r\left(1 - \frac{2N}{K}\right)$$
- • At \(N_1^* = 0\): \(f'(0) = r > 0\) — unstable (any small population grows)
- • At \(N_2^* = K\): \(f'(K) = -r < 0\) — stable (perturbations decay)
Phase Portrait
The phase portrait plots \(dN/dt\) vs\(N\). It is a downward parabola with roots at 0 and\(K\), maximum at\(N = K/2\). Arrows point right for\(0 < N < K\) (growth) and left for\(N > K\) (decline).
Bifurcation
If we treat \(r\) as a bifurcation parameter and allow it to become negative (e.g., during urban decline), we get a transcritical bifurcation at \(r = 0\): the stability of \(N^* = 0\) and\(N^* = K\) exchange.
$$\text{For } r < 0: \quad N^* = 0 \text{ is stable}, \quad N^* = K \text{ is unstable (population collapses)}$$
4.4 Python: Logistic Growth Simulation
We solve the logistic ODE for multiple cities with different growth rates and carrying capacities, and display the phase portrait alongside the time series.
Logistic ODE: Multi-City Growth & Phase Portrait
PythonClick Run to execute the Python code
Code will be executed with Python 3 on the server
4.5 Fortran: RK4 Logistic Solver
A Fortran implementation of the fourth-order Runge-Kutta scheme for the logistic ODE.
Fortran: RK4 Logistic ODE Solver
FortranClick Run to execute the Fortran code
Code will be compiled with gfortran and executed on the server
4.6 Extensions and Urban Applications
Time-Varying Carrying Capacity
In reality, carrying capacity changes over time as technology, policy, and infrastructure evolve. A common extension is:
$$\frac{dN}{dt} = rN\left(1 - \frac{N}{K(t)}\right), \qquad K(t) = K_0(1 + \alpha t)$$
Allee Effect
Very small cities may struggle to attract resources. The Allee effect introduces a minimum viable population \(A\):
$$\frac{dN}{dt} = rN\left(\frac{N}{A} - 1\right)\left(1 - \frac{N}{K}\right)$$
This creates three fixed points: \(N^* = 0\) (stable),\(N^* = A\) (unstable threshold), and\(N^* = K\) (stable). Cities below the Allee threshold collapse; above it, they grow to capacity. This is a bistable system.
4.7 Summary & Key Takeaways
- • The logistic ODE \(dN/dt = rN(1 - N/K)\) captures saturation-limited urban growth
- • Exact solution: \(N(t) = K/[1 + ((K-N_0)/N_0)e^{-rt}]\) — the logistic sigmoid
- • Two fixed points: \(N^* = 0\) (unstable) and \(N^* = K\) (stable)
- • Inflection at \(N = K/2\) marks the transition from accelerating to decelerating growth
- • The Allee effect extension creates bistability, relevant for understanding city collapse thresholds