Both versions model the same single-degree-of-freedom heaving buoy:
(m + m_a)·z" + (b_rad + b_pto)·z' + k_hs·z = F0·cos(ωt)
The 3D sim only ever time-steps this equation and reads off whatever power results. This 2D companion runs two independent solutions side by side: an RK4 time integrator (the animated buoy) and the textbook closed-form steady-state solution of the same linear ODE (the resonance curve):
X(ω) = F0 / √[(k_hs − mω²)² + (bω)²] (RAO amplitude)
P_avg(ω) = ½·b_pto·ω²·X(ω)² (steady-state PTO power)
Sweeping this formula across wave periods draws the whole resonance curve in one shot, with no time-stepping at all — something the 3D sim cannot show, since it only ever knows the single operating point it happens to be running. Because the buoy's own radiation damping and excitation force are frequency-dependent (a diffraction-reduced Froude-Krylov force and a damping bump peaked near the natural frequency), the curve's true peak sits at a slightly different period than Tn itself — verified numerically: with the denominator's mass/stiffness term isolated, its peak matches the standard damped-oscillator formula ωpeak = ωn√(1−2ζ²) to within 0.01 s, and the full time-stepped engine's converged power matches the full analytic curve to within a few percent at every tested combination of period, damping and detuning.
- Resonance: pushing Tn toward the wave period T raises both curves' peak — watch the dot climb the resonance hill as you drag the slider.
- Damping match: for a linear PTO, average power is maximised when bpto ≈ brad(ω), the buoy's own radiation damping at that frequency.
- Capture-width ceiling: even at perfect tuning, a heaving point absorber cannot beat CWmax = λ/(2π) (Budal/Falnes bound); the efficiency readout compares actual capture width against this ceiling, same as the 3D sim.