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

Chapter 4 Two Kinds of Resilience: Recovering Quickly or Withstanding the Blow

One word, two meanings

Evidence

Holling 1973. Holling distinguished “stability” from “resilience”. Stability is the ability of a system to return to an equilibrium after a temporary disturbance; the faster it returns and the less it fluctuates, the more stable it is. Resilience is the ability of a system to absorb changes of state variables, driving variables and parameters and still persist with the same relationships: “resilience determines the persistence of relationships within a system”. He noted that a system can be highly resilient and yet fluctuate greatly (have low stability), and that the very approach that assures a stable maximum sustained yield may so change the system’s conditions that resilience is lost or reduced, so that a chance and rare event that could once be absorbed triggers a sudden, dramatic change (Holling 1973).

Evidence

Pimm 1984. Pimm reviewed the “complexity and stability” debate: early studies held that simple ecosystems were less stable than complex ones, later studies reached the opposite conclusion, and he traced the confusion to the many different meanings of both words. In his usage resilience is the speed with which variables return to equilibrium after a perturbation (Pimm 1984).

In 1996 Holling distinguished these two usages as “engineering resilience” and “ecological resilience”: the first concerns stability near a single equilibrium, measured by resistance to disturbance and speed of return, and here he cited O’Neill and colleagues, Pimm 1984 and Tilman and Downing together, saying that this view “may be termed engineering resilience”; the second is the size of disturbance a system can absorb before it changes its structure (Holling 1996). The name “engineering resilience” thus comes from Holling’s 1996 essay; Pimm in 1984 spoke simply of “resilience”. Walker and colleagues divided ecological resilience into latitude (how wide the basin is), resistance (how steep and deep), precariousness (how close the current state is to a threshold) and panarchy, the influence of larger and smaller scales (Walker et al. 2004); Menck and colleagues proposed measuring “basin stability”, the probability of returning to a state from a random initial state, and used it to explain why regular power-grid structures lose synchrony less easily than random ones (Menck et al. 2013).

The two can rank systems in opposite orders

Van Nes and Scheffer showed that as one system gradually approaches a fold, its recovery rate and the width of its basin shrink together (Nes and Scheffer 2007). When different systems are compared, however, the two need not agree.

Calculation

Two grazing systems (illustrative parameters): A grows fast and is heavily grazed (r=1.0r = 1.0, c=2.3c = 2.3); B grows slowly and is lightly grazed (r=0.5r = 0.5, c=1.0c = 1.0). We compare engineering resilience (recovery rate, variance under small noise) with ecological resilience (basin width, largest single loss absorbed, basin stability), and the probability of flipping under two shock regimes: “rare” shocks (probability 0.5 % per time unit for 1,000 units) and “frequent” ones (2 % for 500 units), each removing a random 0–80 % of the vegetation.

Calculation

# Engineering resilience (Pimm 1984: speed of return) versus ecological resilience
# (Holling 1973: how large a disturbance can be absorbed; width of the basin of attraction).
# Two grazing systems dx/dt = r x (1 - x/10) - c x^2/(x^2 + 1), illustrative parameters:
#   A: r = 1.0, c = 2.3  (fast-growing, heavily grazed)
#   B: r = 0.5, c = 1.0  (slow-growing, lightly grazed: c/r = 2.0)
# "Basin stability" (Menck et al. 2013): share of random states in (0, 10) that return to the
# upper state. Shock tests: in each time unit a chance p of losing a random share U(0, 0.8)
# of x; "rare": p = 0.005 for 1,000 units; "frequent": p = 0.02 for 500 units; sigma = 0.15.
import math, random
rng = random.Random(8)
K = 10.0

def f(x, r, c):
    return r * x * (1 - x / K) - c * x * x / (x * x + 1)

def roots(r, c):
    xs, out = [i * 0.001 for i in range(1, 10000)], []
    for u, v in zip(xs, xs[1:]):
        if (f(u, r, c) > 0) != (f(v, r, c) > 0): out.append((u + v) / 2)
    return out                                   # low stable, unstable, high stable

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

