Population & Community Ecology
Chapter: 5.2 Population & Community Ecology Level: 5 — Mastery (cross-domain: mathematics + modelling + coding + proof) Time limit: 90 minutes Total marks: 60
Instructions: Answer all three questions. Show full derivations. Where code is requested, write clean, runnable Python (NumPy/Matplotlib/SciPy assumed available). Justify all biological interpretations with reference to named subtopics.
Question 1 — Logistic Growth: Analysis, Proof & Simulation (24 marks)
The continuous logistic model for a single population is
(a) Solve the ODE exactly to obtain in closed form. Show every integration step (partial fractions). (6)
(b) Prove that the population growth rate is maximised at , and state the value of that maximum rate. Explain what this inflection point means for carrying capacity (5.2.3). (5)
(c) Using the closed form from (a), derive an expression for the time at which . (4)
(d) Contrast the logistic solution with the exponential model (5.2.2): give the exponential solution and state, with a limit argument, the condition under which logistic growth is well-approximated by exponential growth. (4)
(e) Write a Python function logistic(r, K, N0, t) returning using the closed form, and a snippet that plots the curve for , , over , marking the inflection point. (5)
Question 2 — Predator–Prey Dynamics & Density Dependence (22 marks)
Consider the Lotka–Volterra predator–prey system
where is prey density and is predator density, all constants positive.
(a) Find all equilibrium (fixed) points of the system. (4)
(b) For the non-trivial (coexistence) equilibrium, compute the Jacobian and show that its eigenvalues are purely imaginary, hence classify the equilibrium. State the biological meaning for predation cycles (5.2.7). (7)
(c) Show that the quantity is a conserved quantity () along trajectories. (5)
(d) The classic model has no density-dependent self-limitation of prey. Modify the prey equation to include a logistic term and explain, referencing density-dependent vs density-independent factors (5.2.4), how this changes the long-term behaviour qualitatively. (3)
(e) Write Python (using scipy.integrate.odeint or solve_ivp) to numerically integrate the original system for , , over . (3)
Question 3 — Survivorship, r/K Strategy & Biodiversity Index (14 marks)
(a) The three idealised survivorship curves (Type I, II, III) can be modelled by plotting against age, where is the fraction surviving to age . State the shape of each curve and link each to an r- or K-selected life history (5.2.5, 5.2.6). (4)
(b) A cohort of 1000 individuals shows a Type II (constant mortality) curve with a per-interval survival probability of . Derive as a function of interval , and compute . (3)
(c) A community sample gives species counts: A = 40, B = 30, C = 20, D = 10 (total 100). Compute Simpson's Diversity Index and the Shannon index . Interpret their magnitudes in the context of biodiversity importance (5.2.11). (5)
(d) Define a keystone species and, in one or two sentences, explain why removing one may reduce the diversity indices computed in (c) more than removing a numerically dominant competitor (5.2.10). (2)
Answer keyMark scheme & solutions
Question 1
(a) Separate variables: Partial fractions: . (1) Integrate: , i.e. . (2) At : . (1) Solve for : (2)
(b) Let . Then . (2) , so it's a maximum. (1) Maximum rate . (1) Interpretation: population grows fastest at half carrying capacity; as growth rate , so is the stable ceiling the density approaches (5.2.3). (1)
(c) Set : , so . (4) (2 for algebra, 2 for final form)
(d) Exponential: . (1) As , , so → early-phase logistic growth ≈ exponential (limit or ). (2) Condition: / early times. (1)
(e)
import numpy as np, matplotlib.pyplot as plt
def logistic(r, K, N0, t):
return K / (1 + ((K - N0)/N0)*np.exp(-r*t))
t = np.linspace(0, 30, 400)
r, K, N0 = 0.5, 1000, 10
N = logistic(r, K, N0, t)
tstar = (1/r)*np.log((K-N0)/N0) # inflection time
plt.plot(t, N); plt.scatter([tstar],[K/2], color='red')
plt.xlabel('t'); plt.ylabel('N'); plt.show()(3 for correct function, 2 for plot + inflection marking)
Question 2
(a) Set both derivatives to 0. , . Fixed points: and . (4)
(b) Jacobian: At : , , so (3) Characteristic: ; , . So , — purely imaginary. (3) Classification: centre → neutrally stable closed orbits ⇒ sustained predator–prey oscillations, predator lagging prey (5.2.7). (1)
(c) . (1) , . . (1) . (1) Sum . (2) ⇒ conserved.
(d) Modified prey eq: . (1) The logistic term is density-dependent (self-limitation intensifies as rises), unlike density-independent factors (e.g. weather). It damps the neutral cycles into a stable spiral/focus converging to a fixed point rather than perpetual oscillation (5.2.4). (2)
(e)
import numpy as np
from scipy.integrate import solve_ivp
a,b,d,g = 1.1, 0.4, 0.1, 0.4
def f(t, z):
x,y = z
return [a*x - b*x*y, d*x*y - g*y]
sol = solve_ivp(f, [0,50], [10,5], t_eval=np.linspace(0,50,1000))
# sol.y[0]=prey, sol.y[1]=predator(3 marks: correct RHS, params, integration call)
Question 3
(a) (4)
- Type I: convex, low early/mid mortality, sharp late drop → K-selected (large mammals, humans).
- Type II: straight line (log scale), constant mortality per age → intermediate (birds, rodents).
- Type III: concave, very high juvenile mortality, few survive to reproduce → r-selected (fish, insects, many plants). (1 each shape, 1 for r/K links)
(b) Constant survival ⇒ . (2) . Survivors ≈ of 1000. (1)
(c) . . Simpson . (2) Shannon . (2) Interpretation: high (≈0.7, near max 0.75 for 4 spp) and moderate–high indicate fairly even, diverse community; greater diversity confers stability/resilience and ecosystem function (5.2.11). (1)
(d) A keystone species exerts a disproportionately large effect on community structure relative to its abundance (5.2.10). Its removal can release a competitor or collapse a trophic interaction, causing secondary extinctions and a larger drop in than losing an abundant but functionally redundant dominant. (2)
[
{"claim":"Logistic max growth rate at N=K/2 equals rK/4","code":"r,K,N=symbols('r K N',positive=True); f=r*N*(1-N/K); crit=solve(diff(f,N),N)[0]; result=(simplify(crit-K/2)==0) and (simplify(f.subs(N,K/2)-r*K/4)==0)"},
{"claim":"Inflection time t*=(1/r)ln((K-N0)/N0) for N0=10,K=1000,r=0.5 gives ~9.19","code":"r,K,N0=0.5,1000,10; tstar=(1/r)*ln(Rational(K-N0,N0)); result=abs(float(tstar)-9.1901)<1e-3"},
{"claim":"Simpson D=0.70 and l_3=0.343","code":"ps=[Rational(4,10),Rational(3,10),Rational(2,10),Rational(1,10)]; D=1-sum(p**2 for p in ps); l3=Rational(7,10)**3; result=(D==Rational(7,10)) and (l3==Rational(343,1000))"},
{"claim":"Shannon H approx 1.2799","code":"ps=[0.4,0.3,0.2,0.1]; H=-sum(p*ln(p) for p in ps); result=abs(float(H)-1.27985)<1e-3"},
{"claim":"LV coexistence eigenvalues purely imaginary: det=alpha*gamma, trace=0","code":"a,b,d,g=symbols('a b d g',positive=True); J=Matrix([[0,-b*g/d],[d*a/b,0]]); result=(J.trace()==0) and (simplify(J.det()-a*g)==0)"}
]