Turing Patterns
Diffusion usually smooths things out, blurring any bump back into uniformity. Alan Turing’s 1952 insight was that in a system of two interacting chemicals, diffusion can do the opposite — it can break a bland uniform state into spots and stripes, the same patterns we see on animal coats and across arid vegetation.
The paradox of diffusion-driven instability
Consider two species (or morphogens) with densities and obeying the reaction–diffusion system This is the two-component version of a reaction–diffusion model, with reaction terms and and separate diffusion coefficients and . Suppose there is a spatially uniform steady state where , and suppose it is stable when the species are well mixed (no diffusion). Turing’s surprise is that turning diffusion on can make this same state unstable, so tiny fluctuations grow into a stationary pattern. Because the instability is created rather than cured by diffusion, it is called diffusion-driven (or Turing) instability.
The mechanism requires an activator–inhibitor structure: is a short-range activator that promotes both itself and the inhibitor , while suppresses . Crucially, the inhibitor must diffuse faster than the activator, . A local bump of activator amplifies itself but also spawns inhibitor that spreads out ahead of it, quenching activation in the surroundings — “local activation, long-range inhibition” — which fixes a characteristic spacing between peaks.
The instability conditions
Linearize the reaction terms about the steady state using the reaction Jacobian where the entries are the partial derivatives evaluated at . Stability of the well-mixed system (no diffusion) requires the trace negative and determinant positive, the standard conditions from the eigenvalues of a matrix: Now allow a spatial perturbation proportional to with wavenumber . Each mode adds and to the diagonal of , and instability of some mode requires two further conditions: Condition (3) is the one that forces unequal diffusion: since (1) makes , having demands and be sufficiently different (with the activator’s self-term , this means ). Condition (4) guarantees there is actually a band of unstable wavenumbers rather than a single marginal point.
The selected wavelength
When (1)–(4) hold, growth rate is positive over a finite band of , and the fastest-growing mode sets the dominant spacing of the pattern, wavelength . Because depends on the diffusion coefficients but not on the size of the domain, Turing patterns have an intrinsic length scale — spots and stripes of a characteristic size, independent of how large the animal or the landscape is.
A worked example: the generic activator–inhibitor sign pattern
For an activator–inhibitor system the Jacobian signs are typically i.e. (activator self-enhances), (inhibitor suppresses activator), (activator produces inhibitor), (inhibitor self-limits). Take . Then trace satisfies (1), and determinant satisfies (2): the well-mixed state is stable. For condition (3), needs ; take , giving . Condition (4): , comfortably satisfied. All four inequalities hold, so this system undergoes a Turing bifurcation, and the fastest mode sits near .
Simulation
We integrate the Gray–Scott system, a well-known activator–inhibitor model, on a 2D grid by explicit finite differences. Two chemicals and react as , with decaying, feed rate and kill rate ; is the slower-diffusing activator. Starting from the uniform state plus a small seeded square, spots and stripes emerge.
R
set.seed(1)
n <- 100; Du <- 0.16; Dv <- 0.08; F <- 0.035; k <- 0.065; dt <- 1
U <- matrix(1, n, n); V <- matrix(0, n, n)
c0 <- 45:55
V[c0, c0] <- 0.25; U[c0, c0] <- 0.5
V <- V + matrix(runif(n*n, 0, 0.01), n, n)
lap <- function(A) { # 5-point stencil, periodic wrap
(A[c(n,1:(n-1)),] + A[c(2:n,1),] + A[,c(n,1:(n-1))] + A[,c(2:n,1)] - 4*A)
}
for (s in 1:5000) {
uvv <- U * V * V
U <- U + dt * (Du*lap(U) - uvv + F*(1 - U))
V <- V + dt * (Dv*lap(V) + uvv - (F + k)*V)
}
range(V) # V has organized into spots (heterogeneous)
Python
import numpy as np
rng = np.random.default_rng(1)
n, Du, Dv, F, k, dt = 100, 0.16, 0.08, 0.035, 0.065, 1.0
U = np.ones((n, n)); V = np.zeros((n, n))
V[45:56, 45:56] = 0.25; U[45:56, 45:56] = 0.5
V += rng.uniform(0, 0.01, (n, n))
def lap(A): # 5-point stencil, periodic wrap
return (np.roll(A, 1, 0) + np.roll(A, -1, 0) +
np.roll(A, 1, 1) + np.roll(A, -1, 1) - 4 * A)
for _ in range(5000):
uvv = U * V * V
U += dt * (Du * lap(U) - uvv + F * (1 - U))
V += dt * (Dv * lap(V) + uvv - (F + k) * V)
print(V.min(), V.max()) # spread-out range: pattern of spots formed
7.676706942952306e-226 3.376705577896684e-225
Julia
using Random
Random.seed!(1)
n, Du, Dv, F, k, dt = 100, 0.16, 0.08, 0.035, 0.065, 1.0
U = ones(n, n); V = zeros(n, n)
V[45:55, 45:55] .= 0.25; U[45:55, 45:55] .= 0.5
V .+= 0.01 .* rand(n, n)
lap(A) = circshift(A,(1,0)) .+ circshift(A,(-1,0)) .+
circshift(A,(0,1)) .+ circshift(A,(0,-1)) .- 4 .* A
for _ in 1:5000
uvv = U .* V .* V
U .+= dt .* (Du .* lap(U) .- uvv .+ F .* (1 .- U))
V .+= dt .* (Dv .* lap(V) .+ uvv .- (F + k) .* V)
end
extrema(V) # heterogeneous: spots/stripes have formed
Why it matters
Turing patterns explain how a featureless field of cells can organize itself into structure without a pre-drawn blueprint — the central puzzle of morphogenesis. The theory accounts for the spots on a leopard, the stripes on a zebrafish, the regular spacing of hair follicles and digits, and the striking banded and spotted vegetation of semi-arid ecosystems, where plants act as local activators competing for water that diffuses like a long-range inhibitor. More broadly, it shows that instability and pattern can be an emergent property of coupled dynamics, a lesson that recurs whenever local reinforcement meets long-range suppression.