def shock_run(r, c, T, p, sigma=0.15, dt=0.1):
    _, mid, x = roots(r, c)
    for _ in range(T):
        if rng.random() < p: x *= 1 - rng.uniform(0, 0.8)
        for _ in range(10):
            x += f(x, r, c) * dt + sigma * math.sqrt(dt) * rng.gauss(0, 1)
        if x < mid - 0.5: return True
    return False

print("system  x*    unstable  basin  largest single  return  Var(small  basin      P(tip)")
print("                         width  loss absorbed   rate    noise)    stability  rare  frequent")
for name, r, c in (("A", 1.0, 2.3), ("B", 0.5, 1.0)):
    lo, mid, hi = roots(r, c)
    lam = -(f(hi + 1e-6, r, c) - f(hi - 1e-6, r, c)) / 2e-6
    bs = sum(settle(rng.uniform(0, 10), r, c) > mid for _ in range(400)) / 400
    rare = sum(shock_run(r, c, 1000, 0.005) for _ in range(300)) / 300
    freq = sum(shock_run(r, c, 500, 0.02) for _ in range(300)) / 300
    print(f"  {name}    {hi:4.2f}    {mid:4.2f}    {hi - mid:4.2f}      {1 - mid / hi:4.0%}"
          f"        {lam:5.3f}   {0.15 ** 2 / (2 * lam):.4f}     {bs:.2f}     {rare:.2f}"
          f"   {freq:.2f}")
# system  x*    unstable  basin  largest single  return  Var(small  basin      P(tip)
#                          width  loss absorbed   rate    noise)    stability  rare  frequent
#   A    6.59    2.89    3.70       56%        0.333   0.0338     0.74     0.78   0.96
#   B    7.32    2.00    5.32       73%        0.237   0.0476     0.81     0.42   0.73

By engineering resilience A is better: its recovery rate is 0.333 against 0.237, and its variance under small noise 0.0338 against 0.0476. A manager who watches only day-to-day fluctuations would judge A the steadier system. By ecological resilience B is better: its basin is 5.32 wide against 3.70; it can absorb a single shock that removes 73 % of the vegetation (A only 56 %); its basin stability is 0.81 against 0.74; and under rare, large shocks A flips in 78 % of runs and B in 42 %. The frequent-shock results add the other side: B too flips in 73 % of runs, because it recovers slowly and the next shock arrives before the previous loss has been made good. The two concepts are not right and wrong; they answer different questions: “how fast does it recover?” and “how far is it from flipping?” Measuring a system by only one of them misses half the picture.

Flattening fluctuations, draining reserves

Evidence

Cases. Holling gave several examples: in eastern Canada, spraying insecticide to suppress the spruce budworm and protect the pulp industry saved timber in the short run but made the forest more uniform and more vulnerable to a larger outbreak later; fish hatcheries raised catches but also fishing pressure, so that wild stocks declined; steady cattle stocking replaced natural pulses of grazing, and the system could flip to dominance by woody shrubs. He summed up the pattern as “short-term success in stabilizing production leads to long-term surprise” (Holling 1996). Holling and Meffe called this the “pathology” of command and control in natural resource management: reducing the natural variation of a variable system lowers its resilience (Holling and Meffe 1996).

These are generalisations from cases and conceptual arguments, not controlled tests. Two toy models show under what conditions the argument holds.

Calculation

A: a toy fire model. Fuel grows by 1 a year; each year an ignition occurs with probability 0.4, and a share ss of ignitions is suppressed; an unsuppressed ignition becomes a stand-replacing crown fire (a regime shift) with probability 1/(1+e−(F−30)/3)1/(1 + e^{-(F – 30)/3}), and otherwise a surface fire that burns 60 % of the fuel. For each ss, 2,000 forests are simulated for 300 years. B: the grazing model with a reserve RR the animals cannot reach (the “ungrazeable reserve” discussed by Noy-Meir (Noy-Meir 1975)), so that grazing acts only on vegetation above RR. All parameters are illustrative.

Calculation

