Skip to content
The Lumenary
Advanced undergraduateUndergraduate 120 min

Dynamical systems and chaos

When an equation is too hard to solve, ask a better question — what happens in the long run? Fixed points, cycles and bifurcations answer it, until a one-line formula produces behaviour no computer can predict.

Formally verified · 12 LeanComputationally tested · 2 PythonAI-drafted · awaiting human reviewMathematically reviewed: Awaiting human review
MotivationH

The long run

In 1961 the meteorologist Edward Lorenz restarted a weather simulation halfway through, typing in a value printed to three decimal places, 0.5060.506, instead of the 0.5061270.506127 stored in the machine. He went for a coffee. When he came back, the new forecast had drifted completely away from the old one. The equations were deterministic and the change was one part in ten thousand. Lorenz had found sensitive dependence on initial conditions, and with it the reason why weather cannot be forecast more than a couple of weeks ahead, however good our computers become.

Fifteen years later the ecologist Robert May studied the simplest model of an insect population with limited food: next year's population is xn+1=rxn(1−xn)x_{n+1} = r x_n(1 - x_n). For small growth rates rr the population settles to a steady value. Raise rr past 33 and it alternates between two values, then four, then eight. Past r≈3.57r \approx 3.57 it behaves erratically, never repeating — from a quadratic formula that a child could iterate on a calculator.

Most differential equations cannot be solved by a formula. Henri Poincaré, studying the motion of three bodies under gravity in the 1880s, changed the question from "what is the solution?" to "what does it do in the long run?": does it settle down, repeat, or wander? That qualitative theory is the subject of this lesson. It covers fixed points and their stability, cycles and the theorem of Poincaré and Bendixson that finds them, bifurcations where the behaviour changes, and finally chaos, with an honest account of what computers can and cannot tell us about it.

IntuitionH

Valleys, spirals, stretching and folding

A dynamical system is a rule for how a state changes. It may change in discrete steps, xn+1=f(xn)x_{n+1} = f(x_n) (a map), or continuously, x˙=F(x)\dot x = F(x) (a flow). The states form the phase space, and the history of one state is its orbit. A pendulum's state is its angle and angular velocity, a point in a plane. Its orbits are closed curves (swinging), wavy lines (spinning over the top), and the two equilibria (hanging down, balanced upright).

Fixed points are states that never change. Some are stable, like a ball at the bottom of a valley: nudge it and it returns. Others are unstable, like a ball on a hilltop. For a map of the line the test is the derivative. Near a fixed point x∗x^*, f(x)−x∗≈f′(x∗)(x−x∗)f(x) - x^* \approx f'(x^*)(x - x^*), so distances to x∗x^* are multiplied by about ∣f′(x∗)∣|f'(x^*)| at each step. They shrink if ∣f′(x∗)∣<1|f'(x^*)| < 1 and grow if ∣f′(x∗)∣>1|f'(x^*)| > 1.

Cycles are orbits that repeat. In the plane, a flow can wind towards a closed loop — a limit cycle — like the steady beating of a heart or the squeal of a violin string. In the plane that is about the most complicated thing a bounded orbit can do, because orbits cannot cross.

Chaos needs room. Its mechanism is stretching and folding. The logistic map at r=4r = 4 stretches [0,12][0, \frac12] onto [0,1][0, 1] and folds [12,1][\frac12, 1] back onto [0,1][0, 1], like a baker kneading dough. Two nearby points are pulled apart at every step until they end up on opposite sides of a fold, after which their futures are unrelated.

x₀y = x
Cobweb diagram for a map $f$: from $x_0$ go vertically to the graph, horizontally to the diagonal $y = x$, and repeat. Fixed points are where the graph meets the diagonal. Here the slope at the fixed point is between $-1$ and $0$, and the orbit spirals inwards.
DefinitionsH

Definitions

Definition— map, flow, orbit

A (discrete) dynamical system is a map f:X→Xf : X \to X on a metric space XX. The orbit of xx is x,f(x),f2(x),…x, f(x), f^2(x), \dots, where fnf^n is the nn-fold composite. A flow on Rd\R^d is given by an autonomous ODE x˙=F(x)\dot x = F(x) with FF of class C1C^1. By the Picard–Lindelöf theorem through each point passes a unique solution t↦ϕt(x)t \mapsto \phi_t(x), and ϕs+t=ϕs∘ϕt\phi_{s+t} = \phi_s \circ \phi_t wherever defined.

Definition— fixed and periodic points, stability

x∗x^* is a fixed point of ff if f(x∗)=x∗f(x^*) = x^*, and an equilibrium of a flow if F(x∗)=0F(x^*) = 0. xx is periodic with period nn if fn(x)=xf^n(x) = x; its minimal period is the least such n≥1n \ge 1. A fixed point is attracting if every orbit starting close enough converges to it. It is Lyapunov stable if orbits starting close enough stay close for all future time, and asymptotically stable if it is both. It is repelling if some neighbourhood is left eventually by every orbit starting in it, except x∗x^* itself.

Definition— hyperbolic fixed point

A fixed point x∗x^* of a C1C^1 map is hyperbolic if no eigenvalue of Df(x∗)Df(x^*) has absolute value 11. An equilibrium of a flow is hyperbolic if no eigenvalue of DF(x∗)DF(x^*) has real part 00. For a periodic orbit of period nn of a map of R\R, its multiplier is (fn)′(x)=f′(x)f′(f(x))⋯f′(fn−1(x))(f^n)'(x) = f'(x)f'(f(x))\cdots f'(f^{n-1}(x)), by the chain rule.

Definition— limit cycle, ω-limit set

A periodic orbit of a flow is a non-constant solution with ϕT(x)=x\phi_T(x) = x for some T>0T > 0. A limit cycle is a periodic orbit that is isolated: some neighbourhood contains no other periodic orbit. The ω-limit set ω(x)\omega(x) is the set of points yy with ϕtk(x)→y\phi_{t_k}(x) \to y for some sequence tk→∞t_k \to \infty — where the orbit ends up.

Definition— conjugacy, bifurcation

Maps f:X→Xf : X \to X and g:Y→Yg : Y \to Y are topologically conjugate if there is a homeomorphism h:X→Yh : X \to Y with h∘f=g∘hh \circ f = g \circ h. Then hh carries orbits to orbits, so the two systems are "the same up to a change of coordinates". If hh is only a continuous surjection, gg is a factor of ff (a semi-conjugacy). A bifurcation is a qualitative change — in the number or stability of fixed points or cycles, say — in a family fμf_\mu as the parameter μ\mu varies.

Definition— sensitive dependence and chaos

f:X→Xf : X \to X has sensitive dependence on initial conditions if there is δ>0\delta > 0 such that for every xx and every ε>0\varepsilon > 0 there are yy with d(x,y)<εd(x, y) < \varepsilon and n≥0n \ge 0 with d(fn(x),fn(y))≥δd(f^n(x), f^n(y)) \ge \delta. Following Devaney (1986), ff is chaotic on XX if it has sensitive dependence, its periodic points are dense, and it is topologically transitive: for all non-empty open U,VU, V there is nn with fn(U)∩V≠∅f^n(U) \cap V \ne \varnothing.

The Lyapunov exponent of an orbit of a C1C^1 map of R\R is λ(x)=lim⁡n→∞1n∑k=0n−1ln⁡∣f′(fk(x))∣\lambda(x) = \lim_{n\to\infty}\frac1n\sum_{k=0}^{n-1}\ln|f'(f^k(x))|, when the limit exists. It is the average exponential rate at which nearby orbits separate. Positive exponents are the usual numerical signature of chaos.

Worked examplesH

Examples

Example— Linear maps of the line

For f(x)=axf(x) = ax, fn(x)=anxf^n(x) = a^nx. The fixed point 00 attracts if ∣a∣<1|a| < 1 and repels if ∣a∣>1|a| > 1. If a<0a < 0 the orbit alternates sides. For ∣a∣=1|a| = 1 nothing moves closer or further: a=−1a = -1 makes every non-zero point periodic of period 22.

Example— The doubling map and the circle

D(x)=2x mod 1D(x) = 2x \bmod 1 on [0,1)[0, 1), which we think of as the circle R/Z\R/\Z. In binary, DD deletes the first digit: D(0.b1b2b3…)=0.b2b3…D(0.b_1b_2b_3\ldots) = 0.b_2b_3\ldots. So xx is periodic exactly when its binary expansion repeats, and the orbit of a point whose binary digits are "random" visits every interval. Points that agree in their first nn digits are within 2−n2^{-n}, but after nn steps their orbits have nothing in common.

Example— An irrational rotation: dense orbits without chaos

Rα(x)=x+α mod 1R_\alpha(x) = x + \alpha \bmod 1 with α\alpha irrational. Every orbit is dense in the circle (Kronecker), so RαR_\alpha is transitive. But RαR_\alpha is an isometry, so nearby points stay exactly as close as they were: no sensitive dependence, and no periodic points at all. Transitivity alone is not chaos.

Example— The pendulum

θ¨=−sin⁡θ\ddot\theta = -\sin\theta, or θ˙=v\dot\theta = v, v˙=−sin⁡θ\dot v = -\sin\theta. The energy E=12v2−cos⁡θE = \frac12v^2 - \cos\theta is constant along orbits (E˙=vv˙+sin⁡θ θ˙=0\dot E = v\dot v + \sin\theta\,\dot\theta = 0), so orbits lie on its level curves. The equilibrium (0,0)(0, 0) is surrounded by closed orbits (a centre), while (π,0)(\pi, 0) is a saddle. The orbits through the saddle, the separatrices, divide swinging from spinning.

