Initial release
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
-- dop853.lua: Dormand-Prince 8th order (13 NFE, fixed step)
|
||||
|
||||
solver = {
|
||||
name = "dop853",
|
||||
display = "DOP853 (13 NFE)",
|
||||
description = "8th order Dormand-Prince (maximum accuracy)",
|
||||
nfe = 13,
|
||||
order = 8,
|
||||
needs_model = true,
|
||||
stateful = false,
|
||||
stochastic = false,
|
||||
}
|
||||
|
||||
local C = {
|
||||
1/18, 1/12, 1/8, 5/16, 3/8,
|
||||
59/400, 93/200, 5490023248/9719169821,
|
||||
13/20, 1201146811/1299019798,
|
||||
1, 1,
|
||||
}
|
||||
local A = {
|
||||
{1/18},
|
||||
{1/48, 1/16},
|
||||
{1/32, 0, 3/32},
|
||||
{5/16, 0, -75/64, 75/64},
|
||||
{3/80, 0, 0, 3/16, 3/20},
|
||||
{29443841/614563906, 0, 0, 77736538/692538347, -28693883/1125000000, 23124283/1800000000},
|
||||
{16016141/946692911, 0, 0, 61564180/158732637, 22789713/633445777, 545815736/2771057229, -180193667/1043307555},
|
||||
{39632708/573591083, 0, 0, -433636366/683701615, -421739975/2616292301, 100302831/723423059, 790204164/839813087, 800635310/3783071287},
|
||||
{246121993/1340847787, 0, 0, -37695042795/15268766246, -309121744/1061227803, -12992083/490766935, 6005943493/2108947869, 393006217/1396673457, 123872331/1001029789},
|
||||
{-1028468189/846180014, 0, 0, 8478235783/508512852, 1311729495/1432422823, -10304129995/1701304382, -48777925059/3047939560, 15336726248/1032824649, -45442868181/3398467696, 3065993473/597172653},
|
||||
{185892177/718116043, 0, 0, -3185094517/667107341, -477755414/1098053517, -703635378/230739211, 5731566787/1027545527, 5232866602/850066563, -4093664535/808688257, 3962137247/1805957418, 65686358/487910083},
|
||||
{403863854/491063109, 0, 0, -5068492393/434740067, -411421997/543043805, 652783627/914296604, 11173962825/925320556, -13158990841/6184727034, 3936647629/1978049680, -160528059/685178525, 248638103/1413531060, 0},
|
||||
}
|
||||
local B = {
|
||||
14005451/335480064, 0, 0, 0, 0,
|
||||
-59238493/1068277825, 181606767/758867731, 561292985/797845732,
|
||||
-1041891430/1371343529, 760417239/1151165299, 118820643/751138087,
|
||||
-528747749/2220607170, 1/4,
|
||||
}
|
||||
|
||||
function step(xt, vt, t_curr, t_prev, n, model_fn, vt_buf)
|
||||
local dt = t_curr - t_prev
|
||||
local xt_orig = {}
|
||||
local k1 = {}
|
||||
for i = 0, n-1 do xt_orig[i] = xt[i]; k1[i] = vt[i] end
|
||||
|
||||
local ks = {k1}
|
||||
local x_tmp = {}
|
||||
|
||||
-- 12 extra stages
|
||||
for s = 1, 12 do
|
||||
local a_row = A[s]
|
||||
for i = 0, n-1 do
|
||||
local combo = 0
|
||||
for j = 1, #a_row do
|
||||
if a_row[j] ~= 0 and ks[j] then
|
||||
combo = combo + a_row[j] * ks[j][i]
|
||||
end
|
||||
end
|
||||
x_tmp[i] = xt_orig[i] - dt * combo
|
||||
end
|
||||
-- Write x_tmp to xt for model_fn
|
||||
for i = 0, n-1 do xt[i] = x_tmp[i] end
|
||||
model_fn(xt, t_curr - C[s] * dt)
|
||||
ks[s+1] = {}
|
||||
for i = 0, n-1 do ks[s+1][i] = vt_buf[i] end
|
||||
end
|
||||
|
||||
-- Combine
|
||||
for i = 0, n-1 do
|
||||
local sol = 0
|
||||
for j = 1, 13 do
|
||||
if B[j] ~= 0 and ks[j] then sol = sol + B[j] * ks[j][i] end
|
||||
end
|
||||
xt[i] = xt_orig[i] - dt * sol
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user