Skip to the plate
FORMA PUBLIC DOMAIN GENERATIVE ATLAS / ED. 0.28
Plate 40, Chirikov Standard Map: a still of the map / kicked rotor plate as the atlas renders it, in the attractors accent.

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));
}