ProofH

Fixed points of maps and the logistic family

Theorem— Theorem 1 (derivative test)

Let f:R→Rf : \R \to \R be C1C^1 with f(x∗)=x∗f(x^*) = x^*. If ∣f′(x∗)∣<1|f'(x^*)| < 1, then x∗x^* is attracting. If ∣f′(x∗)∣>1|f'(x^*)| > 1, then x∗x^* is repelling.

Proof

Suppose ∣f′(x∗)∣<1|f'(x^*)| < 1 and pick KK with ∣f′(x∗)∣<K<1|f'(x^*)| < K < 1. By continuity of f′f' there is δ>0\delta > 0 with ∣f′∣≤K|f'| \le K on I=[x∗−δ,x∗+δ]I = [x^* - \delta, x^* + \delta]. For x∈Ix \in I the mean value theorem gives ∣f(x)−x∗∣=∣f(x)−f(x∗)∣=∣f′(ξ)∣∣x−x∗∣≤K∣x−x∗∣|f(x) - x^*| = |f(x) - f(x^*)| = |f'(\xi)||x - x^*| \le K|x - x^*|. In particular f(x)∈If(x) \in I, so by induction fn(x)∈If^n(x) \in I and ∣fn(x)−x∗∣≤Kn∣x−x∗∣→0|f^n(x) - x^*| \le K^n|x - x^*| \to 0.

If ∣f′(x∗)∣>1|f'(x^*)| > 1, choose K>1K > 1 and δ\delta with ∣f′∣≥K|f'| \ge K on II. As long as fn(x)f^n(x) stays in II, ∣fn+1(x)−x∗∣≥K∣fn(x)−x∗∣|f^{n+1}(x) - x^*| \ge K|f^n(x) - x^*|. Since Kn∣x−x∗∣→∞K^n|x - x^*| \to \infty for x≠x∗x \ne x^*, every orbit except x∗x^* leaves II.

∎

When ∣f′(x∗)∣=1|f'(x^*)| = 1 the test says nothing: x↦x−x3x \mapsto x - x^3 attracts to 00, x↦x+x3x \mapsto x + x^3 repels, and both have f′(0)=1f'(0) = 1. The same proof works for periodic orbits, using the multiplier (fn)′(f^n)'.

Theorem— Theorem 2 (the logistic map up to the first period doubling)

Let fr(x)=rx(1−x)f_r(x) = rx(1 - x) with r>0r > 0.

(a) The fixed points are 00 and xr∗=1−1rx_r^* = 1 - \frac1r, with fr′(0)=rf_r'(0) = r and fr′(xr∗)=2−rf_r'(x_r^*) = 2 - r. So 00 attracts for r<1r < 1, and xr∗x_r^* attracts for 1<r<31 < r < 3 and repels for r>3r > 3.

(b) For r>3r > 3 there is an orbit of minimal period 22, {p+,p−}\{p_+, p_-\} with p±=r+1±(r−3)(r+1)2rp_\pm = \frac{r + 1 \pm \sqrt{(r - 3)(r + 1)}}{2r}. Its multiplier is fr′(p+)fr′(p−)=4+2r−r2f_r'(p_+)f_r'(p_-) = 4 + 2r - r^2, so it is attracting for 3<r<1+6≈3.4493 < r < 1 + \sqrt6 \approx 3.449.

Proof

(a) rx(1−x)=xrx(1 - x) = x iff x(r−1−rx)=0x(r - 1 - rx) = 0. The derivative is fr′(x)=r(1−2x)f_r'(x) = r(1 - 2x), which at xr∗x^*_r equals r(2r−1)=2−rr\big(\frac2r - 1\big) = 2 - r. Now ∣2−r∣<1|2 - r| < 1 iff 1<r<31 < r < 3, and Theorem 1 applies.

(b) Period-2 points satisfy fr(fr(x))=xf_r(f_r(x)) = x, a quartic divisible by the fixed-point quadratic x(rx−r+1)x(rx - r + 1). The quotient is r2x2−r(r+1)x+(r+1)=0r^2x^2 - r(r+1)x + (r + 1) = 0, with roots p±p_\pm, real and distinct exactly when (r−3)(r+1)>0(r - 3)(r + 1) > 0, that is r>3r > 3. With s=(r−3)(r+1)s = \sqrt{(r-3)(r+1)} one checks directly that fr(p+)=p−f_r(p_+) = p_- and fr(p−)=p+f_r(p_-) = p_+ (Lean verifies the algebra below). Since p+≠p−p_+ \ne p_-, the minimal period is 22. For the multiplier, p++p−=r+1rp_+ + p_- = \frac{r + 1}{r} and p+p−=r+1r2p_+p_- = \frac{r + 1}{r^2}, so

r2(1−2p+)(1−2p−)=r2(1−2(p++p−)+4p+p−)=r2−2r(r+1)+4(r+1)=4+2r−r2.r^2(1 - 2p_+)(1 - 2p_-) = r^2\big(1 - 2(p_+ + p_-) + 4p_+p_-\big) = r^2 - 2r(r + 1) + 4(r + 1) = 4 + 2r - r^2.

This is less than 11 iff r2−2r−3>0r^2 - 2r - 3 > 0, i.e. r>3r > 3, and greater than −1-1 iff r2−2r−5<0r^2 - 2r - 5 < 0, i.e. r<1+6r < 1 + \sqrt6.

∎

At r=3r = 3 the multiplier of xr∗x^*_r passes through −1-1. The fixed point loses stability and hands it to a newly born 2-cycle: a period-doubling bifurcation. At r=1+6r = 1 + \sqrt6 the 2-cycle's multiplier reaches −1-1 and a stable 4-cycle is born, and so on. The doubling parameters r1=3r_1 = 3, r2≈3.4495r_2 \approx 3.4495, r3≈3.5441r_3 \approx 3.5441, r4≈3.5644,…r_4 \approx 3.5644, \dots accumulate at r∞≈3.5699r_\infty \approx 3.5699. Mitchell Feigenbaum discovered numerically in 1975 that the gaps shrink geometrically,

rn−rn−1rn+1−rn→δ=4.6692016…,\frac{r_{n} - r_{n-1}}{r_{n+1} - r_n} \to \delta = 4.6692016\ldots,

and that the same δ\delta appears for every smooth unimodal family with a quadratic maximum, such as x↦rsin⁡(πx)x \mapsto r\sin(\pi x). This universality was explained by renormalisation: Feigenbaum (1978) and, independently, Coullet and Tresser. It was proved by Oscar Lanford with a computer-assisted argument in 1982, and Mikhail Lyubich (1999) gave a conceptual proof of the renormalisation conjectures. The experiment below estimates δ\delta. That estimate is evidence, not a proof.

Beyond r∞r_\infty there are windows of periodic behaviour, the largest beginning at r=1+8≈3.8284r = 1 + \sqrt8 \approx 3.8284 with an attracting 3-cycle. Sharkovskii's theorem (1964) orders the positive integers as

3⊳5⊳7⊳⋯⊳2⋅3⊳2⋅5⊳⋯⊳22⋅3⊳⋯⊳23⊳22⊳2⊳1,3 \rhd 5 \rhd 7 \rhd \cdots \rhd 2\cdot3 \rhd 2\cdot5 \rhd \cdots \rhd 2^2\cdot3 \rhd \cdots \rhd 2^3 \rhd 2^2 \rhd 2 \rhd 1,

and states that a continuous map of an interval with a periodic point of period mm has periodic points of every period nn with m⊳nm \rhd n. In particular period three implies all periods (Li and Yorke, 1975, who also coined the word "chaos" in this sense).

ProofH

Planar flows: linearisation and Lyapunov functions

For a linear system x˙=Ax\dot x = Ax with AA a real 2×22\times2 matrix, the solution is x(t)=etAx(0)x(t) = e^{tA}x(0). Its behaviour depends on the eigenvalues, which are determined by τ=tr⁡A\tau = \operatorname{tr}A and Δ=det⁡A\Delta = \det A: they are λ1,2=τ±τ2−4Δ2\lambda_{1,2} = \frac{\tau \pm \sqrt{\tau^2 - 4\Delta}}{2}.

Theorem— Theorem 3 (classification of planar linear systems)

Let Δ≠0\Delta \ne 0, so that 00 is the only equilibrium.

  • Δ<0\Delta < 0: a saddle (real eigenvalues of opposite signs; unstable).
  • Δ>0\Delta > 0, τ2≥4Δ\tau^2 \ge 4\Delta: a node (real eigenvalues of the same sign), stable if τ<0\tau < 0 and unstable if τ>0\tau > 0.
  • Δ>0\Delta > 0, τ2<4Δ\tau^2 < 4\Delta, τ≠0\tau \ne 0: a spiral (complex eigenvalues α±iβ\alpha \pm i\beta, α=τ/2\alpha = \tau/2), stable if τ<0\tau < 0 and unstable if τ>0\tau > 0.
  • Δ>0\Delta > 0, τ=0\tau = 0: a centre (eigenvalues ±iβ\pm i\beta): every other orbit is a closed ellipse.

In particular 00 is asymptotically stable if and only if τ<0<Δ\tau < 0 < \Delta.

