When two solitons collide, are they just linear wave packets passing through each other (superposition: amplitudes add, no memory), or a genuinely nonlinear object? Integrability theory (GGKM 1967) makes an exact, parameter-free prediction: they emerge unchanged except for a phase shift Δx₁ = κ₁⁻¹·ln((κ₁+κ₂)/(κ₁−κ₂)) — for κ₂/κ₁ = 1/2, the fast soliton's jump is exactly ln 3. Can that number, the elastic pass-through, and the taller-is-faster speed law all EMERGE from nothing but a finite-difference integration of the bare PDE?
Units: dimensionless (κ₁Δx₁ = ln((κ₁+κ₂)/(κ₁−κ₂)) = ln 3 for κ₁ = 1, κ₂ = 0.5 — Lax 1968)
▶ Run this simulationRead how it works
The KdV soliton phase shift — ln 3 read off a raw PDE integration: with ONLY u_t + 6u·u_x + u_xxx = 0 discretized (the original Zabusky–Kruskal 1965 leapfrog; no soliton formula, no speed law, no scattering theory in the recovery path), a fast soliton (κ₁ = 1) overtaking a slow one (κ₂ = 0.5) jumps forward by exactly the inverse-scattering prediction κ₁Δx₁ = ln((κ₁+κ₂)/(κ₁−κ₂)) = ln 3: recovered 1.098552 vs 1.098612 (rel 5.5e-5, Richardson over an N = 320/640/1280 ladder with emergent q = 2.06); the slow soliton is dragged back −ln3/κ₂ to 6.8e-5; both re-emerge with amplitudes restored to 3e-4 and speeds to 9e-7 (elastic pass-through); the merged hump at the symmetric instant is 1.49972 vs the exact 2(κ₁²−κ₂²) = 1.5 (1.9e-4) — 40% BELOW linear superposition's 2.5; the Zabusky–Kruskal speed law emerges as c = 1.9983·a^0.9994; the phase-shift law tracks a κ₂ sweep across both Lax interaction regimes to RMS 1.5e-3; and the same machinery with the nonlinear term deleted (u_t + u_xxx = 0) has NO soliton — the pulse collapses to 0.57× while KdV holds 0.9998×
The original Zabusky–Kruskal conservative leapfrog (PRL 15, 240 (1965)) for u_t + 6u·u_x + u_xxx = 0 on a periodic box — only the PDE is discretized; sech² humps are the initial data (as in ZK 1965) and every claim under test is an output. Peak trajectories are located by parabolic sub-grid refinement and fit linearly in windows placed ONLY where the solitons' exponential tails no longer overlap (fit points require peak separation ≥ 4/κ₂ + 2/κ₁; at gap 6 a wide soliton's sech² tail displaces the other's peak at the 1e-2 level — measured, then excluded by design). The phase shift is the intercept jump between the pre- and post-collision trajectory lines; a Δx-halving ladder N ∈ {320, 640, 1280} (Δt = 0.084·Δx³ throughout) gives the emergent convergence order and the Richardson value gate A scores. 11 gates: fast/slow phase shifts + emergent q, elastic restoration, merged-hump height, 4-amplitude speed law with emergent power fit, Δx-halving speed convergence, linear-dispersion rival, 4-point κ₂ perturbation sweep, ∫u/∫u² conservation, and a 24-seed noisy-measurement recovery (windowed-LSQ-quadratic peak relocation under σ_u = 0.03 per-point noise). All known values live in scripts/oracles/kdv.reference.json, loaded ONLY to score. Plus 5 module-honesty certificate gates (J–N) that EXECUTE the shipped KdVSolitonModule.ts — see module_systematics. ~16 s. ?world=kdv.
The exact two-soliton interaction of the Korteweg–de Vries equation: phase shifts Δx_i = ±κ_i⁻¹·ln((κ₁+κ₂)/(κ₁−κ₂)) (Lax, Comm. Pure Appl. Math. 21, 467 (1968); GGKM inverse scattering, PRL 19, 1095 (1967)), the 1-soliton speed law c = 4κ² = 2a (Zabusky–Kruskal, PRL 15, 240 (1965)), and the merged-hump height 2(κ₁²−κ₂²) from the Hirota tau function (PRL 27, 1192 (1971)). It VALIDATES, not derives: the generator is the bare PDE plus the 1965 finite-difference scheme — the sech² profile appears only as initial data (exactly as in Zabusky–Kruskal's own experiment), while the phase-shift formula, the ln 3, the speed law's 2 and 1, the elastic restoration, and the 1.5 are all measured OUTPUTS present only in the reference file's scoring targets. Non-circularity: no scattering transform, no tau function, no closed form of any tested law is in the recovery path (tamper test: falsifying known_value flips exit to 1 with the recovered 1.098552 unchanged). The decisive control is structural: the SAME machinery with the nonlinear term deleted (pure dispersion u_t + u_xxx = 0) produces no soliton at all — the hump collapses to 0.57× by t = 1.5 — and linear superposition's collision predictions (merged height 2.5, phase shift 0) are each wrong by ~40% and ~∞ respectively where the integration returns 1.5 and ln 3. This is the lab's first integrable-PDE / soliton oracle, the nonlinear counterpart of the emwave linear-PDE world, and closes the loop opened by the FPUT world: ZK invented solitons to explain the FPUT recurrence.
CERTIFIED HONEST BY EXECUTION (refiner honesty cert): scripts/kdv-derisk.mjs gates J–N execute the shipped KdVSolitonModule.ts (sha256-pinned, 36 mechanical TS-strip pairs each asserted to occur exactly once, run via new Function under recorder Babylon/DOM stubs). (1) The init speed-law measurement === a statics op-order replica BIT-FOR-BIT (all 5 {a, c} doubles), and it is EARNED: every dot's c ≠ 2a in doubles, all below the law (the mesh-dispersion low bias the old finding disclosed by estimate — now measured: rel 2.4e-4 … 1.58e-3 over a = 0.5 … 2.5). (2) 384 live engine calls (= EXACTLY 520 leapfrog substeps each — deterministic, no accumulator, no RNG) are bit-exact vs the lockstep replica at EVERY call: all three leapfrog levels (512 pts each), ∫u/∫u² drifts, tracked amplitudes, and the 8192-float thin-instance wave buffer; the %6 HUD is LIVE (64 writes, 63 distinct payloads, bit-equal to the template at every write) while the chart is FROZEN at its single init write — the frozen/live split proven, not assumed. (3) The dot-vs-law gap is PRICED with owner named: an N=256 replica of the module's own measurement scales each gap by 3.78–3.98× (emergent q = 1.92–1.99 ∈ [1.6, 2.4]) — pure O(Δx²) mesh dispersion; and the worst dot-to-line gap is 0.148 px on the 130-px chart: the old finding's 'invisible at chart scale' claim now VERIFIED by execution while the doubles differ. (4) Conservation claims measured over the certified run (t ≈ 8): ∫u abs drift 1.5e-14 (roundoff), ∫u² rel drift max 1.61e-8 ∈ [5e-9, 5e-8] — the doc's ~1e-8 claim TRUE. (5) On-screen restoration after the interaction: 2 − 1.99949 = 5.1e-4 and 0.9 − 0.90000 = −2.1e-6, inside derived ceilings (grid-sampling dip a·κ²Δx²/4 + mesh scar scaled from oracle gate B). (6) The executed measurement path is answer-free: the speed push is c: d/T from tracked peak displacement — no 2a, no 4κ², no ln anywhere in it; _soliton's c = 2a width–amplitude construction is INITIAL DATA only (def + 3 initial-fill call sites, the same relation as the oracle's hump()), and a planted-violation self-test proves the scanner live. OVERCLAIM CAUGHT AND FIXED by the cert: the module claimed the two solitons 'merge into a single lump' — measured, the live pair (a = 2.0/0.9, speed ratio 4/1.8 ≈ 2.22 < 3) is in Lax's double-hump EXCHANGE regime: the peak count never drops below 2 (the tallest dips to 1.3482 at call 217, t ≈ 4.53); doc comment and HUD line corrected to 'they exchange' — zero numeric change (all pinned doubles bit-identical before/after the wording fix). Tampers surgical: known_value → only A/A2 fail, recovery unchanged; cert sha → only J; post-strip 1-ulp HSCALE → only J's doubles-pinned statics check fails — the Float32 wave buffer ABSORBS a 1-ulp double tamper, so every string and f32 pin stays green BY DESIGN. 16/16 in ~16 s.
Estimator lesson recorded: a soliton peak sitting on another soliton's sech² tail is displaced by (tail slope)/|u''| — at peak separation 6 with κ₂ = 0.35 this biased the phase shift at the 1e-2 level while LOOKING like a clean linear trajectory fit. Fit windows must require separation ≥ ~4 decay lengths of the WIDER soliton (here 4/κ₂ + 2/κ₁). The bias also partially cancelled the mesh systematic at the main pair — the first 'passing' number was right for the wrong reason; the honest window plus Richardson ladder replaced luck with convergence. Cert micro-lesson (#112): a Float32 display buffer ABSORBS 1-ulp double tampers (f32 rounding quantizes them away), so a cert of an f32-rendered world needs at least one doubles-pinned statics/state gate as the ulp tripwire — string and f32 pins alone are blind at that magnitude; and when a module states a regime-dependent qualitative claim ('merge into a single lump'), CHECK ITS OWN SCENARIO's regime by execution — this pair sits on the exchange side of the Lax c₁/c₂ = 3 boundary and never merges (5th overclaim caught by execution across the cert program).
npm run derisk -- kdv (scripts/kdv-derisk.mjs)scripts/oracles/kdv.reference.jsonN. J. Zabusky & M. D. Kruskal, Phys. Rev. Lett. 15, 240 (1965); C. S. Gardner, J. M. Greene, M. D. Kruskal & R. M. Miura, Phys. Rev. Lett. 19, 1095 (1967); P. D. Lax, Comm. Pure Appl. Math. 21, 467 (1968); R. Hirota, Phys. Rev. Lett. 27, 1192 (1971); D. J. Korteweg & G. de Vries, Phil. Mag. 39, 422 (1895); J. S. Russell, 'Report on Waves', BAAS (1844); P. G. Drazin & R. S. Johnson, Solitons: An Introduction (CUP 1989) ch. 3–5.