PL. 40 · ATTRACTORS / MAP / KICKED ROTOR
Chirikov Standard Map
Boris Chirikov, 1969
OPEN THE LIVE PLATE ▸DEFINITION
pₙ₊₁ = pₙ + K·sin θₙ (mod 2π) θₙ₊₁ = θₙ + pₙ₊₁ (mod 2π)
NOTES
The phase portrait of a rotor kicked once per revolution, and the standard test problem of Hamiltonian chaos. Below the critical coupling, invariant circles wall the chaotic regions into bands; near K ≈ 0.9716 the last circle — the one with the golden-mean winding number — breaks, and orbits can finally diffuse across the whole cylinder. Islands draw themselves as rings, the chaotic sea as speckle.
PROVENANCE
- Origin
- B. V. Chirikov, preprint 267, Institute of Nuclear Physics, Novosibirsk, 1969; Physics Reports 52, 1979
- Standing
- Public domain — an area-preserving map
- Constants
- K ≈ 0.9716 is critical: the last invariant circle breaks there
- Source
- doi:10.1016/0370-1573(79)90023-1
HOUDINI · VEX
The same published mathematics as a Detail Wrangle body. Paste it into a Wrangle with Run Over set to Detail; every constant is the published value plus a tweak channel, so Create Spare Parameters gives a slider that starts where the paper does.
// FORMA — PL. 40 · CHIRIKOV STANDARD MAP — Boris Chirikov, 1969
// pₙ₊₁ = pₙ + K·sin θₙ (mod 2π)
// θₙ₊₁ = θₙ + pₙ₊₁ (mod 2π)
// Paste into a Detail Wrangle (Run Over: Detail), no inputs needed.
// Written from the published mathematics, not adapted from any code.
// Constants arrive at their published values. Press the node's Create
// Spare Parameters button and every tweak becomes a slider — starting
// at 0, the published figure, and moving in the constant's own units.
// https://forma-gen.com/#plate=standard
float p_K = 0.972 + chf('K_tweak'); // K — kick strength · live 0.1 .. 2.6
float p_run = 400 + chf('run_tweak'); // orbit length per seed · live 50 .. 2000
// The plate's own colour: FORMA's ATTRACTORS accent as a cosine ramp,
// brightest near t = 0 and t = 1, near-black around t = 0.5.
vector forma_ramp(float t){
return set(
0.0956 + 0.1039 * cos(6.28318530718 * (t + 0)),
0.4041 + 0.4392 * cos(6.28318530718 * (t + 0.05)),
0.46 + 0.5 * cos(6.28318530718 * (t + 0.1)));
}
// Area-preserving, so there is no attractor to fall onto — every start keeps
// its own orbit forever. Short runs from scattered seeds are the honest
// rendering: islands close into rings, chaos arrives as speckle.
int forma_pts = 120000;
float TAU = 6.28318530718;
float th = 0.0, pn = 0.0;
int run = int(p_run) + 1, si = 0; // force a seed on the first step
for (int i = 0; i < forma_pts; i++){
if (++run > int(p_run)){
run = 0;
// deterministic scattered restarts, mirroring the plate's seeded rng
th = TAU * random(si * 2);
pn = TAU * random(si * 2 + 1);
si++;
}
pn = pn + p_K * sin(th);
pn = pn - TAU * floor(pn / TAU);
th = th + pn;
th = th - TAU * floor(th / TAU);
// canvas y runs down; flipped within the torus square to match the plate
int pt = addpoint(0, set(th, TAU - pn, 0.0));
float u = float(i) / float(forma_pts);
setpointattrib(0, "Cd", pt, forma_ramp(0.8 + 0.3 * u));
}