Proof

Since λ1λ2=Δ\lambda_1\lambda_2 = \Delta and λ1+λ2=τ\lambda_1 + \lambda_2 = \tau, the sign cases follow from the formula for the eigenvalues. For real distinct eigenvalues, in an eigenbasis the system decouples as y˙i=λiyi\dot y_i = \lambda_iy_i, so yi(t)=eλityi(0)y_i(t) = e^{\lambda_it}y_i(0). Both decay if both λi<0\lambda_i < 0, both grow if both are positive, and one grows while the other decays if they have opposite signs (the saddle). For a repeated eigenvalue λ\lambda that is not diagonalisable, the Jordan form gives y1=eλt(y1(0)+ty2(0))y_1 = e^{\lambda t}(y_1(0) + ty_2(0)), y2=eλty2(0)y_2 = e^{\lambda t}y_2(0), which still decays exactly when λ<0\lambda < 0. For complex eigenvalues α±iβ\alpha \pm i\beta, there is a real basis in which A=(α−ββα)A = \begin{pmatrix}\alpha & -\beta\\ \beta & \alpha\end{pmatrix}. In polar coordinates this is r˙=αr\dot r = \alpha r, θ˙=β\dot\theta = \beta, so r=eαtr(0)r = e^{\alpha t}r(0): inward spirals for α<0\alpha < 0, outward for α>0\alpha > 0, and circles for α=0\alpha = 0 (ellipses in the original coordinates).

∎

For a nonlinear system x˙=F(x)\dot x = F(x) with F(x∗)=0F(x^*) = 0, the linearisation y˙=DF(x∗)y\dot y = DF(x^*)y describes the motion near x∗x^* — when x∗x^* is hyperbolic.

Theorem— Theorem 4 (Hartman–Grobman; stated, not proved here)

If x∗x^* is a hyperbolic equilibrium of a C1C^1 flow, there is a homeomorphism between neighbourhoods of x∗x^* and of 00 that carries orbits of the flow to orbits of its linearisation, preserving the direction of time. In particular, if all eigenvalues of DF(x∗)DF(x^*) have negative real part, x∗x^* is asymptotically stable.

(Proofs: Hartman 1960 and Grobman 1959; see Perko, Differential Equations and Dynamical Systems, §2.8.) Hyperbolicity cannot be dropped. The systems

x˙=−y∓x(x2+y2),y˙=x∓y(x2+y2)\dot x = -y \mp x(x^2 + y^2), \qquad \dot y = x \mp y(x^2 + y^2)

both have the centre x˙=−y\dot x = -y, y˙=x\dot y = x as linearisation. In polar coordinates they are r˙=∓r3\dot r = \mp r^3, θ˙=1\dot\theta = 1. With the upper sign the origin is an asymptotically stable spiral, and with the lower sign an unstable one. A linear centre decides nothing.

