Unveiling the Discrete Stunted Growth Model: Predicting Population Limits
This article introduces the discrete stunted (logistic) growth model, derives its difference equation, explains intrinsic growth rate and carrying capacity, analyzes equilibrium points and stability conditions, and provides Python code to visualize the relationship between growth parameter and steady‑state population.
Discrete Stunted Growth Model
The discrete version of the stunted (logistic) growth model is expressed as a first‑order nonlinear difference equation:
x_{t+1}=x_t + r x_t \left(1-\frac{x_t}{N}\right)where x_t denotes the population size at time step t , r is the intrinsic growth rate, and N represents the environmental carrying capacity.
When the intrinsic growth rate r is constant, the model reduces to a linear homogeneous difference equation whose solution is a geometric sequence, leading to unbounded exponential growth. However, limited resources impose a “stunting effect”, causing the growth rate to decline as the population approaches N , eventually reaching zero.
Assuming the growth rate decreases linearly with population size, the model becomes the discrete stunted growth model described above. The parameters r (intrinsic growth rate) and N (maximum capacity) determine the dynamics; when x_t = N , growth stops.
Alternative equivalent forms of the model can be written, for example:
x_{t+1}= (1+r) x_t - \frac{r}{N} x_t^2To analyze equilibrium points, set x_{t+1}=x_t = x^* , yielding the algebraic equation x^* = (1+r) x^* - \frac{r}{N} (x^*)^2 . Solving gives two equilibria: x^*_1 = 0 and x^*_2 = N .
Theorem 1: The equilibrium x^*_1 = 0 is locally asymptotically stable if and only if -2 < r < 0, while the equilibrium x^*_2 = N is locally asymptotically stable if and only if -2 < r < 2.
The following Python script simulates the model for various values of k (analogous to r ) and plots the steady‑state population x^*(k) after discarding transients.
<code>import numpy as np
import matplotlib.pyplot as plt
plt.rc('text', usetex=True)
plt.rc('font', size=16)
logistic = lambda k, x: k * x * (1 - x)
kk = np.arange(0, 4.01, 0.01)
listk = []
listx = []
for k in kk:
x = 0.5
for i in range(1, 500):
x = logistic(k, x)
if i > 400:
listk.append(k)
listx.append(x)
plt.scatter(listk, listx, c='b', s=1)
plt.grid(True)
plt.xticks(np.arange(0, 4.01, 0.5))
plt.xlabel("$k$")
plt.ylabel("$x^*(k)$")
plt.show()
</code>An illustrative plot of the steady‑state population versus the growth parameter is shown below.
Reference: Python Mathematics Experiment and Modeling, S. Shou‑kui & S. Xi‑jing, Science Press.
Model Perspective
Insights, knowledge, and enjoyment from a mathematical modeling researcher and educator. Hosted by Haihua Wang, a modeling instructor and author of "Clever Use of Chat for Mathematical Modeling", "Modeling: The Mathematics of Thinking", "Mathematical Modeling Practice: A Hands‑On Guide to Competitions", and co‑author of "Mathematical Modeling: Teaching Design and Cases".
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.