On 13 September 2026 Matt Henderson posted a leaky waterwheel: approximating the Lorenz attractor with a chaotic leaky water wheel. The orange dot is the centre of mass of the water. It traces (a projection of) the familiar attractor as the wheel spins seemingly randomly left and right. The demo is his, and his original post is worth watching first. He also pointed at Steven Strogatz's lecture, which is where the machine and its derivation come from.
Unlike the other rebuilds on this site, almost nothing here had to be guessed. This is the Malkus waterwheel, and it has a published derivation — Strogatz's Nonlinear Dynamics and Chaos, §9.1. So the interesting thing a rebuild can add is not a reconstruction but a demonstration: the correspondence is exact, and this page runs both sides of it at once so you can watch them agree.
Buckets hang from the rim and stay upright as the wheel turns. Water is poured into whichever is passing under the tap, and every bucket leaks in proportion to what it holds. That is the entire machine. The only thing the water does to the wheel is the last term — a torque that reads off exactly one number, the horizontal offset of the water's centre of mass.
Write the water as a Fourier series around the rim. Each harmonic evolves on its own, driven by the tap and carried round by the spin — and only the first harmonic exerts any torque, because ∫cos(nθ)cos(θ)dθ is zero for every other n. So the higher harmonics are passengers, and the whole machine closes into three equations: the two first-harmonic coefficients and the spin. Substitute τ = kt, X = ω/k, Y = −c a₁, Z = ρ − c b₁ with c = πgr/(kν), and they are the Lorenz equations, letter for letter:
β = 1, not Lorenz's 8/3. A waterwheel is a Lorenz system, not the Lorenz system — and it has no choice about it, which is why the readout shows β as a fact rather than a slider. The engine here integrates the three-equation wheel and the Lorenz equations side by side from the same starting state and asserts they stay on top of each other, in a test, so the claim on this page is checked rather than asserted.
Two consequences the page leans on. First, the centre of mass of the water is (rπa₁, rπb₁)/M — so the plane the orange dot moves in is the Lorenz (Y, Z) plane, up to sign and scale. It is not drawing something that looks like the attractor; it is drawing the attractor, in a projection. Second, the total mass of water obeys Ṁ = ∫Q − kM, which has no ω in it at all: the wheel can be doing anything and the amount of water aboard settles to q/k and stays there. That constant is what holds the scale factor still.
A real wheel has finitely many buckets, and that is the whole of the approximation. Sum the discrete equations and you get the continuum ones back exactly, except that the two inflow projections are sampled at n points instead of integrated — so they wobble with period 2π/n as the wheel turns. A finite wheel is the Lorenz system plus a small periodic forcing, and the buckets slider is a dial on how small. The readout shows the ripple; at five buckets it is enormous and at fifty it has all but gone.
Turn the inflow up from nothing and the wheel passes through all of Lorenz's behaviour in order, which is the thing a video cannot let you do:
That last formula needs σ > β+1 = 2 to mean anything, and σ is ν/(Ik) — so a wheel without enough damping cannot be made chaotic at any flow rate. Drag the damping down and watch the gauge say so. It is a genuinely odd fact about the machine: friction is what makes it unpredictable.
Switch on the twin wheel. It is the same wheel with its initial spin changed in the ninth decimal place — a difference far smaller than any real machine could be built to. In the steady regime the two stay welded together forever. In the chaotic one the gap grows by a factor of ten every few seconds, and within a couple of minutes the two wheels are turning opposite ways. The plot is log distance against time; the slope is the Lyapunov exponent, and you are watching it get drawn.
Four things run in lockstep from the same starting state: the physical wheel with its finite
buckets, its twin, the continuum reduction, and the Lorenz system with the mapped parameters.
All of it is a small Rust engine compiled to WebAssembly (engine/ here, 52 KB, no
imports and no bindgen), integrating with classical RK4 — accuracy matters more than usual here,
because the entire subject is how fast small errors grow. Sixteen tests check the physics against
the published result rather than against the code.
This is a fan page. The demo is Matt Henderson's (matthen.com, @matthen.com); the maths is Malkus's and Lorenz's and Strogatz's; the code here is ours and none of his video is copied onto this site. If he would rather this did not exist, or wants anything about it changed, that decision is his and we will act on it — see the note on the front page.