# Two toy models of how removing small fluctuations or "idle" reserves can shrink a basin.
# A. Fire suppression (after the argument of Holling & Meffe 1996; illustrative parameters).
#    Fuel F grows by 1 a year. Each year an ignition occurs with probability 0.4; a share s
#    of ignitions is suppressed. An unsuppressed fire becomes a stand-replacing crown fire
#    (regime shift: forest lost) with probability 1/(1 + exp(-(F - 30)/3)); otherwise it is
#    a surface fire that burns 60 % of the fuel. 2,000 forests, 300 years each.
# B. Ungrazeable reserve (Noy-Meir 1975): consumption c (x-R)^2/((x-R)^2 + 1) acts only on
#    vegetation above a reserve R. Removing the reserve widens the range with two states.
import math, random
rng = random.Random(9)

def forest(s, years=300):
    F, burned = 0.0, []
    for y in range(years):
        F += 1.0
        if rng.random() < 0.4 and rng.random() >= s:
            if rng.random() < 1 / (1 + math.exp(-(F - 30) / 3)):
                return burned, y                        # crown fire in year y
            burned.append(0.6 * F); F *= 0.4
        else:
            burned.append(0.0)
    return burned, None

print("A. suppressed  SD of yearly   mean fuel    P(crown fire)")
print("   share s     burned fuel    (yr 1-50)    within 100 yr   within 300 yr")
for s in (0.0, 0.5, 0.8, 0.9, 0.95):
    sds, fuels, crowns = [], [], []
    for _ in range(2000):
        b, yc = forest(s)
        m = sum(b) / max(1, len(b))
        sds.append(math.sqrt(sum((u - m) ** 2 for u in b) / max(1, len(b))))
        F, fl = 0.0, []                                  # fuel path, first 50 years
        for u in b[:50]:
            F += 1.0; fl.append(F); F -= u
        fuels.append(sum(fl) / max(1, len(fl)))
        crowns.append(yc)
    c100 = sum(y is not None and y < 100 for y in crowns) / 2000
    c300 = sum(y is not None for y in crowns) / 2000
    print(f"     {s:4.2f}        {sum(sds) / len(sds):5.2f}        {sum(fuels) / len(fuels):5.1f}"
          f"         {c100:5.0%}          {c300:5.0%}")

def g(x, c, R):
    y = max(0.0, x - R)
    return x * (1 - x / 10) - c * y * y / (y * y + 1)

def roots(c, R):
    xs = [i * 0.002 for i in range(1, 5000)]
    return [(u + v) / 2 for u, v in zip(xs, xs[1:]) if (g(u, c, R) > 0) != (g(v, c, R) > 0)]

print("B. reserve R   bistable for c in   collapsed state x at c = 2.8   at c = 2.3")
for R in (1.0, 0.5, 0.0):
    cs = [c / 1000 for c in range(1500, 3200, 2)]
    bi = [c for c in cs if len(roots(c, R)) == 3]
    at23 = "two states" if len(roots(2.3, R)) == 3 else "one state only"
    print(f"     {R:3.1f}         {bi[0]:.3f} - {bi[-1]:.3f}            {roots(2.8, R)[0]:4.2f}"
          f"                {at23}")
# A. suppressed  SD of yearly   mean fuel    P(crown fire)
#    share s     burned fuel    (yr 1-50)    within 100 yr   within 300 yr
#      0.00         1.45          3.9            1%             3%
#      0.50         2.17          7.2           11%            36%
#      0.80         1.80         13.1           72%            99%
#      0.90         1.10         17.6           87%           100%
#      0.95         0.56         20.8           72%           100%
# B. reserve R   bistable for c in   collapsed state x at c = 2.8   at c = 2.3
#      1.0         2.624 - 2.676            2.33                one state only
#      0.5         2.308 - 2.632            1.34                one state only
#      0.0         1.788 - 2.604            0.40                two states

The fire model: with no suppression, the fuel burned each year varies considerably (standard deviation 1.45), the fuel stays low (a mean of 3.9 over the first 50 years), and the chance of a crown fire within 300 years is only 3 %. When 90 % or 95 % of ignitions are suppressed, year-to-year variation falls to 1.10 and 0.56 and the system looks much calmer; but fuel accumulates (means of 17.6 and 20.8 over the first 50 years), and a crown fire within 300 years becomes almost certain. With s=0.95s = 0.95 the chance within 100 years (72 %) is lower than with s=0.9s = 0.9 (87 %): the disaster is postponed, not avoided. With s=0.5s = 0.5 variation actually increases (2.17): fewer fires, but each one larger. The mechanism is a slow variable: small fires keep consuming fuel and keep the system far from the threshold; once they are suppressed, the fast variable grows calmer while the slow one creeps towards the threshold. The conclusion depends on a model condition: small disturbances must actually consume the slow variable that pushes the system towards the threshold. Without such a slow variable, flattening small fluctuations need not be harmful.

