Before we study how populations grow, we need a basic idea from mathematics: the derivative.
The derivative of a function tells us how fast it changes.
Instead of abstract formulas, we will start with something very familiar: a car moving along a road.
Imagine a car that:
Phase A (0–30 seconds): Moves at a constant speed of 20 m/s. It does not accelerate, it does not brake — steady motion.
Phase B (30–60 seconds): Steps on the gas and accelerates smoothly. Its speed increases from 20 m/s to 50 m/s.
The question: How are distance, speed and acceleration connected?
# -------------------------------------------------------
# We define the time scale of the motion
# seq() creates a sequence of values
# from 0 to 60 seconds, with a step of 0.1 sec
# -------------------------------------------------------
t <- seq(0, 60, by = 0.1) # time in seconds
# Phase A parameters — constant motion
v0 <- 20 # initial speed (m/s)
t_switch <- 30 # moment when acceleration begins (sec)
# Phase B parameter — acceleration
# We want the speed to go from 20 → 50 m/s between t=30 and t=60
# So: a = Δv / Δt = (50 - 20) / (60 - 30) = 1 m/s²
a <- 1 # acceleration (m/s²)The speed changes depending on the phase:
\[ v(t) = \begin{cases} 20 & \text{if } t \leq 30 \\ 20 + 1 \cdot (t - 30) & \text{if } t > 30 \end{cases} \]
# -------------------------------------------------------
# ifelse() works like a choice:
# if the condition is TRUE → first value
# if the condition is FALSE → second value
#
# Here: if t <= 30, speed = v0 (constant)
# if t > 30, speed increases linearly
# -------------------------------------------------------
v <- ifelse(
t <= t_switch,
v0, # Phase A: constant speed
v0 + a * (t - t_switch) # Phase B: v = v₀ + a·(t - 30)
)The distance is the integral of the speed (or equivalently: the speed is the derivative of the distance).
\[ x(t) = \begin{cases} v_0 \cdot t & \text{if } t \leq 30 \\ v_0 \cdot 30 + v_0(t-30) + \frac{1}{2}a(t-30)^2 & \text{if } t > 30 \end{cases} \]
# -------------------------------------------------------
# Phase A: x = v₀ · t (uniform straight-line motion)
# Phase B: x = distance of Phase A at t=30
# + v₀·(t-30) + ½·a·(t-30)²
#
# First we compute the distance covered
# up to the moment t=30 (end of Phase A)
# -------------------------------------------------------
x_at_switch <- v0 * t_switch # = 20 × 30 = 600 meters
x <- ifelse(
t <= t_switch,
v0 * t, # Phase A
x_at_switch + v0 * (t - t_switch) + 0.5 * a * (t - t_switch)^2 # Phase B
)The acceleration is the derivative of the speed.
# -------------------------------------------------------
# Phase A: speed constant → does not change → acceleration = 0
# Phase B: speed increases by 1 m/s every second
# → acceleration = 1 m/s²
# -------------------------------------------------------
acc <- ifelse(t <= t_switch, 0, a)Now we will see the three quantities visually. Notice how the shape of each plot changes at 30 seconds.
# -------------------------------------------------------
# par(mfrow = c(3, 1)) → splits the graphics window
# into 3 rows and 1 column (the 3 plots one below
# the other)
# mar = c(bottom, left, top, right) → margins in lines
# -------------------------------------------------------
par(mfrow = c(3, 1), mar = c(4.5, 5, 3, 2))
# --- Plot 1: Distance vs Time ---
plot(t, x,
type = "l", # "l" = line
lwd = 2.5, # line width
col = "#2C7BB6", # color (blue)
xlab = "Time (sec)",
ylab = "Distance x (m)",
main = "Distance versus Time — x(t)",
cex.main = 1.3, cex.lab = 1.1)
# Vertical dashed line at t=30 (phase change)
abline(v = t_switch, lty = 2, col = "gray50")
text(31, max(x) * 0.15, "Start of\nacceleration",
adj = 0, col = "gray40", cex = 0.9)
# Label for each phase
text(13, max(x) * 0.85, "Phase A\n(straight line)", col = "#2C7BB6", cex = 0.95)
text(47, max(x) * 0.20, "Phase B\n(parabola)", col = "#2C7BB6", cex = 0.95)
# -------------------------------------------------------
# Tangent line in the acceleration phase
# We pick the moment t₀ = 45 sec
# At this point:
# - the distance is x(45)
# - the slope of the tangent = derivative = v(45)
# -------------------------------------------------------
t0 <- 45 # moment
x_t0 <- x_at_switch + v0*(t0 - t_switch) + 0.5*a*(t0 - t_switch)^2
v_t0 <- v0 + a*(t0 - t_switch) # instantaneous speed = slope of tangent
# Equation of the tangent line: y = x(t₀) + v(t₀) · (t - t₀)
t_tan <- seq(t0 - 10, t0 + 10, length.out = 50)
y_tan <- x_t0 + v_t0 * (t_tan - t0)
# We draw the tangent
lines(t_tan, y_tan, col = "#E66101", lwd = 2.5)
# Point of contact (dot)
points(t0, x_t0, pch = 19, col = "#E66101", cex = 1.6)
# Annotation with arrow
arrows(x0 = 53, y0 = x_t0 + 280,
x1 = t0 + 0.5, y1 = x_t0 + 30,
length = 0.1, col = "#E66101", lwd = 1.5)
text(53.5, x_t0 + 320,
paste0("slope of tangent\n= v(", t0, ") = ", v_t0, " m/s"),
col = "#E66101", cex = 0.9, adj = 0)
# --- Plot 2: Speed vs Time ---
plot(t, v,
type = "l",
lwd = 2.5,
col = "#1A9641", # green
xlab = "Time (sec)",
ylab = "Speed v (m/s)",
main = "Speed versus Time — v(t) = dx/dt",
cex.main = 1.3, cex.lab = 1.1)
abline(v = t_switch, lty = 2, col = "gray50")
text(31, max(v) * 0.25, "Start of\nacceleration",
adj = 0, col = "gray40", cex = 0.9)
# Arrow showing that the slope of the line = acceleration
text(40, 32, "slope = a = 1 m/s²", col = "#1A9641", cex = 0.9)
# --- Plot 3: Acceleration vs Time ---
plot(t, acc,
type = "l",
lwd = 2.5,
col = "#D7191C", # red
xlab = "Time (sec)",
ylab = "Acceleration a (m/s²)",
main = "Acceleration versus Time — a(t) = dv/dt",
ylim = c(-0.3, 1.5),
cex.main = 1.3, cex.lab = 1.1)
abline(v = t_switch, lty = 2, col = "gray50")
abline(h = 0, lty = 3, col = "gray70")
text(31, 1.3, "Start of\nacceleration",
adj = 0, col = "gray40", cex = 0.9)In the first plot we just added a tangent line to the distance curve, at the point t = 45 sec.
💡 The central geometric idea: The slope of the tangent line at any point of the distance curve gives us the instantaneous speed at exactly that moment in time.
The steeper (larger angle with the horizontal axis) the tangent is, the greater the instantaneous speed.
Let us see it by drawing multiple tangents at different moments in time:
# -------------------------------------------------------
# We choose four moments in time to show
# how the slope of the tangent changes along the curve
# -------------------------------------------------------
t_points <- c(15, 35, 45, 55) # moments for the tangents
colors_t <- c("#1A9641", "#FDAE61", "#E66101", "#D7191C")
par(mar = c(4.5, 5, 3, 2))
# Distance curve
plot(t, x,
type = "l", lwd = 2.5, col = "#2C7BB6",
xlab = "Time (sec)", ylab = "Distance x (m)",
main = "The slope of the tangent = instantaneous speed",
cex.main = 1.2)
abline(v = t_switch, lty = 2, col = "gray60")
# -------------------------------------------------------
# Loop: for each moment in time we compute
# - the position x(ti)
# - the instantaneous speed v(ti) (= slope of tangent)
# - and we draw the tangent
# -------------------------------------------------------
for (i in seq_along(t_points)) {
ti <- t_points[i]
# Position at the point of contact
if (ti <= t_switch) {
xi <- v0 * ti # Phase A
vi <- v0 # constant speed
} else {
xi <- x_at_switch + v0*(ti - t_switch) + 0.5*a*(ti - t_switch)^2
vi <- v0 + a*(ti - t_switch) # accelerating
}
# Tangent: y = xi + vi · (t - ti)
tt <- seq(ti - 6, ti + 6, length.out = 30)
yy <- xi + vi * (tt - ti)
lines(tt, yy, col = colors_t[i], lwd = 2)
points(ti, xi, pch = 19, col = colors_t[i], cex = 1.4)
# Label with the instantaneous speed
text(ti, xi - 130,
paste0("t=", ti, "s\nv=", vi, " m/s"),
col = colors_t[i], cex = 0.85, font = 2)
}
legend("topleft",
legend = "Distance curve x(t)",
col = "#2C7BB6", lty = 1, lwd = 2.5,
bty = "n", cex = 0.95)| Moment | Slope of tangent | Instantaneous speed |
|---|---|---|
| t = 15 s (Phase A) | Moderate — constant | 20 m/s |
| t = 35 s (Phase B, early) | A bit steeper | 25 m/s |
| t = 45 s (Phase B, middle) | Steeper | 35 m/s |
| t = 55 s (Phase B, end) | Very steep | 45 m/s |
In Phase A all the tangents have the same slope — because the curve is a straight line, the line is its own tangent. So the speed is constant (20 m/s).
In Phase B each tangent is steeper than the previous one. This means: the speed increases — that is, we have acceleration.
\[ v(t_0) = \frac{dx}{dt}\bigg|_{t=t_0} = \text{slope of the tangent of } x(t) \text{ at } t_0 \]
This is exactly the geometric meaning of the derivative: the derivative at a point = slope of the tangent line at that point.
Look at the three plots together and observe:
| Plot | Phase A (0–30 sec) | Phase B (30–60 sec) |
|---|---|---|
| Distance x(t) | Straight line | Curve (parabola) |
| Speed v(t) | Horizontal line | Rising line |
| Acceleration a(t) | = 0 | = 1 m/s² (constant) |
\[\boxed{v(t) = \frac{dx}{dt}} \qquad \text{and} \qquad \boxed{a(t) = \frac{dv}{dt} = \frac{d^2x}{dt^2}}\]
In simple terms: - The speed tells us how fast the position changes. - The acceleration tells us how fast the speed changes. - This is exactly the relationship that the derivative expresses.
We don’t need formulas to compute (approximately) the derivative. It is enough to see how much the function changes over a very small step in time.
# -------------------------------------------------------
# diff() computes the differences between consecutive values
# E.g. diff(c(1, 3, 6)) → c(2, 3)
#
# The numerical derivative: dx/dt ≈ Δx / Δt
# Δt = 0.1 sec (the step of t we defined at the start)
# -------------------------------------------------------
dt <- 0.1
# Numerical derivative of distance → should resemble v
v_numerical <- diff(x) / dt
# Numerical derivative of speed → should resemble acc
a_numerical <- diff(v) / dt
# The time for the derivatives has one element less
t_deriv <- t[-1] # we remove the first element
# Comparison: numerical vs analytical speed
cat("Maximum deviation v_numerical vs v_analytical:",
round(max(abs(v_numerical - v[-1])), 4), "m/s\n")## Maximum deviation v_numerical vs v_analytical: 0.05 m/s
# -------------------------------------------------------
# Visual comparison: analytical speed (line)
# vs numerical derivative (dashed)
# -------------------------------------------------------
par(mar = c(4.5, 5, 3, 2))
plot(t, v,
type = "l", lwd = 2.5, col = "#1A9641",
xlab = "Time (sec)", ylab = "Speed (m/s)",
main = "Speed: Analytical vs Numerical Derivative",
cex.main = 1.2)
lines(t_deriv, v_numerical,
lty = 2, lwd = 2, col = "#D7191C")
legend("topleft",
legend = c("Analytical v(t)", "Numerical dx/dt"),
col = c("#1A9641", "#D7191C"),
lty = c(1, 2), lwd = 2,
bty = "n", cex = 1.0)The two curves coincide almost perfectly — this confirms that the derivative of the distance is indeed the speed!
Why do we learn these things in a biology course?
In biology we are often interested in the rate at which something changes:
| Biological Quantity | «Distance» | «Speed» (derivative) |
|---|---|---|
| Population size N(t) | N | dN/dt = growth rate |
| Drug concentration C(t) | C | dC/dt = excretion rate |
| Biomass B(t) | B | dB/dt = production rate |
In the next lessons we will see exactly this: how the rate of change of the population (i.e. the derivative dN/dt) determines whether a population grows, shrinks or stabilizes.
In Phase A, the distance-time graph is a straight line. What does this mean for its derivative (= speed)?
In Phase B, the distance follows a parabola. What shape does the speed have? And the acceleration?
If a population of bacteria grows exponentially, how do you expect the graph of the growth rate dN/dt versus time to look?
In the next lesson: Exponential Population Growth — N(t) = N₀ · e^(r·t)