fput-chain#
A struck Fermi-Pasta-Ulam-Tsingou chain: the many-mode companion of the two-oscillator toy in ../chaos-toy-examples, and a simple stand-in for the struck plate of cymbal-elastodynamics/flat-plate-2.
The model#
unit masses on a line between two fixed walls, joined by springs with force law (), and optionally held by on-site springs of stiffness . The normal modes are with : for the low modes are nearly harmonic (like a string), and detunes them (like a plate). The stiffness of a stretched spring is , so stretching couples the modes, as stretching the midplane does in a plate. Damping is friction on every mass plus dashpots between neighbours; mode decays (in amplitude) at , the chain's version of the plate's damping. The strike gives a few masses near one end a smooth velocity profile with kinetic energy .
model.py integrates ensembles of strikes with a fourth-order symplectic scheme (Yoshida) and the exact propagator of the damping, integrates the tangent dynamics for the largest Lyapunov exponent, and computes mode energies and the effective fraction of modes ( the entropy of the mode shares; 1 for equal shares, about 0.7 for random equipartition, for a single mode).
Results (2026-10-05; , strike on mass 8, width 2 masses)#
Equipartition and chaos vs strike energy, undamped (results/scan.png, 4000 time units, 6 strikes per energy):
| E | 0.5 | 0.8 | 2 | 5 | 13 | 32 | 50 |
|---|---|---|---|---|---|---|---|
| : Lyapunov exponent | 0.0007 | 0.0015 | 0.006 | 0.021 | 0.050 | 0.10 | 0.13 |
| : fraction of modes sharing the energy | 0.18 | 0.50 | 0.67 | 0.67 | 0.64 | 0.64 | 0.67 |
| : Lyapunov exponent | 0 | 0 | 0.0001 | 0.0002 | 0.0009 | 0.013 | 0.037 |
| : fraction of modes sharing the energy | 0.17 | 0.17 | 0.18 | 0.18 | 0.18 | 0.25 | 0.43 |
Below the harmonic chain keeps the strike's energy in the modes it started in, the classic FPUT observation. From to 2 it spreads to equipartition, and the Lyapunov exponent grows roughly in proportion to . The detuned chain () holds the energy in its initial modes up to , some twenty times more: detuning removes the near-resonances through which the modes exchange energy (results/cascade.png shows the mode energies over time). The same effect, much weaker, separated the equal and detuned pairs of the two-oscillator toy, and the plate's spectrum is strongly inharmonic.
Damped strikes and the frozen spectrum (results/damped_mu0.png, results/damped_mu1.png; lowest mode decaying at 4e-4, highest at 3e-3 per time unit; 16 strikes whose strengths differ by times the member index):
- , : regular; the energy stays in the lowest four modes and all 16 strikes end identical.
- , : a real cascade, energy spread over about 70% of the modes for the first 1000 time units, and a positive local Lyapunov exponent (about 0.015) for a few hundred. Yet all 16 strikes end identical. The chaotic phase amplifies differences by about , which takes to , still invisible.
- , : local exponent up to 0.08 for about 600 time units, amplification far beyond , and the 16 strikes end with different spectra: the share of energy in each of the main modes differs by about 0.57 decades (about 6 dB, standard deviation across strikes).
- : no strike up to ends differently from its neighbours.
So an energy cascade is not the same as an audible fingerprint. Whether a tiny difference between strikes grows to a visible one depends on the amplification accumulated over the chaotic phase, , against the size of the difference; a strike can share its energy among all modes and still be perfectly repeatable. The damping enters directly: the web app shows that with the highest mode damped twice as fast (ring time 0.15 s instead of 0.3 s at 110 Hz), the strong strike at no longer separates at all.
Web application#
web/index.html (single page, no build step; published as a private artifact at https://claude.ai/artifact/C6oaNiG2zCRX9VR7Wn4Wfx) simulates 8 strikes in the browser and plays strikes A and B. Controls: strike energy, number of masses, on-site springs, strike position and width, the A/B difference, ring times of the lowest and highest modes, the pitch of the lowest mode, and length. Panels: the chain with displacements drawn sideways and springs drawn by stiffness (with slow motion), the energy of strike A per mode over time, the effective fraction of modes for all 8 strikes, their final spectra, the local Lyapunov exponent with the energy, and a spectrogram of any of the 8 strikes (a selector above it, or the arrow keys, flips between strikes on a shared color scale, highlights the chosen strike in the two plots above, and plays it). Presets: Gentle (), Cascade only (), Strong (), Strong, detuned (, ). Locally: cd web && python -m http.server.
Time in the app is scaled so the lowest mode sounds at the chosen pitch, so a ring time in seconds means different damping in the chain's own time units for different : with the lowest mode is at instead of 0.095, and one second of sound is about ten times fewer time units.
Running#
Experiments run on the office workstation (~/work/fput-chain, Python 3.9 with numpy and scipy), plots locally:
WORKERS=32 python experiments.py all # results/*.npz
python plots.py # results/*.png