5D Library › Phase Transitions, Critical Slowing Down and Resilience in Complex Dynamical Systems · 中文

Chapter 1 Folds, Hysteresis and Flips That Are Hard to Undo

A calm surface

In many ecosystems change is not proportional to pressure. A shallow lake can stay clear through decades of slowly rising nutrient loading and then switch within a short time to a turbid state dominated by phytoplankton; a coral reef can be overgrown by macroalgae within a few years. In their 2001 review Scheffer, Carpenter, Foley, Folke and Walker called such events “catastrophic shifts” in ecosystems and discussed lakes, coral reefs, woodlands, deserts and oceans within a single framework (Scheffer et al. 2001).

The core of that framework is that under the same external conditions a system may have more than one stable state. As conditions change slowly, the stable state the system occupies grows shallower until, at some point, it disappears and the system has to jump to another stable state; even if conditions are then returned to where the jump happened, the system does not come back. This difference between the way out and the way back is called hysteresis.

The grazing model

Calculation

Let xx be the amount of vegetation (or of a harvested population). It grows logistically and is consumed by herbivores (or harvested) with intensity cc; consumption is a sigmoid (Holling type III) function of xx: when vegetation is scarce the animals find little to eat, and when it is plentiful they are satiated and eat no more.

dxdt=rx(1−xK)−cx2x2+a2\frac{\mathrm{d}x}{\mathrm{d}t} = r x\left(1 – \frac{x}{K}\right) – c\,\frac{x^2}{x^2 + a^2}

Apart from x=0x = 0, the equilibrium condition can be written c(x)=r(1−x/K)(x2+a2)/xc(x) = r\,(1 – x/K)\,(x^2 + a^2)/x, that is, “xx is an equilibrium at pressure cc”. The function c(x)c(x) first falls, then rises, then falls again; its local minimum and maximum are the two saddle-node bifurcations (folds) c1c_1 and c2c_2. For cc between them the system has two stable equilibria separated by an unstable one.

The graphical analysis of grazing systems by plant growth and consumption curves (sigmoid ones among them) goes back to Noy-Meir (Noy-Meir 1975); in his 1977 review May placed it alongside other simple models with multiple stable states, applied them to grazing systems, insect pests and some human host–parasite systems, and discussed “thresholds” and “breakpoints” (May 1977). This book uses the dimensionless illustrative values r=1r = 1, K=10K = 10, a=1a = 1, which correspond to no particular pasture or fishery.

Calculation

The program finds the two folds; raises the pressure very slowly from 1.0 to 3.0 and lowers it again, recording where the jumps occur; and, starting from the collapsed state at pressure 2.7, lowers the pressure to various levels to see whether the system recovers.

Calculation

# Folds (saddle-node bifurcations) and hysteresis in the grazing model of Noy-Meir (1975) and
# May (1977): dx/dt = r x (1 - x/K) - c x^2/(x^2 + a^2); x = vegetation (or a harvested
# stock), c = grazing / harvesting pressure. Illustrative values r = 1, K = 10, a = 1.
R, K, A = 1.0, 10.0, 1.0
f = lambda x, c: R * x * (1 - x / K) - c * x * x / (x * x + A * A)
c_of_x = lambda x: R * (1 - x / K) * (x * x + A * A) / x    # x > 0 is an equilibrium at c
dc = lambda x, h=1e-6: (c_of_x(x + h) - c_of_x(x - h)) / (2 * h)

def bisect(g, lo, hi, n=80):
    for _ in range(n):
        mid = (lo + hi) / 2
        if (g(lo) > 0) == (g(mid) > 0): lo = mid
        else: hi = mid
    return (lo + hi) / 2

X1, X2 = bisect(dc, 0.5, 2.5), bisect(dc, 2.5, 9.0)    # local min and max of c(x)
C1, C2 = c_of_x(X1), c_of_x(X2)

