Skip to the plate
FORMA PUBLIC DOMAIN GENERATIVE ATLAS / ED. 0.28
Plate 81, Tinkerbell Map: a still of the map / quadratic plate as the atlas renders it, in the attractors accent.

PL. 81  ·  ATTRACTORS / MAP / QUADRATIC

Tinkerbell Map

origin unrecorded · documented by Nusse & Yorke, 1994

OPEN THE LIVE PLATE ▸

DEFINITION

xₙ₊₁ = xₙ² − yₙ² + a·xₙ + b·yₙ
yₙ₊₁ = 2·xₙ·yₙ + c·xₙ + d·yₙ

NOTES

A quadratic map whose attractor is a hooked crescent, and one of the rare entries here where the honest provenance is that nobody knows. It has no first paper anyone has traced and no account of where the name came from beyond the obvious — the arc looks like a trail of pixie dust over a castle. What is on the record is Nusse and Yorke’s numerical study, which found sixty-four unstable period-ten orbits and a strange attractor with a fractal basin boundary at the parameters this plate opens on. This atlas would rather say "unrecorded" than invent a discoverer.

PROVENANCE

Origin
Not established. The map is catalogued and studied in H. E. Nusse & J. A. Yorke, Dynamics: Numerical Explorations, Springer, 1994 (2nd ed. 1998), where the strange attractor and its fractal basin boundary are reported at a = 0.9, b = −0.6, c = 2, d = 0.5. No earlier source has been identified, and the origin of the name is likewise unrecorded
Standing
Public domain — an iterated map
Constants
All four ranges are measured, not declared: each is the band around Nusse and Yorke’s value where the orbit stays bounded and its largest Lyapunov exponent stays positive. They are narrow because the map is. Even inside them the chaotic set is riddled with periodic windows — about one slider position in seven lands on a cycle of a few points instead of the crescent, and that near-empty plate is a true picture of this map at that parameter, not a fault. All four are LOCKED so regenerate cannot wander into one unattended. Outside the plotted box an orbit is on its way to infinity, so it is dropped and reseeded rather than smeared across the plate

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. 81 · TINKERBELL MAP — origin unrecorded · documented by Nusse & Yorke, 1994
//   xₙ₊₁ = xₙ² − yₙ² + a·xₙ + b·yₙ
//   yₙ₊₁ = 2·xₙ·yₙ + c·xₙ + d·yₙ
// 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=tinkerbell

float p_a = 0.9 + chf('a_tweak');     // a · live 0.84 .. 0.902
float p_b = -0.596 + chf('b_tweak');  // b · live -0.6 .. -0.584
float p_c = 2 + chf('c_tweak');       // c · live 1.89 .. 2.002
float p_d = 0.5 + chf('d_tweak');     // d · live 0.48 .. 0.502

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

// The exposure replayed as a point cloud, from the plate's own start
// (−0.72, −0.64). Outside a |x|, |y| < 4 box the orbit is on its way to
// infinity, not on the attractor — the plate reseeds rather than drawing
// the escape, and so does this.
int forma_pts  = 120000;
int forma_skip = 20;

float x = -0.72, y = -0.64;
for (int i = 0; i < forma_pts + forma_skip; i++){
    float nx = x * x - y * y + p_a * x + p_b * y;
    float ny = 2.0 * x * y + p_c * x + p_d * y;
    if (abs(nx) >= 4.0 || abs(ny) >= 4.0){ x = -0.72; y = -0.64; continue; }
    x = nx;  y = ny;
    if (i < forma_skip) continue;
    // canvas y runs down; negated so the figure sits as the plate shows it
    int pt = addpoint(0, set(x, -y, 0.0));
    float u = float(i) / float(forma_pts + forma_skip);
    setpointattrib(0, "Cd", pt, forma_ramp(0.8 + 0.3 * u));
}