Theorem— Theorem 5 (Lyapunov's direct method)

Let x∗x^* be an equilibrium of x˙=F(x)\dot x = F(x) and VV a C1C^1 function on a neighbourhood UU of x∗x^* with V(x∗)=0V(x^*) = 0 and V>0V > 0 on U∖{x∗}U \setminus \{x^*\}. If V˙=∇V⋅F≤0\dot V = \nabla V \cdot F \le 0 on UU, then x∗x^* is Lyapunov stable. If V˙<0\dot V < 0 on U∖{x∗}U \setminus \{x^*\}, then x∗x^* is asymptotically stable.

Proof

Take ε>0\varepsilon > 0 with the closed ball B‾(x∗,ε)⊆U\overline{B}(x^*, \varepsilon) \subseteq U, and let m=min⁡Vm = \min V on the sphere ∣x−x∗∣=ε|x - x^*| = \varepsilon, so m>0m > 0. By continuity there is δ∈(0,ε)\delta \in (0, \varepsilon) with V<mV < m on B(x∗,δ)B(x^*, \delta). Since VV does not increase along orbits, an orbit starting in B(x∗,δ)B(x^*, \delta) keeps V<mV < m and so never reaches the sphere: it stays in B(x∗,ε)B(x^*, \varepsilon). That is stability.

Now suppose V˙<0\dot V < 0 away from x∗x^*. Along such an orbit, V(ϕt(x))V(\phi_t(x)) decreases to a limit c≥0c \ge 0. If c>0c > 0, the orbit stays in the compact set {c≤V, ∣x−x∗∣≤ε}\{c \le V,\ |x - x^*| \le \varepsilon\}, on which V˙≤−η<0\dot V \le -\eta < 0 for some η\eta. Then V→−∞V \to -\infty, which is absurd. So V(ϕt(x))→0V(\phi_t(x)) \to 0, which forces ϕt(x)→x∗\phi_t(x) \to x^* (if not, the orbit would return infinitely often to a compact set avoiding x∗x^*, on which VV is bounded below by a positive constant).

∎

For the spiral sink x˙=−x+y\dot x = -x + y, y˙=−x−y\dot y = -x - y, the function V=x2+y2V = x^2 + y^2 gives V˙=2x(−x+y)+2y(−x−y)=−2V\dot V = 2x(-x + y) + 2y(-x - y) = -2V, so VV decays like e−2te^{-2t} (formalised below). For the systems above with the upper sign, V=x2+y2V = x^2 + y^2 gives V˙=−2(x2+y2)2<0\dot V = -2(x^2 + y^2)^2 < 0, which proves the asymptotic stability that linearisation could not see.

ProofH

Limit cycles and the Poincaré–Bendixson theorem

The simplest limit cycle is visible in polar coordinates: r˙=r(1−r2)\dot r = r(1 - r^2), θ˙=1\dot\theta = 1. For 0<r<10 < r < 1, rr increases, and for r>1r > 1 it decreases, so every orbit except the origin spirals onto the unit circle. Usually no such coordinates exist, and the existence of a cycle needs a theorem.

Theorem— Theorem 6 (Poincaré–Bendixson; stated with a proof sketch)

Let x˙=F(x)\dot x = F(x) be a C1C^1 flow on an open set of R2\R^2, and suppose the forward orbit of xx stays in a compact set KK that contains no equilibrium. Then ω(x)\omega(x) is a periodic orbit. Either the orbit of xx is periodic, or it spirals towards a periodic orbit.

Proof sketch. ω(x)\omega(x) is non-empty, compact, connected and invariant. Take y∈ω(x)y \in \omega(x) and z∈ω(y)⊆ω(x)z \in \omega(y) \subseteq \omega(x). Since F(z)≠0F(z) \ne 0, there is a short segment Σ\Sigma through zz transverse to the flow. The key lemma: the successive crossings of Σ\Sigma by any orbit are monotone along Σ\Sigma. A piece of orbit between two crossings, closed up by a piece of Σ\Sigma, is a simple closed curve. By the Jordan curve theorem it separates the plane, and the flow crosses Σ\Sigma in one direction only, so the orbit cannot come back on the other side. Hence an ω-limit set meets Σ\Sigma in at most one point. This forces the orbit of yy to return to the same point of Σ\Sigma, so it is periodic, and then ω(x)\omega(x) is that periodic orbit. Full proofs: Hirsch, Smale and Devaney (2013), chapter 10, or Perko (2001), §3.7. □\square

Example— A trapping annulus

Consider r˙=r(1−r2)+μrcos⁡θ\dot r = r(1 - r^2) + \mu r\cos\theta, θ˙=1\dot\theta = 1, with 0<μ<10 < \mu < 1 (Strogatz's example). Since θ˙=1\dot\theta = 1 there are no equilibria except possibly the origin. On the circle r=rmin⁡<1−μr = r_{\min} < \sqrt{1 - \mu} we have r˙≥r(1−r2−μ)>0\dot r \ge r(1 - r^2 - \mu) > 0, and on r=rmax⁡>1+μr = r_{\max} > \sqrt{1 + \mu} we have r˙≤r(1−r2+μ)<0\dot r \le r(1 - r^2 + \mu) < 0. So the annulus rmin⁡≤r≤rmax⁡r_{\min} \le r \le r_{\max} is trapping: orbits enter it and never leave. It is compact and contains no equilibrium, so by Poincaré–Bendixson it contains a periodic orbit — although we cannot write it down.

Theorem— Corollary 7 (no chaos in the plane)

A bounded orbit of a planar C1C^1 flow with finitely many equilibria converges to an equilibrium, to a periodic orbit, or to a cycle of equilibria joined by orbits. In particular planar flows have no strange attractors and no sensitive dependence of the kind seen in the doubling map.

(The generalised Poincaré–Bendixson theorem gives exactly this trichotomy; see Perko, §3.7.) Chaos for flows needs at least three dimensions. Lorenz's system x˙=σ(y−x)\dot x = \sigma(y - x), y˙=x(ρ−z)−y\dot y = x(\rho - z) - y, z˙=xy−βz\dot z = xy - \beta z with σ=10\sigma = 10, ρ=28\rho = 28, β=8/3\beta = 8/3 has a famous butterfly-shaped attractor. Only in 2002 did Warwick Tucker prove, with rigorous computer-assisted interval arithmetic, that it really is a strange attractor (a problem on Smale's 1998 list). For maps, one dimension is enough: the logistic map shows it.

Bifurcations of flows. On the line, the normal forms are the saddle-node x˙=μ+x2\dot x = \mu + x^2 (two equilibria collide and vanish as μ\mu increases through 00), the transcritical x˙=μx−x2\dot x = \mu x - x^2 (two equilibria exchange stability) and the pitchfork x˙=μx−x3\dot x = \mu x - x^3 (one equilibrium splits into three). In the plane, in a Hopf bifurcation a pair of complex eigenvalues crosses the imaginary axis and a small limit cycle is born — for instance r˙=μr−r3\dot r = \mu r - r^3, θ˙=1\dot\theta = 1, which has the cycle r=μr = \sqrt\mu for μ>0\mu > 0. A precise statement, with its non-degeneracy conditions, is in Strogatz (2015), chapter 8.

ProofH

Chaos, proved

Theorem— Theorem 8 (the doubling map is chaotic)

D(x)=2x mod 1D(x) = 2x \bmod 1 on the circle R/Z\R/\Z (with distance d(x,y)=d(x, y) = the shorter arc) has sensitive dependence with δ=14\delta = \frac14, dense periodic points, and is topologically transitive.

Proof

Expansion. If d(x,y)<14d(x, y) < \frac14, then d(D(x),D(y))=2d(x,y)d(D(x), D(y)) = 2d(x, y).

Sensitive dependence. Let xx and ε>0\varepsilon > 0 be given, and let y≠xy \ne x with d(x,y)<min⁡(ε,14)d(x, y) < \min(\varepsilon, \frac14). While the distance is below 14\frac14, it doubles at each step. So there is a first nn with d(Dn(x),Dn(y))≥14d(D^n(x), D^n(y)) \ge \frac14.

Dense periodic points. Dn(x)=2nx mod 1D^n(x) = 2^nx \bmod 1, so Dn(x)=xD^n(x) = x iff (2n−1)x∈Z(2^n - 1)x \in \Z. The periodic points of period nn are the 2n−12^n - 1 points k2n−1\frac{k}{2^n - 1}, spaced 12n−1\frac{1}{2^n - 1} apart. Every interval contains one for large nn.

Transitivity. An open set UU contains an arc J=[k2n,k+12n]J = \big[\frac{k}{2^n}, \frac{k+1}{2^n}\big] for large nn, and DnD^n maps JJ onto the whole circle. So Dn(U)D^n(U) meets every VV.

∎

Theorem— Theorem 9 (the logistic map at r = 4 is a factor of the doubling map)

Let h(θ)=sin⁡2(πθ)h(\theta) = \sin^2(\pi\theta), a continuous surjection from the circle R/Z\R/\Z onto [0,1][0, 1]. Then f4∘h=h∘Df_4 \circ h = h \circ D. Consequently f4f_4 has dense periodic points and is topologically transitive on [0,1][0, 1], hence chaotic in Devaney's sense, and it has periodic points of every period.

Proof

f4(h(θ))=4sin⁡2(πθ)cos⁡2(πθ)=sin⁡2(2πθ)=h(D(θ))f_4(h(\theta)) = 4\sin^2(\pi\theta)\cos^2(\pi\theta) = \sin^2(2\pi\theta) = h(D(\theta)). (The identity is well defined on the circle because sin⁡2\sin^2 has period π\pi.) If Dn(θ)=θD^n(\theta) = \theta, then f4n(h(θ))=h(Dn(θ))=h(θ)f_4^n(h(\theta)) = h(D^n(\theta)) = h(\theta). So hh maps the dense set of periodic points of DD to a set of periodic points of f4f_4, which is dense because hh is a continuous surjection. For transitivity, given open U,V⊆[0,1]U, V \subseteq [0, 1], the sets h−1(U)h^{-1}(U) and h−1(V)h^{-1}(V) are open and non-empty, so Dn(h−1U)D^n(h^{-1}U) meets h−1Vh^{-1}V for some nn, and applying hh shows that f4n(U)f_4^n(U) meets VV. Sensitive dependence then follows from transitivity and dense periodic points on an infinite metric space (Banks, Brooks, Cairns, Davis and Stacey, 1992).

∎

So the logistic map at r=4r = 4 is chaotic: not "according to the computer", but by a proof. The conjugacy also gives exact formulas. The orbit of x0=sin⁡2(πθ0)x_0 = \sin^2(\pi\theta_0) is xn=sin⁡2(2nπθ0)x_n = \sin^2(2^n\pi\theta_0), and the Lyapunov exponent of almost every orbit is exactly ln⁡2\ln 2. For most rr in (r∞,4)(r_\infty, 4), by contrast, what happens is subtle. The parameters with an attracting cycle are dense (Graczyk–Świątek and Lyubich, 1997), yet the parameters with an absolutely continuous invariant measure — "stochastic" behaviour — have positive measure (Jakobson, 1981).

Formal mathematicsF

Dynamics in Lean and Mathlib

Mathlib's Dynamics library provides the vocabulary: iterates f^[n], Function.IsFixedPt, Function.IsPeriodicPt and Function.minimalPeriod, flows, ω-limit sets, and the Banach fixed point theorem. The lesson's concrete theorems about the logistic map are proved here by algebra and calculus.

logisticLean 4Formally verified
/-- The **logistic map** `f_r(x) = r x (1 - x)`, a model of a population with limited resources
(`x` is the population as a fraction of its maximum, `r` the growth rate). -/
def logistic (r x : ℝ) : ℝ := r * x * (1 - x)
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
logistic_fixed_pointsLean 4Proved here from basic factsFormally verified
/-- **Fixed points of the logistic map.** For `r ≠ 0`, `f_r(x) = x` exactly when `x = 0` or
`x = 1 - 1/r`: the equation `r x (1 - x) = x` factors as `x (r - 1 - r x) = 0`. -/
theorem logistic_fixed_points {r : ℝ} (hr : r ≠ 0) (x : ℝ) :
    logistic r x = x ↔ x = 0 ∨ x = 1 - 1 / r := by
  unfold logistic
  constructor
  · intro h
    have h' : x * (r - 1 - r * x) = 0 := by linear_combination h
    rcases mul_eq_zero.mp h' with h0 | h1
    · exact Or.inl h0
    · right; field_simp; linarith
  · rintro (rfl | rfl)
    · ring
    · field_simp; ring
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
logistic_deriv_at_fixedLean 4Proved here from basic factsFormally verified
/-- **The multiplier of the non-zero fixed point.** `f_r'(x) = r (1 - 2x)`, which at
`x* = 1 - 1/r` equals `r (1 - 2 + 2/r) = 2 - r`. -/
theorem logistic_deriv_at_fixed {r : ℝ} (hr : r ≠ 0) :
    HasDerivAt (logistic r) (2 - r) (1 - 1 / r) := by
  have h : HasDerivAt (fun x => r * x * (1 - x))
      (r * 1 * (1 - (1 - 1 / r)) + r * (1 - 1 / r) * (0 - 1)) (1 - 1 / r) :=
    (((hasDerivAt_id' _).const_mul r).mul ((hasDerivAt_const _ (1 : ℝ)).sub (hasDerivAt_id' _)))
  refine h.congr_deriv ?_
  field_simp
  ring
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
logistic_stable_iffLean 4Proved here from basic factsFormally verified
/-- **When is `1 - 1/r` attracting?** Its multiplier `2 - r` satisfies `|2 - r| < 1` exactly when
`1 < r < 3`. (At `r = 3` the multiplier passes through `-1`: a period-doubling bifurcation.) -/
theorem logistic_stable_iff (r : ℝ) : |2 - r| < 1 ↔ 1 < r ∧ r < 3 := by
  rw [abs_lt]
  constructor
  · rintro ⟨h1, h2⟩; constructor <;> linarith
  · rintro ⟨h1, h2⟩; constructor <;> linarith
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor

The period-2 orbit of Theorem 2(b), its minimal period in Mathlib's language, and its multiplier:

period_two_orbitLean 4Proved here from basic factsFormally verified
/-- **The period-2 orbit of the logistic map.** For `r > 3`, put `s = √((r - 3)(r + 1)) > 0` and
`p± = (r + 1 ± s)/(2r)`. Then `f_r(p₊) = p₋` and `f_r(p₋) = p₊`, and `p₊ ≠ p₋`: the two points
form an orbit of period exactly 2. Both identities reduce, after clearing denominators, to
`s² = (r - 3)(r + 1)`. -/
theorem period_two_orbit {r : ℝ} (hr : 3 < r) :
    let s := Real.sqrt ((r - 3) * (r + 1))
    logistic r ((r + 1 + s) / (2 * r)) = (r + 1 - s) / (2 * r) ∧
      logistic r ((r + 1 - s) / (2 * r)) = (r + 1 + s) / (2 * r) ∧
      (r + 1 + s) / (2 * r) ≠ (r + 1 - s) / (2 * r) := by
  intro s
  have hr0 : r ≠ 0 := by linarith
  have hpos : 0 < (r - 3) * (r + 1) := by nlinarith
  have hs : s ^ 2 = (r - 3) * (r + 1) := Real.sq_sqrt hpos.le
  have hs0 : 0 < s := Real.sqrt_pos.mpr hpos
  unfold logistic
  refine ⟨?_, ?_, ?_⟩
  · field_simp
    linear_combination (-1) * hs
  · field_simp
    linear_combination (-1) * hs
  · intro h
    field_simp at h
    linarith
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
period_two_minimalLean 4Proved here from basic factsFormally verified
/-- In Mathlib's language: for `r > 3`, `p₊` is a periodic point of `f_r` with period `2` that is
not fixed, so its **minimal period** is `2` (`Function.minimalPeriod_eq_prime`, as `2` is
prime). -/
theorem period_two_minimal {r : ℝ} (hr : 3 < r) :
    minimalPeriod (logistic r) ((r + 1 + Real.sqrt ((r - 3) * (r + 1))) / (2 * r)) = 2 := by
  obtain ⟨h1, h2, hne⟩ := period_two_orbit hr
  have : Fact (Nat.Prime 2) := ⟨Nat.prime_two⟩
  apply minimalPeriod_eq_prime
  · show (logistic r)^[2] _ = _
    simp only [iterate_succ, iterate_zero, comp_apply, id]
    rw [h1, h2]
  · intro hfix
    exact hne (hfix.symm.trans h1)
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
two_cycle_multiplierLean 4Proved here from basic factsFormally verified
/-- **Stability of the 2-cycle.** The multiplier of the period-2 orbit, `(f_r²)'(p₊) =
f_r'(p₊) f_r'(p₋) = r² (1 - 2p₊)(1 - 2p₋)`, equals `4 + 2r - r²`. It lies in `(-1, 1)` exactly
when `3 < r < 1 + √6 ≈ 3.449`, where the 2-cycle in turn doubles. -/
theorem two_cycle_multiplier {r : ℝ} (hr : 3 < r) :
    let s := Real.sqrt ((r - 3) * (r + 1))
    r * (1 - 2 * ((r + 1 + s) / (2 * r))) * (r * (1 - 2 * ((r + 1 - s) / (2 * r)))) =
      4 + 2 * r - r ^ 2 := by
  intro s
  have hr0 : r ≠ 0 := by linarith
  have hpos : 0 < (r - 3) * (r + 1) := by nlinarith
  have hs : s ^ 2 = (r - 3) * (r + 1) := Real.sq_sqrt hpos.le
  field_simp
  linear_combination (-1) * hs
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor

The attracting half of Theorem 1, in two steps that follow the human proof: the geometric estimate ∣fn(x)−x∗∣≤Kn∣x−x∗∣|f^n(x) - x^*| \le K^n|x - x^*|, and the mean value inequality that supplies KK from a bound on f′f'. Next to it is Banach's theorem for contractions of complete metric spaces, cited from Mathlib.

iterate_contractionLean 4Proved here from basic factsFormally verified
/-- **The basic estimate.** If `f` fixes `a`, maps the interval `I = [a - δ, a + δ]` into itself
and pulls every point of `I` towards `a` by a factor `K` (`|f x - a| ≤ K |x - a|`), then
`|fⁿ(x) - a| ≤ Kⁿ |x - a|` for `x ∈ I`. Induction on `n`. -/
theorem iterate_contraction {f : ℝ → ℝ} {a δ K : ℝ} (hK0 : 0 ≤ K) (hK1 : K ≤ 1)
    (hpull : ∀ x ∈ Icc (a - δ) (a + δ), |f x - a| ≤ K * |x - a|) :
    ∀ n : ℕ, ∀ x ∈ Icc (a - δ) (a + δ),
      f^[n] x ∈ Icc (a - δ) (a + δ) ∧ |f^[n] x - a| ≤ K ^ n * |x - a| := by
  have hmem : ∀ x, x ∈ Icc (a - δ) (a + δ) ↔ |x - a| ≤ δ := fun x => by
    rw [abs_le, mem_Icc]; constructor <;> rintro ⟨h1, h2⟩ <;> constructor <;> linarith
  intro n
  induction n with
  | zero => intro x hx; simp [hx]
  | succ n ih =>
    intro x hx
    obtain ⟨hin, hbound⟩ := ih x hx
    rw [iterate_succ_apply']
    have step := hpull _ hin
    have hδ : |f^[n] x - a| ≤ δ := (hmem _).mp hin
    refine ⟨(hmem _).mpr ?_, ?_⟩
    · calc |f (f^[n] x) - a| ≤ K * |f^[n] x - a| := step
        _ ≤ 1 * δ := mul_le_mul hK1 hδ (abs_nonneg _) zero_le_one
        _ = δ := one_mul δ
    · calc |f (f^[n] x) - a| ≤ K * |f^[n] x - a| := step
        _ ≤ K * (K ^ n * |x - a|) := mul_le_mul_of_nonneg_left hbound hK0
        _ = K ^ (n + 1) * |x - a| := by ring
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
attracting_fixed_pointLean 4Proved here from basic factsFormally verified
/-- **Attracting fixed point theorem.** Let `f(a) = a`, and suppose `f` is differentiable on
`I = [a - δ, a + δ]` with `|f'| ≤ K < 1` there. Then every orbit starting in `I` converges to `a`.
Proof: the mean value inequality gives `|f x - a| = |f x - f a| ≤ K |x - a|` on `I`; then
`iterate_contraction` gives `|fⁿ(x) - a| ≤ Kⁿ |x - a| → 0`. (If `f` is C¹ with `|f'(a)| < 1`,
continuity of `f'` provides such a `δ` and `K`.) -/
theorem attracting_fixed_point {f : ℝ → ℝ} {a δ K : ℝ} (hfix : f a = a) (hδ : 0 ≤ δ)
    (hK0 : 0 ≤ K) (hK1 : K < 1) (hdiff : ∀ x ∈ Icc (a - δ) (a + δ), DifferentiableAt ℝ f x)
    (hderiv : ∀ x ∈ Icc (a - δ) (a + δ), |deriv f x| ≤ K) {x : ℝ}
    (hx : x ∈ Icc (a - δ) (a + δ)) : Tendsto (fun n => f^[n] x) atTop (𝓝 a) := by
  have ha : a ∈ Icc (a - δ) (a + δ) := ⟨by linarith, by linarith⟩
  have hpull : ∀ y ∈ Icc (a - δ) (a + δ), |f y - a| ≤ K * |y - a| := by
    intro y hy
    have := (convex_Icc (a - δ) (a + δ)).norm_image_sub_le_of_norm_deriv_le hdiff
      (fun z hz => by rw [Real.norm_eq_abs]; exact hderiv z hz) ha hy
    simpa [Real.norm_eq_abs, hfix] using this
  have hbound := iterate_contraction hK0 hK1.le hpull
  -- `Kⁿ |x - a| → 0`, and `|fⁿ x - a|` is squeezed below it.
  have hlim : Tendsto (fun n : ℕ => K ^ n * |x - a|) atTop (𝓝 0) := by
    simpa using (tendsto_pow_atTop_nhds_zero_of_lt_one hK0 hK1).mul_const |x - a|
  rw [tendsto_iff_norm_sub_tendsto_zero]
  refine squeeze_zero (fun n => norm_nonneg _) (fun n => ?_) hlim
  rw [Real.norm_eq_abs]
  exact (hbound n x hx).2
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
banach_fixed_pointLean 4Applies a library theoremFormally verified
/-- **Banach's fixed point theorem**: a contraction of a non-empty complete metric space has a
unique fixed point, and every orbit converges to it. This applies Mathlib's
`ContractingWith.tendsto_iterate_fixedPoint` (and `ContractingWith.fixedPoint_isFixedPt`). -/
theorem banach_fixed_point {X : Type*} [MetricSpace X] [CompleteSpace X] [Nonempty X]
    {K : NNReal} {f : X → X} (hf : ContractingWith K f) (x : X) :
    IsFixedPt f (ContractingWith.fixedPoint f hf) ∧
      Tendsto (fun n => f^[n] x) atTop (𝓝 (ContractingWith.fixedPoint f hf)) :=
  ⟨ContractingWith.fixedPoint_isFixedPt hf, hf.tendsto_iterate_fixedPoint x⟩
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor

The expansion behind sensitive dependence (for the lift x↦2xx \mapsto 2x of the doubling map), and the Lyapunov function of the spiral sink:

doubling_separatesLean 4Proved here from basic factsFormally verified
/-- **Nearby orbits of the doubling map separate exponentially.** For the lift `D(x) = 2x` of the
doubling map `x ↦ 2x mod 1`, two orbits starting at distance `d` are at distance `2ⁿ d` after `n`
steps. So an initial uncertainty of `10⁻¹⁰` grows to order `1` within about 33 steps: the
Lyapunov exponent is `ln 2`. -/
theorem doubling_separates (x y : ℝ) (n : ℕ) :
    (fun z : ℝ => 2 * z)^[n] x - (fun z : ℝ => 2 * z)^[n] y = 2 ^ n * (x - y) := by
  induction n with
  | zero => simp
  | succ n ih =>
    rw [iterate_succ_apply', iterate_succ_apply', ← mul_sub, ih]
    ring
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor
lyapunov_decayLean 4Proved here from basic factsFormally verified
/-- **A Lyapunov function for the spiral sink** `x' = -x + y`, `y' = -x - y`. Along any solution,
`V = x² + y²` satisfies `V' = 2x(-x + y) + 2y(-x - y) = -2V`, so `V(t) = V(0) e^{-2t}`: every
solution spirals into the origin. Proof: `V(t) e^{2t}` has derivative `0`, hence is constant. -/
theorem lyapunov_decay {x y : ℝ → ℝ}
    (hx : ∀ t, HasDerivAt x (-x t + y t) t) (hy : ∀ t, HasDerivAt y (-x t - y t) t) (t : ℝ) :
    x t ^ 2 + y t ^ 2 = (x 0 ^ 2 + y 0 ^ 2) * Real.exp (-2 * t) := by
  set W : ℝ → ℝ := fun s => (x s ^ 2 + y s ^ 2) * Real.exp (2 * s) with hW
  have hWd : ∀ s, HasDerivAt W 0 s := by
    intro s
    have h1 := (((hx s).pow 2).add ((hy s).pow 2)).mul
      (((hasDerivAt_id' s).const_mul 2).exp)
    convert h1 using 1
    simp only [Pi.add_apply, Pi.pow_apply, Nat.cast_ofNat]
    ring
  have hconst : W t = W 0 :=
    is_const_of_deriv_eq_zero (fun s => (hWd s).differentiableAt) (fun s => (hWd s).deriv) t 0
  have hexp : Real.exp (2 * t) * Real.exp (-2 * t) = 1 := by
    rw [← Real.exp_add]; simp
  simp only [hW, mul_zero, Real.exp_zero, mul_one] at hconst
  calc x t ^ 2 + y t ^ 2 = (x t ^ 2 + y t ^ 2) * (Real.exp (2 * t) * Real.exp (-2 * t)) := by
        rw [hexp, mul_one]
    _ = ((x t ^ 2 + y t ^ 2) * Real.exp (2 * t)) * Real.exp (-2 * t) := by ring
    _ = (x 0 ^ 2 + y 0 ^ 2) * Real.exp (-2 * t) := by rw [hconst]
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/DynamicalSystems.leanTry it in the Lean web editor

What is and is not formalised. Proved here: Theorem 2 in full (fixed points, their multipliers and stability ranges, the 2-cycle, its minimal period and multiplier), the attracting half of Theorem 1 (with ∣f′∣≤K<1|f'| \le K < 1 on an interval as hypothesis), the expansion of the doubling map, and the Lyapunov decay for one linear system. Cited: Banach's fixed point theorem. Not formalised: the repelling half of Theorem 1, the classification of linear systems, Hartman–Grobman, Lyapunov's theorem in general, Poincaré–Bendixson, Theorems 8 and 9 on the circle, Sharkovskii's theorem and Feigenbaum universality. Mathlib has the Jordan curve theorem only in special cases, so Poincaré–Bendixson is some way off.

ComputationC

Periods, Feigenbaum's constant and the limits of simulation

The first program explores the logistic family. It detects the period of the attractor for several rr. It locates the superstable parameters RnR_n, where the attracting 2n2^n-cycle passes through the critical point 12\frac12, by Newton's method in rr. Their gap ratios approach Feigenbaum's δ\delta, just as the bifurcation points do. It also estimates Lyapunov exponents.

Logistic map: periods, Feigenbaum's delta and Lyapunov exponentsPythonNumerical approximationComputationally tested
"""The logistic map x -> r x (1 - x): periods, Feigenbaum's constant, chaos.

Three numerical experiments. (1) For several r we discard a long transient
and look for the period of the attractor. (2) The superstable parameters R_n,
where the attracting 2^n-cycle passes through the critical point x = 1/2,
solve f_r^(2^n)(1/2) = 1/2; we find them by Newton's method in r (the
derivative in r is computed alongside the orbit) and watch the ratios of
successive gaps approach Feigenbaum's delta = 4.6692... (3) The Lyapunov
exponent, the orbit average of ln |f_r'(x)|, is negative on periodic windows
and positive in chaos; at r = 4 its exact value is ln 2.

Evidence: numerical, in floating point. Periods and exponents are found for
finitely many iterates; Feigenbaum's constant is approached, not proved.
"""

import math

def logistic(r, x):
    """One step of the logistic map."""
    return r * x * (1 - x)

def attractor_period(r, x0=0.2, transient=4000, max_period=64, tol=1e-7):
    """Smallest p <= max_period with |f^p(x) - x| < tol after the transient."""
    x = x0
    for _ in range(transient):
        x = logistic(r, x)
    y = x
    for p in range(1, max_period + 1):
        y = logistic(r, y)
        if abs(y - x) < tol:
            return p
    return None

def superstable_residual(r, n):
    """g(r) = f_r^(2^n)(1/2) - 1/2 and its derivative g'(r)."""
    x, dx = 0.5, 0.0
    for _ in range(2 ** n):
        x, dx = r * x * (1 - x), x * (1 - x) + r * (1 - 2 * x) * dx
    return x - 0.5, dx

def superstable_parameters(count):
    """R_0, ..., R_{count-1}: superstable 2^n-cycles, by Newton's method."""
    values = [2.0, 1 + math.sqrt(5)]
    ratio = 4.0
    while len(values) < count:
        n = len(values)
        r = values[-1] + (values[-1] - values[-2]) / ratio
        for _ in range(60):
            g, dg = superstable_residual(r, n)
            step = g / dg
            r -= step
            if abs(step) < 1e-15:
                break
        values.append(r)
        ratio = (values[-2] - values[-3]) / (values[-1] - values[-2])
    return values[:count]

def lyapunov_exponent(r, x0=0.2, transient=1000, n=20000):
    """Average of ln |f_r'(x_k)| = ln |r (1 - 2 x_k)| along the orbit."""
    x = x0
    for _ in range(transient):
        x = logistic(r, x)
    total = 0.0
    for _ in range(n):
        total += math.log(abs(r * (1 - 2 * x)) + 1e-300)
        x = logistic(r, x)
    return total / n

def main():
    print("1. Attractor periods (after 4000 transient steps)")
    for r in [2.8, 3.2, 3.5, 3.56, 3.83, 3.9]:
        p = attractor_period(r)
        print(f"   r = {r:4.2f}: period {p if p else 'none found up to 64'}")
    print()
    print("2. Superstable parameters R_n and Feigenbaum ratios")
    rs = superstable_parameters(9)
    for n, r in enumerate(rs):
        line = f"   R_{n} = {r:.10f}"
        if n >= 2:
            delta = (rs[n - 1] - rs[n - 2]) / (r - rs[n - 1])
            line += f"   ratio {delta:.5f}"
        print(line)
    print("   Feigenbaum's delta = 4.66920...")
    print()
    print("3. Lyapunov exponents (20000 iterates)")
    for r in [2.8, 3.2, 3.83, 3.9, 4.0]:
        print(f"   r = {r:4.2f}: {lyapunov_exponent(r):+.4f}")
    print(f"   exact value at r = 4: ln 2 = {math.log(2):.4f}")
    print()
    print("Epistemic status: numerical. Periods, parameters and exponents are")
    print("floating-point computations over finitely many iterates; that the")
    print("gap ratios converge to a universal delta is a theorem (Lanford's")
    print("computer-assisted proof, 1982; Lyubich, 1999), not something this")
    print("table proves.")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

The exponents fit the theory: ln⁡0.8=−0.223\ln 0.8 = -0.223 at r=2.8r = 2.8, where the fixed point has multiplier 2−r=−0.82 - r = -0.8; negative in the period-3 window at r=3.83r = 3.83; positive at r=3.9r = 3.9; and ln⁡2\ln 2 at r=4r = 4 (Theorem 9). The ratios agree with δ=4.66920…\delta = 4.66920\ldots to five digits. But a table of eight ratios cannot prove that they converge, let alone that the limit is universal. That needed Lanford's computer-assisted proof, where the computer's role was to check rigorous inequalities, not to run a simulation.

How far can a simulation of a chaotic map be trusted? At r=4r = 4 the conjugacy of Theorem 9 gives the true orbit exactly: xn=sin⁡2(2nπθ0)x_n = \sin^2(2^n\pi\theta_0), with 2nθ0 mod 12^n\theta_0 \bmod 1 computed in exact rational arithmetic. The second program compares it with ordinary floating-point iteration.

Sensitive dependence: true orbits versus floating pointPythonExact computationNumerical approximationCounterexampleComputationally tested
"""Sensitive dependence, and why a simulation is not the true orbit.

At r = 4 the logistic map is conjugate to the doubling map: if
x = sin^2(pi theta) then 4x(1 - x) = sin^2(2 pi theta). So the true orbit of
x_0 = sin^2(pi theta_0) is x_n = sin^2(2^n pi theta_0), and for rational
theta_0 we can compute 2^n theta_0 mod 1 exactly with fractions. This gives
the true orbit to full floating-point accuracy at every step, which we
compare with naive floating-point iteration of 4x(1 - x). The rounding error
of about 1e-16 doubles at each step, and after about 50 steps the simulated
orbit has nothing to do with the true one. Two true orbits started 1e-10
apart separate the same way. Finally, the doubling map itself in floating
point sends every starting value to 0 within about 55 steps, while in exact
arithmetic the orbit of 1/7 cycles 1/7, 2/7, 4/7 forever.

Evidence: exact rational arithmetic for the true orbits, compared with
floating point; the conjugacy formula is proved in the lesson.
"""

import math
from fractions import Fraction

def true_orbit(theta0, steps):
    """x_n = sin^2(pi * (2^n theta0 mod 1)) for n = 0..steps (theta0 rational)."""
    theta = Fraction(theta0) % 1
    xs = []
    for _ in range(steps + 1):
        xs.append(math.sin(math.pi * float(theta)) ** 2)
        theta = (2 * theta) % 1
    return xs

def float_orbit(x0, steps, r=4.0):
    """Naive floating-point iteration of x -> r x (1 - x)."""
    xs = [x0]
    for _ in range(steps):
        xs.append(r * xs[-1] * (1 - xs[-1]))
    return xs

def doubling_float(x0, steps):
    """Floating-point doubling map x -> 2x mod 1."""
    xs = [x0]
    for _ in range(steps):
        xs.append((2 * xs[-1]) % 1.0)
    return xs

def doubling_exact(x0, steps):
    """Exact doubling map on fractions."""
    xs = [Fraction(x0)]
    for _ in range(steps):
        xs.append((2 * xs[-1]) % 1)
    return xs

def first_zero(xs):
    """Index of the first exact 0 in a list, or None."""
    for i, x in enumerate(xs):
        if x == 0:
            return i
    return None

def main():
    theta0 = Fraction(1, 7) + Fraction(1, 10 ** 6)
    truth = true_orbit(theta0, 60)
    sim = float_orbit(truth[0], 60)
    near = true_orbit(theta0 + Fraction(1, 10 ** 10), 60)
    print("Logistic map r = 4, x0 = sin^2(pi theta0), theta0 = 1/7 + 1e-6")
    print("   n    true x_n    float x_n   |error|    true orbit from theta0+1e-10")
    for n in range(0, 61, 6):
        err = abs(truth[n] - sim[n])
        print(f"{n:4d}   {truth[n]:.6f}    {sim[n]:.6f}   {err:.1e}"
              f"    {near[n]:.6f}")
    print("Both gaps double at each step: the float error, from about 1e-16,")
    print("reaches order 1 near step 50; the two true orbits, 1e-10 apart in")
    print("theta, separate completely near step 30.")
    print()
    d_float = doubling_float(1 / 7, 80)
    d_exact = doubling_exact(Fraction(1, 7), 80)
    print("Doubling map x -> 2x mod 1 starting at 1/7:")
    print(f"   exact orbit: {', '.join(str(x) for x in d_exact[:7])}, ...")
    print(f"   float orbit reaches exactly 0 at step {first_zero(d_float)}"
          " and stays there")
    print()
    print("Epistemic status: the true orbits are computed from exact fractions")
    print("and the proved conjugacy, so they are correct to float accuracy;")
    print("the float iterations are a counterexample to trusting long")
    print("simulations of chaotic maps. Shadowing theorems explain why such")
    print("simulations can still be close to some other true orbit.")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

The floating-point orbit is accurate for about 4040 steps and meaningless after 5555: each step doubles the rounding error. The doubling map in floating point is worse still. Every float is a dyadic rational, so every orbit hits 00 exactly within about 5555 steps, while in exact arithmetic 17\frac17 cycles forever. This is not a reason to distrust all simulations. The shadowing lemma says that for hyperbolic systems a computed pseudo-orbit stays close to some true orbit, so statistical features such as the Lyapunov exponent can be reliable even when individual orbits are not.

Explore

Explore: cobwebs, cycles and phase portraits

The logistic map. Start at r=2.8r = 2.8: the cobweb spirals into the fixed point 1−1/r1 - 1/r. Move rr past 33 and watch the cobweb settle on a square, the 2-cycle. Past 3.453.45 you get a 4-cycle, and past 3.573.57 chaos, with windows of order such as the 3-cycle near r=3.83r = 3.83. The widget's verdict comes from finitely many iterates.

The logistic map x ↦ r x (1 − x)

Feed each output back in: xₖ₊₁ = f(xₖ). The cobweb diagram shows where the orbit goes.

f(x) =
x₀

Iterates xₖ against k

  • y = f(x)
  • y = x
  • cobweb path

Last iterates: x78 = 0.64286, x79 = 0.64286, x80 = 0.64286

The orbit appears to settle at a fixed point x* ≈ 0.64286.

Fixed points in view (numerical): x* = 0 (repelling: |f′(x*)| > 1); x* = 0.6429 (attracting: |f′(x*)| < 1)

Based on 3,000 iterations in floating-point arithmetic: numerical evidence, not proof.

Linear systems. This matrix has trace −3-3 and determinant 22, so its eigenvalues are −1-1 and −2-2: a stable node. Edit the equations to make a saddle (Δ<0\Delta < 0), a spiral (τ2<4Δ\tau^2 < 4\Delta) or a centre (τ=0\tau = 0), and check the trace–determinant diagram.

A stable node: eigenvalues −1 and −2

Arrows show where the system moves next. Click to start a trajectory, or choose an example.

Examples

x′ = x − 2·y, y′ = 3·x − 4·y

darker, longer arrows = faster forward in time backward in timeequilibrium (hollow = stable or centre)

Click the plane to start a trajectory, or type a start point below.

Start point

Trajectories: 3. They are numerical approximations (fourth-order Runge–Kutta), not exact formulas.

Linear systemA = [1−23−4]

T = −3, D = 2, T² − 4D = 1; λ = −2, −1

Equilibrium at (0, 0): stable node

TDD = T²/4
Trace T and determinant D: below the T-axis, saddles; above the dashed parabola D = T²/4, spirals; between them, nodes; on the upper D-axis, centres. Left of the D-axis is stable, right is unstable.

A limit cycle. Van der Pol's oscillator: orbits from inside and outside wind onto the same closed curve. The equilibrium at the origin is an unstable spiral, and a trapping region around it gives the cycle by Poincaré–Bendixson.

Van der Pol's limit cycle

Arrows show where the system moves next. Click to start a trajectory, or choose an example.

Examples

x′ = y, y′ = (1 − x²)·y − x

darker, longer arrows = faster forward in time backward in timeequilibrium (hollow = stable or centre)

Click the plane to start a trajectory, or type a start point below.

Start point

Trajectories: 2. They are numerical approximations (fourth-order Runge–Kutta), not exact formulas. The latest trajectory runs onto a closed loop (to the accuracy of the picture): a periodic orbit or limit cycle.

Nonlinear system. Equilibria found numerically in this window, classified by their linearisation (Jacobian matrix):

  1. 1. (0, 0): spiral source (unstable) (λ = 0.5 ± 0.866i)
TDD = T²/4
Trace T and determinant D: below the T-axis, saddles; above the dashed parabola D = T²/4, spirals; between them, nodes; on the upper D-axis, centres. Left of the D-axis is stable, right is unstable.

Energy and separatrices. The pendulum conserves energy, so its orbits are level curves. Find the centre, the saddles, and the separatrices that divide swinging from spinning. The linearisation at the bottom is a centre, and here — unlike the earlier example — the nonlinear system really does have closed orbits, because energy is conserved.

The pendulum's phase plane

Arrows show where the system moves next. Click to start a trajectory, or choose an example.

Examples

x′ = y, y′ = −sin(x)

darker, longer arrows = faster forward in time backward in timeequilibrium (hollow = stable or centre)

Click the plane to start a trajectory, or type a start point below.

Start point

Trajectories: 4. They are numerical approximations (fourth-order Runge–Kutta), not exact formulas.

Nonlinear system. Equilibria found numerically in this window, classified by their linearisation (Jacobian matrix):

  1. 1. (−6.283, 0): centre: closed orbits around it (λ = 0 ± 1i)
  2. 2. (−3.142, 0): saddle (unstable) (λ = −1, 1)
  3. 3. (0, 0): centre: closed orbits around it (λ = 0 ± 1i)
  4. 4. (3.142, 0): saddle (unstable) (λ = −1, 1)
  5. 5. (6.283, 0): centre: closed orbits around it (λ = 0 ± 1i)

A centre of the linearisation is inconclusive for a nonlinear system: the true orbits may close up (as for the pendulum and predator–prey) or spiral slowly.

TDD = T²/41, 3, 52, 4
Trace T and determinant D: below the T-axis, saddles; above the dashed parabola D = T²/4, spirals; between them, nodes; on the upper D-axis, centres. Left of the D-axis is stable, right is unstable.
Exercises

Exercises

1. Dynamical systems and chaos

Warm-upHuman

The map f(x)=x3f(x) = x^3 has three fixed points. How many of them are attracting?

2. Dynamical systems and chaos

Warm-upHuman

Classify the equilibrium at the origin of x˙=x+2y\dot x = x + 2y, y˙=3x+2y\dot y = 3x + 2y.

Choose one

3. Dynamical systems and chaos

CoreHuman

For the logistic map with r=2.5r = 2.5, how do orbits starting near the fixed point x∗=1−1/r=0.6x^* = 1 - 1/r = 0.6 behave?

Choose one

4. Dynamical systems and chaos

CoreHuman

How many points of the circle have minimal period exactly 33 under the doubling map D(x)=2x mod 1D(x) = 2x \bmod 1?

5. Dynamical systems and chaos

CoreHuman

On the torus R2/Z2\R^2/\Z^2, the flow x˙=1\dot x = 1, y˙=2\dot y = \sqrt2 has no equilibria, every orbit is bounded, and every orbit is dense — so no orbit is periodic or approaches a periodic orbit. Which hypothesis of the Poincaré–Bendixson theorem fails?

Choose one

6. Dynamical systems and chaos

CoreFormal

In Mathlib, which statement says that p lies on an orbit of f of period exactly 2 (periodic with period 2, but not a fixed point)?

Choose one

7. Dynamical systems and chaos

CoreHuman

Consider x˙=−y−x(x2+y2)\dot x = -y - x(x^2 + y^2), y˙=x−y(x2+y2)\dot y = x - y(x^2 + y^2). Which statement about the origin is correct?

Choose one

8. Dynamical systems and chaos

CoreComputational

Write lyapunov(r, x0, n, transient) that estimates the Lyapunov exponent of the logistic map fr(x)=rx(1−x)f_r(x) = rx(1 - x): iterate transient times from x0 without recording, then return the average of ln⁡∣fr′(xk)∣=ln⁡∣r(1−2xk)∣\ln|f_r'(x_k)| = \ln|r(1 - 2x_k)| over the next n iterates xkx_k.

Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

9. Dynamical systems and chaos

StretchHuman

Which statements are true? Choose all that apply.

Choose all that apply

10. Dynamical systems and chaos

StretchHuman

For which values of rr is the period-2 orbit {p+,p−}\{p_+, p_-\} of the logistic map attracting?

Choose one
Common misconceptionsH

Common misconceptions

Misconception

"Chaos means randomness." Chaotic systems are deterministic: the logistic map at r=4r = 4 has the exact formula xn=sin⁡2(2nπθ0)x_n = \sin^2(2^n\pi\theta_0). What chaos destroys is predictability in practice. Any error in the initial condition, however small, is amplified exponentially (here by 2n2^n), so the long-run future depends on digits we cannot know. Chaotic orbits can nonetheless have perfectly regular statistics, such as an invariant density.

Misconception

"The computer showed it is chaotic, so it is." A simulation shows finitely many iterates in floating-point arithmetic, which is itself a different dynamical system: every floating-point orbit is eventually periodic, and for the doubling map every one ends at 00. Numerical evidence of a positive Lyapunov exponent is evidence, not proof. Proofs of chaos use conjugacies (Theorem 9), symbolic dynamics, or computer-assisted arguments with rigorous error bounds, as in Lanford's and Tucker's work.

Misconception

"If the linearisation is stable, the equilibrium is stable." Only when the equilibrium is hyperbolic (Hartman–Grobman). A linear centre is consistent with a stable spiral, an unstable spiral, or a true centre for the nonlinear system, as the examples r˙=∓r3\dot r = \mp r^3 show. And for maps, ∣f′(x∗)∣=1|f'(x^*)| = 1 decides nothing.

Misconception

"Dense orbits mean chaos." An irrational rotation of the circle has every orbit dense, but nearby points never separate and there are no periodic points. Devaney's definition asks for transitivity and dense periodic points, and these together imply sensitive dependence.

Misconception

"A bounded orbit must settle down or repeat." In the plane, essentially yes (Poincaré–Bendixson). On the torus, the irrational flow wanders densely for ever with no equilibria and no cycles, and in three dimensions orbits can be chaotic (Lorenz). For maps even the interval allows chaos. The theorem depends on the topology of the plane.

ViewpointsH

Many ways of seeing

Topology— Conjugacy, index and the Jordan curve

To a topologist, two systems are the same when they are topologically conjugate, h∘f=g∘hh \circ f = g \circ h with hh a homeomorphism:

XX
XX
YY
YY
ff
hh
hh
gg
Topological conjugacy: h∘f=g∘hh \circ f = g \circ h. Hartman–Grobman says a flow near a hyperbolic equilibrium is conjugate to its linearisation.

Topology also constrains flows globally. The index of an isolated equilibrium is the number of turns its vector field makes around a small loop: +1+1 for nodes, spirals and centres, −1-1 for saddles. A periodic orbit in the plane has index +1+1, so it must enclose equilibria of total index +1+1. On a closed surface, the Poincaré–Hopf theorem says the indices of the zeros of a vector field add up to the Euler characteristic. On the sphere (χ=2\chi = 2) every flow has an equilibrium — the hairy ball theorem. On the torus (χ=0\chi = 0) there are flows without equilibria, which is where Poincaré–Bendixson fails. See differential topology.

Geometry— Phase space, invariant manifolds and conserved area

Near a saddle the geometric picture is two curves: the stable manifold of points flowing into the saddle and the unstable manifold of points flowing out, tangent to the eigenvectors. They organise the whole phase portrait — the separatrices of the pendulum are such manifolds. Poincaré discovered that when stable and unstable manifolds of a saddle intersect transversally (a homoclinic tangle), the dynamics nearby contains a copy of the doubling map's symbolic dynamics (Smale's horseshoe, 1960s). That is the geometric origin of chaos in mechanics. Hamiltonian flows such as the pendulum preserve area in phase space (Liouville's theorem). So they can have no attracting equilibria or limit cycles, and their chaos looks different. See classical mechanics.

Probability— Invariant measures and time averages

A chaotic orbit is unpredictable individually but predictable statistically. For f4f_4 the density ρ(x)=1πx(1−x)\rho(x) = \frac{1}{\pi\sqrt{x(1 - x)}} is invariant: if x0x_0 is distributed according to ρ\rho, so is x1x_1. It is the image under hh of the uniform (Lebesgue) measure, which the doubling map preserves. Birkhoff's ergodic theorem (1931) says that for almost every x0x_0 the time average of any integrable observable equals its space average. For instance the fraction of time an orbit spends in [a,b][a, b] tends to ∫abρ\int_a^b\rho, and the Lyapunov exponent equals ∫01ln⁡∣4(1−2x)∣ρ(x) dx=ln⁡2\int_0^1\ln|4(1 - 2x)|\rho(x)\,dx = \ln 2. In binary coordinates the doubling map is a sequence of fair coin tosses, and deterministic chaos is a Bernoulli process. See ergodic theory.

Physics— Weather, planets and the limits of prediction

Lorenz's 1963 system was a drastic truncation of the equations of atmospheric convection, and its sensitive dependence is why weather forecasts lose skill after about two weeks. In celestial mechanics, Poincaré's 1890 prize memoir on the three-body problem first met the homoclinic tangles that produce chaos. A famous correction to it, made before publication, is where he discovered them. Later the KAM theorem (Kolmogorov 1954, Arnold 1963, Moser 1962) showed that most quasi-periodic motions of a nearly integrable Hamiltonian system survive small perturbations. Order and chaos coexist in the Solar System, and numerical studies (Laskar, 1989) found that the inner planets' orbits are chaotic on time scales of millions of years — a numerical finding, consistent with but not equivalent to a proof.

Computation— Rigorous numerics and computer-assisted proofs

Floating-point simulation of a chaotic system loses all information about individual orbits within a few dozen steps. A computer can still prove theorems about dynamics if it computes with interval arithmetic: every number is an interval guaranteed to contain the true value, and every operation rounds outwards. Lanford's 1982 proof of Feigenbaum's conjectures and Tucker's 2002 proof that Lorenz's attractor exists both work this way, checking finitely many rigorous inequalities that a human argument reduces the theorem to. Shadowing theorems explain when long simulations remain statistically meaningful. In numerical analysis, the same questions of stability and error growth govern the integrators used to compute flows.

History & global context

History and global context

  • Poincaré. Henri Poincaré's memoir on the three-body problem won King Oscar II of Sweden's prize in 1889. While correcting an error in it he discovered homoclinic tangles, and his Méthodes nouvelles de la mécanique céleste (1892–1899) founded the qualitative theory of differential equations. Ivar Bendixson completed the Poincaré–Bendixson theorem in 1901.
  • Stability. Aleksandr Lyapunov's 1892 doctoral thesis, written while he taught in Kharkiv, introduced his functions and exponents. Balthasar van der Pol studied relaxation oscillations in electronic circuits in the 1920s. Aleksandr Andronov's school in Gorky (Nizhny Novgorod) developed the theory of limit cycles and bifurcations, and introduced structural stability with Lev Pontryagin in 1937.
  • Hyperbolicity and chaos. Stephen Smale's horseshoe (1960s) explained Poincaré's tangles; Dmitri Anosov and Yakov Sinai developed hyperbolic dynamics and its statistics. Oleksandr Sharkovskii proved his ordering of periods in Kyiv in 1964, little noticed in the West until Tien-Yien Li and James Yorke's "Period three implies chaos" (1975).
  • The 1970s. Edward Lorenz's "Deterministic nonperiodic flow" (1963) was rediscovered; Robert May's 1976 Nature article popularised the logistic map. Mitchell Feigenbaum (1975–1978) found universality, independently of Pierre Coullet and Charles Tresser, and Oscar Lanford proved it with a computer-assisted argument in 1982.
  • Since. Warwick Tucker's 2002 proof that the Lorenz attractor exists answered one of Smale's problems for the twenty-first century. Artur Avila and Mikhail Lyubich, among others, have completed much of the picture of one-dimensional dynamics; Avila's Fields Medal (2014) cited this work.
Further reading

Further reading

  • Steven H. Strogatz, Nonlinear Dynamics and Chaos (1994; 2nd edition 2015) — the classic introduction, rich in examples from physics, biology and engineering.
  • Robert L. Devaney, An Introduction to Chaotic Dynamical Systems (1986; 3rd edition 2022) — one-dimensional dynamics with full proofs: the logistic map, symbolic dynamics and Sharkovskii's theorem.
  • Morris W. Hirsch, Stephen Smale and Robert L. Devaney, Differential Equations, Dynamical Systems, and an Introduction to Chaos (3rd edition, 2013) — linear systems, Poincaré–Bendixson and the Lorenz system.
  • Lawrence Perko, Differential Equations and Dynamical Systems (3rd edition, 2001) — proofs of Hartman–Grobman and the generalised Poincaré–Bendixson theorem.
  • James Gleick, Chaos: Making a New Science (1987) — the story of the 1970s, for a general audience.