Files
hot-step-cpp-ROCm/engine/plugins/solvers/heun.lua
T
2026-08-16 18:24:52 +07:00

35 lines
974 B
Lua

-- heun.lua: Heun's method (improved Euler / explicit trapezoidal)
-- 2 NFE: evaluate at t_curr, predict, evaluate at t_prev, average.
solver = {
name = "heun",
display = "Heun (2 NFE)",
description = "Second-order predictor-corrector",
nfe = 2,
order = 2,
needs_model = true,
stateful = false,
stochastic = false,
}
function step(xt, vt, t_curr, t_prev, n, model_fn, vt_buf)
local dt = t_curr - t_prev
-- Predict: xt_pred = xt - vt * dt
for i = 0, n - 1 do
xt[i] = xt[i] - vt[i] * dt
end
-- Correct: evaluate at (xt_pred, t_prev)
model_fn(xt, t_prev)
-- Average: xt = xt + 0.5 * (vt_buf - vt) * dt
-- Note: xt is already xt_pred = xt_orig - vt * dt
-- We want: xt_orig - 0.5*(vt + vt_buf)*dt
-- = (xt + vt*dt) - 0.5*(vt + vt_buf)*dt
-- = xt + 0.5*(vt - vt_buf)*dt
for i = 0, n - 1 do
xt[i] = xt[i] + 0.5 * (vt[i] - vt_buf[i]) * dt
end
end