def equilibria(c):
    xs, roots = [i * 0.01 for i in range(1, 1000)], []
    for u, v in zip(xs, xs[1:]):
        if (f(u, c) > 0) != (f(v, c) > 0):
            x = bisect(lambda x: f(x, c), u, v)
            if not roots or x - roots[-1] > 0.02: roots.append(x)
    return roots

def settle(x, c, t=200.0, dt=0.01):
    for _ in range(int(t / dt)): x += f(x, c) * dt
    return x

if __name__ == "__main__":
    print(f"folds: c1 = {C1:.3f} (at x = {X1:.2f}), c2 = {C2:.3f} (at x = {X2:.2f})")
    print("   c    equilibria (stable / unstable / stable)")
    for c in (1.5, 1.8, 2.2, 2.6, 2.7):
        print(f"  {c:.1f}   " + "  ".join(f"{x:5.2f}" for x in equilibria(c)))
    x, c, up, down = settle(9.0, 1.0), 1.0, None, None   # slow sweep, dc/dt = 0.0005
    while c < 3.0:
        x += f(x, c) * 0.01; c += 0.000005
        if up is None and x < 3.0: up = c
    while c > 1.0:
        x += f(x, c) * 0.01; c -= 0.000005
        if down is None and x > 3.0: down = c
    print(f"slow sweep up: collapse at c = {up:.3f}; sweep down: recovery at c = {down:.3f}")
    low = settle(9.0, 2.7)              # collapsed at c = 2.7: how far must c be cut?
    print(f"collapsed state at c = 2.7: x = {low:.2f}")
    ends = [(c, settle(low, c, t=400.0)) for c in (2.5, 2.2, 2.0, 1.85, 1.80, 1.75, 1.5)]
    print("  pressure cut to c:  " + "  ".join(f"{c:4.2f}" for c, _ in ends))
    print("  x settles at:       " + "  ".join(f"{e:4.2f}" for _, e in ends)
          + "   (> 3 = recovered)")
# folds: c1 = 1.787 (at x = 1.14), c2 = 2.604 (at x = 4.78)
#    c    equilibria (stable / unstable / stable)
#   1.5    8.20
#   1.8    1.00   1.30   7.70
#   2.2    0.57   2.57   6.86
#   2.6    0.44   4.56   5.00
#   2.7    0.42
# slow sweep up: collapse at c = 2.635; sweep down: recovery at c = 1.762
# collapsed state at c = 2.7: x = 0.42
#   pressure cut to c:  2.50  2.20  2.00  1.85  1.80  1.75  1.50
#   x settles at:       0.46  0.57  0.68  0.86  1.00  7.79  8.20   (> 3 = recovered)
Equilibria of the grazing model as functions of the pressure c (r = 1, K = 10, a = 1). Blue: the vegetated stable state; purple: the collapsed low state; dashed: the unstable equilibrium between them. Above c_2 \approx 2.60 the upper state vanishes and the system jumps down; to get back, the pressure must fall below c_1 \approx 1.79.

The two folds lie at c1=1.787c_1 = 1.787 and c2=2.604c_2 = 2.604. Between them a single value of cc allows two outcomes: at c=2.2c = 2.2 the vegetation can settle at 6.86 or at 0.57, and the value 2.57 in between is the boundary of the two basins of attraction. The slow sweep shows hysteresis: on the way up the system collapses at c=2.635c = 2.635 (slightly beyond 2.604, because the pressure keeps moving and the system lags behind), and on the way down it recovers only at c=1.762c = 1.762. Starting from the collapsed state at c=2.7c = 2.7, cutting the pressure to 2.5, 2.2, 2.0 or even 1.80 leaves the system in the low state; only at 1.75, below c1c_1, does the vegetation return to 7.79. Once c2c_2 has been crossed, the pressure must be about 31 % lower than at the collapse for recovery. This is what the author’s framework means by “pulling the pressure back well below the other bifurcation point”.

Note

