Chaos & Predictability Notation How to run

Chapter 9 · Error growth beyond the linear regime

Part III — Quantifying chaos and predictability Knob: $\delta_0$, the fit space, the useful-forecast threshold live notebook

Overview

Chapter 7 measured λ1\lambda_1 and turned it into a doubling time; chapter 8 turned it into an exchange rate of 3.8 days per decimal digit of initial precision. Both assume the error stays small enough for the tangent linear approximation to hold.

A real forecast error does not. It grows exponentially for a while and then stops, because a forecast cannot be more wrong than a randomly chosen state of the attractor. So the exponential picture describes the beginning of a forecast’s life, and the part that decides when to stop using it is the part the exponential picture does not describe.

Lorenz’s logistic model adds one term:

dEdt=λE(1EE)E(t)=E1+(E/E01)eλt.\frac{dE}{dt} = \lambda E\Bigl(1 - \frac{E}{E_\infty}\Bigr) \quad\Longrightarrow\quad E(t) = \frac{E_\infty}{1 + (E_\infty/E_0 - 1)e^{-\lambda t}}.

This chapter asks whether it works, and finds three separate traps — one in the statistics, one in the fitting, one in the model. All three are measured, and all three were found the hard way while writing the chapter.

The model

The measurements are twin experiments: perturb by δ0\delta_0, integrate both copies, and average the error over 1024 starting points on the Lorenz 63 attractor (256 for Lorenz 96), at five amplitudes four decades apart. chaoslib.errorgrowth supplies the model, the fit, and the saturation level.

Integrating the ensemble is knob-free and expensive; fitting a model to the resulting curve is microseconds. So the curves are precomputed and the notebook’s controls change the model, not the data — the reader is not allowed to move the measurement.

Prefer to run it yourself? Download as a Jupyter notebook — it installs its own dependencies in the first cell. The sliders are static in Jupyter; edit value= and re-run to change a parameter.

What the curve looks like

Five curves, each a hundred times smaller at t=0t = 0 than the one above, run parallel while the error is small — a factor in δ0\delta_0 is a shift in time, which is what exponential growth means — then bend over and converge. Within about ten time units they are indistinguishable: nothing about the initial error survives.

The logarithmic exchange rate does carry into the nonlinear regime. Each extra digit of initial accuracy buys close to ln10/λ1\ln 10/\lambda_1 of lead time even though most of the curve is not exponential, which is not obvious and is worth knowing — it is what lets chapter 20’s operational measurement agree with a calculation done in the infinitesimal limit.

One feature that looks like a bug and is not: the mean error curve is non-monotonic. It falls back for stretches on the approach to saturation, and that survives 1024 members, so it belongs to the attractor. In Lorenz 63 it is the two lobes — a pair of trajectories on opposite wings are far apart, and the distance shrinks again when they land on the same wing.

Three traps

Fitting in the wrong space. curve_fit minimises squared residuals in EE, and the curve spans ten orders of magnitude in EE — so the handful of points near saturation outweigh the entire exponential phase, and λ\lambda comes out of a fit that never looked at the phase that defines it. On the shipped Lorenz 63 curve, against an early-time rate of 0.921: log-space fitting returns λ=0.919\lambda = 0.919 and E0=3.6×106E_0 = 3.6\times10^{-6}; linear-space returns 0.748 and 5.3×1055.3\times10^{-5} — 19% out in the rate and fiftyfold in the amplitude, while producing a curve that looks entirely convincing on a linear plot. The log fit is also stable across seeds (0.920, 0.919, 0.921) where the linear one is not (0.716, 0.748, 0.722). fit_logistic_error_growth now fits in log space by default.

Mixing two saturation statistics. An ensemble-mean error curve must be compared against the mean pair distance, not the RMS one. By Jensen the mean is smaller, and how much smaller depends on the attractor: 0.889 for Lorenz 63, whose two lobes broaden the distribution of pair distances, against 0.995 for Lorenz 96, where distances concentrate in forty dimensions. Compare a mean curve against an RMS saturation and it appears to stop growing at 89% of saturation — which then shows up as a spurious 12-percentage-point error in the model’s shape. On the first pass through this chapter Lorenz 63 came out 19% from logistic; matching the statistics moved it to 2.7%, and the 12 points were mine. saturation_level now takes a statistic argument.

There is an exact identity worth checking any implementation against: for independent draws, xy2=2xxˉ2\langle\|x-y\|^2\rangle = 2\langle\|x-\bar x\|^2\rangle, so the RMS saturation is exactly 2\sqrt2 times the RMS spread about the mean — verified to 5×1045\times10^{-4}.

The model’s form. Rearranged, the model says dlnE/dt=λ(1E/E)d\ln E/dt = \lambda(1 - E/E_\infty): a straight line in EE with slope-to-intercept ratio exactly 1-1. That is a fitting-free test, and it gives 1.027-1.027 for Lorenz 63 — a 2.7% deviation, a good result for a one-parameter closure and why the model has lasted — but 1.167-1.167 for Lorenz 96, off by 17%. The reason is in chapter 11: Lorenz 96 has thirteen positive exponents spanning 0.03 to 1.67, so its error is a superposition of components growing at different rates and saturating at different times, and one λ\lambda cannot represent that. Chapter 12 makes the same point from the other end.

Note also that the fitted intercept is not λ1\lambda_1: 0.797 against 0.906 for Lorenz 63, and 1.236 against 1.67 for Lorenz 96. Fitted over the nonlinear range, the logistic λ\lambda that best describes it is smaller than the infinitesimal growth rate. They are different quantities, and which one a paper means is worth checking.

The doubling time is a function of amplitude

Since dlnE/dtd\ln E/dt falls as EE grows, the doubling time is a property of the system and the amplitude you measured it at. For Lorenz 63 it runs from ln2/λ1=0.766\ln2/\lambda_1 = 0.766 MTU at infinitesimal amplitude to roughly four times that by 70% of saturation.

The operational consequence runs in a direction worth care. A doubling time measured from real forecasts is measured from errors that are already large, so it is longer than ln2/λ1\ln2/\lambda_1, and extrapolating it backwards underestimates how fast small errors grow. Using λ1\lambda_1 to extrapolate forwards overestimates growth at large error and so underestimates the useful horizon. Both mistakes are available, they point opposite ways, and neither is detectable from a single number — which is why chapter 13 cannot simply quote a λ\lambda.

Exercises

Analytic. Show that the time for the logistic model to reach a fraction ff of saturation exceeds the pure-exponential estimate by λ1ln[1/(1f)]\lambda^{-1}\ln[1/(1-f)], and evaluate it at f=0.5f = 0.5 and f=0.9f = 0.9.

Computational. Fit the same curve in linear and log space and reproduce the two λ\lambda values. Then explain the difference from the fact that least squares on EE weights each point by EE.

Exploratory. Before looking, decide which of Lorenz 63 and Lorenz 96 should be worse described by a one-λ\lambda model, using their Lyapunov spectra from chapters 7 and 11. Then check against the slope-to-intercept test.

Further reading