The reserve model: with a reserve R=1.0R = 1.0, two stable states coexist only over a narrow range of pressures (2.624–2.676), and at high pressure the vegetation settles at 2.33; with the reserve cut to 0.5 the range widens to 2.308–2.632 and the collapsed state is 1.34; with no reserve the range is 1.788–2.604 and the collapsed state only 0.40. At c=2.3c = 2.3 the system with a reserve has only one stable state, with no “other valley” to fall into. An “efficiency gain” that makes the unreachable part grazeable widens the range of hysteresis and deepens the collapse; the price of the reserve is a slightly smaller harvest in ordinary years.

Note

Level of evidence. This book treats “flattening fluctuations and draining redundancy shrink the basin of attraction” on three levels: (1) a conclusion under stated model conditions (a slow variable consumed by small disturbances; a reserve that weakens the positive feedback); (2) Holling and colleagues’ generalisation from cases; (3) no general controlled test as yet. Scheffer and colleagues came to a consistent conclusion: the focus of management should be to sustain a large stability domain rather than to control fluctuations (Scheffer et al. 2001). Applying this to business inventories, cash reserves or supply-chain redundancy is an analogy, not evidence, and it is not business or investment advice.

Hypothesis · not established

Variance-based appraisal (not yet established). The author conjectures that when managers are appraised on “steadiness”, they cut seemingly idle reserves more readily. A testable prediction: in an experiment in which participants manage a simulated grazing system with a reserve RR, those paid for “low variability of yield” convert the reserve into grazeable vegetation sooner, and suffer more collapses, than those paid for “long-run total yield”. If a pre-registered experiment finds no difference between the groups, or fewer conversions in the first, the hypothesis is refuted.

Chapter summary

Engineering resilience (speed of return) and ecological resilience (capacity to absorb, width of the basin) answer different questions. As one system approaches a fold both shrink together; across different systems they can rank in opposite orders: in the model, the system that recovers faster and fluctuates less has the narrower basin and flips more often under rare large shocks, while the slowly recovering system suffers under frequent shocks. The fire model shows that suppressing small fires calms the year-to-year fluctuations while fuel creeps towards the threshold; the reserve model shows that removing an ungrazeable reserve widens the range of hysteresis and deepens the collapse. These are conclusions under model conditions and generalisations from cases, not general laws.

References

Holling, C. S. 1973. “Resilience and Stability of Ecological Systems.” Annual Review of Ecology and Systematics 4: 1–23. https://doi.org/10.1146/annurev.es.04.110173.000245.
Holling, C. S. 1996. “Engineering Resilience Versus Ecological Resilience.” In Engineering Within Ecological Constraints, edited by Peter C. Schulze. National Academy Press.
Holling, C. S., and Gary K. Meffe. 1996. “Command and Control and the Pathology of Natural Resource Management.” Conservation Biology 10 (2): 328–37. https://doi.org/10.1046/j.1523-1739.1996.10020328.x.
Menck, Peter J., Jobst Heitzig, Norbert Marwan, and Jürgen Kurths. 2013. “How Basin Stability Complements the Linear-Stability Paradigm.” Nature Physics 9 (2): 89–92. https://doi.org/10.1038/nphys2516.
Nes, Egbert H. van, and Marten Scheffer. 2007. “Slow Recovery from Perturbations as a Generic Indicator of a Nearby Catastrophic Shift.” The American Naturalist 169 (6): 738–47. https://doi.org/10.1086/516845.
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.
Pimm, Stuart L. 1984. “The Complexity and Stability of Ecosystems.” Nature 307 (5949): 321–26. https://doi.org/10.1038/307321a0.
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.
Walker, Brian, C. S. Holling, Stephen R. Carpenter, and Ann Kinzig. 2004. “Resilience, Adaptability and Transformability in Social–Ecological Systems.” Ecology and Society 9 (2): 5. https://doi.org/10.5751/ES-00650-090205.

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).