Terminology. Chapter 4 of Volume 13 of 5D Library used the normal form of the cusp to discuss hysteresis and the “bottleneck” near a fold; there the two folds are symmetric. The grazing model’s folds are not, and its collapsed state is low but not zero; recovery follows once the pressure falls below c1c_1. Strictly, this is hysteresis; “irreversibility” requires a stronger condition.

Reversible, hysteretic and irreversible

Calculation

A dimensionless phosphorus model of a shallow lake (after the model of Carpenter, Ludwig and Brock 1999 and Box 1 of the review by Scheffer and colleagues 2001):

dxdt=a−bx+xq1+xq\frac{\mathrm{d}x}{\mathrm{d}t} = a – b\,x + \frac{x^q}{1 + x^q}

xx is phosphorus in the water (turbidity), aa is loading from the catchment, bb the rate of loss by outflow and burial, and the last term the positive feedback by which anoxic sediments release phosphorus back into the water; q=8q = 8. The program sorts lakes by bb into three types: “reversible” lakes with no fold; “hysteretic” lakes with both folds at positive loading; and “irreversible” lakes whose fold for the way back lies at negative loading.

Calculation

# Reversible, hysteretic and irreversible lakes (after Carpenter, Ludwig & Brock 1999 and
# Box 1 of Scheffer et al. 2001). Dimensionless phosphorus model:
#   dx/dt = a - b x + x^q / (1 + x^q)
# x = phosphorus in the water (turbidity), a = loading from the catchment, b = loss rate
# (outflow, burial), x^q/(1+x^q) = recycling from the sediment. q = 8; values illustrative.
Q = 8

def a_eq(x, b):                     # loading at which x is an equilibrium
    return b * x - x ** Q / (1 + x ** Q)

def folds(b):
    xs = [i / 2000 for i in range(1, 8000)]
    ext = []
    for u, v, w in zip(xs, xs[1:], xs[2:]):
        if (a_eq(v, b) - a_eq(u, b)) * (a_eq(w, b) - a_eq(v, b)) < 0:
            ext.append(a_eq(v, b))
    return ext                       # [] or [a_on, a_off]

def settle(x, a, b, t=300.0, dt=0.01):
    for _ in range(int(t / dt)):
        x += (a - b * x + x ** Q / (1 + x ** Q)) * dt
    return x

print("loss b   lake type      tips to turbid at a >  returns to clear at a <")
for b in (2.5, 1.0, 0.8, 0.6, 0.45):
    fo = folds(b)
    if not fo:
        print(f"  {b:4.2f}   reversible     (no fold: x changes smoothly with a)")
        continue
    a_on, a_off = fo
    kind = "hysteretic" if a_off > 0 else "IRREVERSIBLE"
    note = f"{a_off:6.3f}" if a_off > 0 else f"{a_off:6.3f} (impossible: a >= 0)"
    print(f"  {b:4.2f}   {kind:13s}  {a_on:6.3f}                 {note}")
for b in (1.0, 0.6):
    a_on, a_off = folds(b)
    x = settle(0.2, a_on + 0.05, b)                 # loading pushed just past the fold
    print(f"b = {b}: loading {a_on + 0.05:.3f} -> turbid x = {x:.2f}; loading cut to")
    for a in (a_on - 0.05, max(a_off, 0) + 0.03, max(a_off - 0.03, 0.0)):
        print(f"    a = {a:.3f}: x = {settle(x, a, b):.2f}")
# loss b   lake type      tips to turbid at a >  returns to clear at a <
#   2.50   reversible     (no fold: x changes smoothly with a)
#   1.00   hysteretic      0.660                  0.389
#   0.80   hysteretic      0.510                  0.144
#   0.60   IRREVERSIBLE    0.366                 -0.111 (impossible: a >= 0)
#   0.45   IRREVERSIBLE    0.262                 -0.309 (impossible: a >= 0)
# b = 1.0: loading 0.710 -> turbid x = 1.70; loading cut to
#     a = 0.610: x = 1.59
#     a = 0.419: x = 1.32
#     a = 0.359: x = 0.36
# b = 0.6: loading 0.416 -> turbid x = 2.36; loading cut to
#     a = 0.316: x = 2.19
#     a = 0.030: x = 1.69
#     a = 0.000: x = 1.63

