-- Simple ODE solvers to use with Lua
--
module(..., package.seeall);
--TODO:
-- * Runge-Kutta-Fehlberg with adaptive step size
-- One of the simplest: Runge-Kutta 4th order (non-stiff ODES)
function rk4(U0, t, h, s, obj)
local k1, k2, k3, k4
local U = U0+0
local U1 -- make a copy
k1 = obj:derivs(t, U)*h
k2 = obj:derivs(t + .5*h, U + .5*k1) * h
k3 = obj:derivs(t + .5*h, U + .5*k2) * h
k4 = obj:derivs(t + h, U + k3) * h
U1 = (k1 + 2*k2 + 2*k3 + k4) * (1/6)
return U1, t+h, h
end
rkc_module = require 'rkc' -- Runge-Kutta-Chebyshev for mildly stiff ODEs
rkc = rkc_module.rkc -- pointer to the default version of integrator
rkc_a = rkc_module.rkc_a