/ proof-of-concept / gong-wire
Sign in
proof-of-concept / gong-wire
gong-wire
Go to fileHistoryFork
resultsGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
webGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
.gitignoreGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
experiments.pyGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
plots.pyGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
README.mdGong wire: FPUT chain with bending stiffness and a dome, experiments, web app
wire.pyGong wire: FPUT chain with bending stiffness and a dome, experiments, web app

gong-wire#

The third chaos toy, after ../chaos-toy-examples (two coupled oscillators) and ../fput-chain (the struck FPUT chain). The FPUT chain cascades among its 32 nearly harmonic modes, which span only about 4 kHz when the lowest is at 100 Hz; a gong or a cymbal spreads energy upward through a dense, inharmonic spectrum reaching well above 10 kHz, over tens of milliseconds. This project adds the two ingredients that make the difference, bending stiffness and curvature, to the FPUT chain.

The model (wire.py)#

NN unit beads on a wire between two pinned ends move sideways, yjy_j. The wire may be built as a shallow arch of height HdH_d, rest shape zj=4Hdx(1−x)z_j = 4 H_d x(1-x). The energy is

∑j[12TDj2+β(zj′Dj+12Dj2)2]+12Kb∑j(yj+1−2yj+yj−1)2,Dj=yj+1−yj,\sum_j \left[\tfrac12 T D_j^2 + \beta \left(z'_j D_j + \tfrac12 D_j^2\right)^2\right] + \tfrac12 K_b \sum_j (y_{j+1} - 2y_j + y_{j-1})^2, \qquad D_j = y_{j+1} - y_j,

with zj′z'_j the slope of link jj at rest. Each term has a role:

  • Stretching (β\beta). A sideways offset DD between neighbours stretches the link by about D2/2D^2/2. With Hd=Kb=0H_d = K_b = 0 the model is exactly the FPUT-β\beta chain, read as the sideways motion of a beaded string; this is what passes energy between modes, as the midplane stretching does in a plate.
  • Bending (KbK_b). Resistance to kinks makes the frequencies grow like the square of the wavenumber at short wavelengths, as in a plate: with Kb=4K_b = 4 and 64 beads the modes span 100 Hz to about 17 kHz instead of 100 Hz to 4 kHz.
  • Dome (HdH_d). With a curved rest shape the link stretch has a part linear in DD, which stiffens the wire (as curvature stiffens a shell) and adds a quadratic coupling (z′D3z' D^3 in the energy), through which two modes can drive a third at the sum of their frequencies, the three-wave coupling of gongs and cymbals.

With a dome the normal modes are no longer sines and are computed numerically. Damping is friction plus dashpots between neighbours; with bending, the dashpot decay rate grows roughly in proportion to frequency, as in a metal plate. run uses leapfrog time stepping with a Crank-Nicolson step for the damping. Checks: the force equals minus the energy gradient to 1e-10, the stiffness matrix matches the linearized force to 1e-7, and energy is conserved to about 1e-4 in the exploration runs.

Results (2026-10-05)#

Exploration, undamped (experiments.py explore, results/explore.png; 64 beads, strike centered on bead 14 with width 3, lowest mode at 100 Hz). Share of the energy in modes above 4 kHz at 10, 50 and 300 ms:

bending dome E = 10 E = 50
0 0 3%, 20%, 19% (top mode 4.1 kHz) 12%, 12%, 11%
4 0 0.6%, 6%, 16% 15%, 48%, 74%
4 3 1%, 9%, 21% 24%, 44%, 63%
4 8 1%, 8%, 22% 15%, 42%, 61%

At E=2E = 2 almost nothing reaches 4 kHz in any configuration. With bending, a strong strike's energy climbs into the 4 to 17 kHz band over the first 50 to 100 ms: a bloom rather than the instant mixing of the plain chain, which has no high band to climb into. The dome speeds up the early spreading (at E=10E = 10 the share above 1 kHz after 10 ms rises from 24% without a dome to 34 to 43% with one), but its effect is smaller than that of bending.

Bloom without chaos. In the web app (damped: lowest mode ringing 3 s, highest 0.3 s) the cascade and the chaos separate clearly. At E=20E = 20 about 10% of the energy reaches above 4 kHz within 20 ms, yet the local Lyapunov exponent stays near zero and strikes differing by 10−610^{-6} end identical. At E=60E = 60 a perturbation grows only by about e4.6e^{4.6} within 200 ms; at E=200E = 200, 59% of the energy reaches above 4 kHz by 35 ms, the motion is chaotic for the first 0.11 s (peak rate 334 per second, total growth about e14e^{14}), and 8 strikes differing by 10−610^{-6} end with spectra that differ by 4.5 dB. As in the FPUT chain, a cascade is not the same as sensitivity: the bloom is reproducible from strike to strike over a wide range of strengths, and only very hard strikes leave a different spectrum each time. Bending detunes the modes, which presumably raises the threshold for chaos much as the on-site springs did in the FPUT chain.

Web application#

web/index.html (single page; published as a private artifact at https://claude.ai/artifact/RqEkYpuX4wqHXT7Rcfs3ZU) runs 8 strikes in parallel Web Workers. Controls: strike energy, bending stiffness, dome height, number of beads, strike position and width, the difference between strikes, ring times of the lowest and highest modes, the pitch of the lowest mode (held so the highest mode stays below 20 kHz), and length. Panels: the domed wire with its beads (with slow motion), strike A's energy per mode labelled by pitch, the share of each strike's energy above 1 and 4 kHz, the final spectra against pitch, the local Lyapunov exponent with the energy, and a spectrogram of any strike (selector or arrow keys). Presets: Soft strike (E=3E = 3), Gong (E=20E = 20), Hard strike (E=200E = 200), String (FPUT, no bending or dome). Locally: cd web && python -m http.server.

Running#

Experiments run on the office workstation (~/work/gong-wire, Python 3.9 with numpy and scipy), plots locally:

WORKERS=18 python experiments.py explore     # results/explore.npz
python plots.py                              # results/explore.png
↑↓ move↵openescclose