With a high loss rate (b=2.5b = 2.5) the lake responds smoothly to loading. With b=1.0b = 1.0 the water turns turbid once loading exceeds 0.660, and to become clear again loading must fall below 0.389, about 41 % lower than at the flip; with b=0.8b = 0.8 it must fall by about 72 %. With b=0.6b = 0.6 and 0.45 the threshold for the way back is negative: even with the catchment loading cut to zero the lake stays turbid (x=1.63x = 1.63). Carpenter and colleagues pointed out that for irreversible lakes reducing the loading is not enough; the lake itself must be changed, for example by removing phosphorus-rich sediment (Carpenter et al. 1999).

Evidence: lakes

Evidence

Shallow lakes. Scheffer and colleagues summarised that shallow lakes can switch abruptly from a clear state with submerged plants to a turbid, algae-dominated state when nutrient loading crosses a threshold, the loss of plants then helping to keep the water turbid; restoring the clear state needs nutrient levels “substantially lower” than those at which the collapse occurred, and simply reversing the loading often fails. They gave Lake Veluwe in the Netherlands as an example and noted that, when nutrients are not too high, a short, drastic reduction of fish can make the water clear again (Scheffer et al. 2001). Jeppesen and colleagues collected long-term data from 35 lakes after nutrient loading had been reduced (5–35 years, mean 16): in most lakes total phosphorus reached a new equilibrium only after 10–15 years, phosphorus stored in the sediment having slowed recovery (Jeppesen et al. 2005).

The latter data agree with the qualitative prediction of the hysteresis model, but by themselves they cannot distinguish “hysteresis between multiple stable states” from “a single equilibrium approached very slowly”: a store of phosphorus in the sediment can by itself cause a delay of many years.

Evidence and dispute: coral reefs

Evidence

Jamaican reefs. Hughes documented the degradation of Jamaican reefs: coral cover at 10 m fell from a mean of 52 % in 1977–1980 to 3 % in 1990–1993, while fleshy macroalgae rose from 4 % to 92 %. The causes included decades of overfishing, Hurricane Allen in 1980 and a pathogen that in 1983 cut the density of the algae-grazing sea urchin Diadema antillarum by 99 %, with no recovery over the following decade (Hughes 1994). Using models, Mumby, Hastings and Edwards concluded that Caribbean reefs have generally lost resilience since 1983 and become highly sensitive to the overfishing of parrotfish (Mumby et al. 2007).

Evidence

The dispute. Bruno and colleagues analysed 3,581 surveys of 1,851 reefs worldwide made in 1996–2006 and found that only about 4 % were dominated by macroalgae (cover above 50 %), and only 1 % in the Indo-Pacific (Bruno et al. 2009). Dudgeon, Aronson, Bruno and Precht argued that, where firm conclusions can be drawn, fossil and modern data “overwhelmingly” support the phase-shift hypothesis rather than the alternative-stable-states hypothesis: a given tropical reef environment supports at most one stable community, and confusion in the literature comes from misunderstanding the theory and from conflating phase shifts caused by persistent environmental change with switches between alternative stable states; if the environment of degraded reefs is restored, the communities should return to coral dominance (Dudgeon et al. 2010).

The dispute decides the direction of management. If reefs are hysteretic, recovery needs “over-correction”; if a reef is a single state that tracks its environment, restoring the environment is enough. The two hypotheses do not differ in whether change is abrupt but in whether the way back differs from the way out, and that can be tested only after the environment has been improved.

Note

