Ecological Forecasting Workshop, Cape Town, July 2025
Dynamic models describe a function implicitly by describing the change that governs it.
Differential equations in continuous time
“differential equation”: an equation containing an unknown function and its derivative(s), e.g.
\[ \frac{dN}{dt} = rN \hspace{5pt} \text{ or } \hspace{5pt} \frac{1}{N}\frac{dN}{dt} = r, \] for constant \(r\).
“solving” differential equations means finding the unknown function analytically or numerically, e.g. \[ N(t) = N_0e^{rt} \hspace{10pt} \text{ for } t \geq 0 \]
Difference equations in discrete time
“difference equation”: specifies a function at \(t+1\) in terms of value at \(t\)
e.g. \[ N_{t+1} = N_t + rN_t = (1 + r)N_t \]
or generally \[ N_{t+1} = F(N_t) \] for some function \(F\)
numerical simulation of difference equations is straightforward
Two classic dynamic models describe different population dynamics
Exponential growth \[ \frac{dN}{dt} = rN. \]
Logistics population model with density-dependent dynamics \[ \frac{dN}{dt} = rN\left(1 - \frac{N}{K}\right), \]
Per-capita rate of change \(\frac{1}{N}\frac{dN}{dt}\) is very simple in both, but dynamics are highly non-linear.
Let’s start at the simplest possible dynamic models in discrete time
\[ y_{t+1} = y_t \]
The only thing the dynamics depend on is the initial condition \(y_1\):
As an aside, things get a bit more interesting if we move from a deterministic to a stochastic model
\[ y_{t+1} = y_t + \epsilon_t, \hspace{10pt} \text{ where } \epsilon_t \sim \text{Normal}(0, \sigma^2) \]
The result is known as a random walk:
Back to deterministic models, exponential growth/decline results from
\[ y_{t+1} = \rho y_t \hspace{5pt} \text{ for } \rho > 0. \]
Consider something slightly more complex:
\[ y_{t+1} = \beta + \rho y_t. \]
How can we understand this equation?
If we push things just one bit further, all hell breaks loose!
exponential growth: \(y_{t+1} = \rho y_t\) where \(\rho = y_{t+1}/y_t\) is the growth rate
for density dependence,
\(\rho = \rho(y_t)\), for example \(\rho(y_t) = r\left(1 - \frac{y_t}{K}\right)\)
\[ \rho(y_t) \approx \left\{ \begin{align} r & \hspace{5pt} \mbox{ if } y_t << K \\ 0 & \hspace{5pt} \mbox{ if } y_t \approx K. \end{align} \right. \]
we arrive at a non-linear equation \[ y_{t+1} = ry_t\left(1 - \frac{y_t}{K}\right) \]
we can remove \(K\) by scaling, \(x_t = y_t/K\), giving one parameter \[ x_{t+1} = rx_t(1-x_t) \]
The ‘logistic map’ \(x_{t+1} = rx_t(1-x_t)\) has incredibly rich dynamics as \(r\) varies! The dynamics at various value of \(r\) are explored in the interactive logistic_map
app, which you can run from run_apps.R
.