Presets
Playback
Model parameters
Training plan
Time
Camera
Layers
Quality
Model check
The science
Fitness-fatigue (impulse-response) model
Banister's model treats each training session of load w(s) as an impulse that adds a slowly decaying fitness effect and a faster decaying fatigue effect. Performance on day d is p(d) = p0 + k1 Σs<d w(s) e-(d-s)/τ1 - k2 Σs<d w(s) e-(d-s)/τ2, with p0 = 100 here. The page evaluates it with the exact one-step recursion F(d) = e-1/τ(F(d-1) + w(d-1)), identical to the 2D page.
One session and the best rest time
A single session changes performance by k1e-t/τ1 - k2e-t/τ2: negative first (fatigue dominates since k2 > k1), then positive. The peak occurs at t* = τ1τ2/(τ1-τ2) · ln(k2τ1 / (k1τ2)). This is the rationale for tapering before an event.
What you see
The two tanks are the fitness term k1F (green) and fatigue term k2G (red), each scaled to its maximum over the 120 days; the gauge needle shows p - 100; the lamp is green when form k1F - k2G exceeds 15 % of its largest magnitude, red when below minus 15 %. Each shelf slot is one day: the plate stack height is the day's load, the past is coloured by load, today is gold. The runner's cadence follows performance and the shirt reddens with fatigue; the acute:chronic ratio is the 7-day load divided by the 28-day average weekly load.
Independent checks
(1) The numerical peak day of a one-session response equals the analytic t* to within one day. (2) The recursion matches the closed form k1e-t/τ1 - k2e-t/τ2 to about 1e-15. (3) Live: at the day shown, the recursion value of the fitness term is compared with the direct convolution sum.
Honest simplifications
The model has constant coefficients fitted per athlete in real studies, ignores sleep, nutrition, illness and the non-linearity of adaptation, and is known to fit individual data loosely. Loads are arbitrary units, the plans are examples, and the runner animation, plate counts and colours are visual encodings, not measurements. Educational model, not training advice.