The limits of analogy. “Once past the threshold, a large reversal is needed for recovery” is often used to describe the vicious circle of a company’s cash flow, or the body’s sudden decompensation under long stress. As an analogy it draws attention to positive feedback and asymmetric paths of recovery; but the models and evidence in this chapter come from ecosystems and must not be used for any business or investment decision, or for any medical judgment about anyone. This book is neither investment advice nor medical advice.

Hypothesis · not established

Underestimated hysteresis (not yet established). The author conjectures that people managing a resource system with hysteresis tend to assume that “returning the pressure to where things went wrong will bring recovery”. A testable prediction: in a simulated harvesting task whose structure participants do not know, after a collapse most participants’ first reduction of effort is not enough to bring the pressure below the recovery threshold c1c_1. If, in a pre-registered experiment, most participants’ first adjustment brings the pressure below c1c_1, the hypothesis is refuted.

Chapter summary

Systems with positive feedback can have two stable states over a range of conditions. In the grazing model, once the pressure exceeds c2≈2.60c_2 \approx 2.60 the system jumps to the low state, and recovery requires a fall below c1≈1.79c_1 \approx 1.79, about 31 % below the collapse point. In the lake phosphorus model the same structure yields reversible, hysteretic and irreversible behaviour, depending on the loss rate. The evidence for multiple stable states and slow recovery is good for lakes; whether coral reefs have alternative stable states remains disputed. The next chapter asks whether the approach to a fold can be seen in a system’s response to small disturbances.

References

Bruno, John F., Hugh Sweatman, William F. Precht, Elizabeth R. Selig, and Virginia G. W. Schutte. 2009. “Assessing Evidence of Phase Shifts from Coral to Macroalgal Dominance on Coral Reefs.” Ecology 90 (6): 1478–84. https://doi.org/10.1890/08-1781.1.
Carpenter, S. R., D. Ludwig, and W. A. Brock. 1999. “Management of Eutrophication for Lakes Subject to Potentially Irreversible Change.” Ecological Applications 9 (3): 751–71.
Dudgeon, Steven R., Richard B. Aronson, John F. Bruno, and William F. Precht. 2010. “Phase Shifts and Stable States on Coral Reefs.” Marine Ecology Progress Series 413: 201–16. https://doi.org/10.3354/meps08751.
Hughes, Terence P. 1994. “Catastrophes, Phase Shifts, and Large-Scale Degradation of a Caribbean Coral Reef.” Science 265 (5178): 1547–51. https://doi.org/10.1126/science.265.5178.1547.
Jeppesen, Erik, Martin Søndergaard, Jens Peder Jensen, et al. 2005. “Lake Responses to Reduced Nutrient Loading: An Analysis of Contemporary Long-Term Data from 35 Case Studies.” Freshwater Biology 50 (10): 1747–71. https://doi.org/10.1111/j.1365-2427.2005.01415.x.
May, Robert M. 1977. “Thresholds and Breakpoints in Ecosystems with a Multiplicity of Stable States.” Nature 269 (5628): 471–77. https://doi.org/10.1038/269471a0.
Mumby, Peter J., Alan Hastings, and Helen J. Edwards. 2007. “Thresholds and the Resilience of Caribbean Coral Reefs.” Nature 450 (7166): 98–101. https://doi.org/10.1038/nature06252.
Noy-Meir, Imanuel. 1975. “Stability of Grazing Systems: An Application of Predator–Prey Graphs.” Journal of Ecology 63 (2): 459–81. https://doi.org/10.2307/2258730.
Scheffer, Marten, Steve Carpenter, Jonathan A. Foley, Carl Folke, and Brian Walker. 2001. “Catastrophic Shifts in Ecosystems.” Nature 413 (6856): 591–96. https://doi.org/10.1038/35098000.

Fan, Y. (2026). Phase Transitions, Critical Slowing Down and Resilience in Complex Dynamical Systems: From Saddle-Node Bifurcations and Early-Warning Signals to Cascading Failures, Read Beside Classical Chinese Thought on Incipient Change [复杂系统相变、临界慢化与生态韧性的非线性动力学] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23770082 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).