mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-06 08:53:01 +02:00
48 lines
1.5 KiB
Matlab
48 lines
1.5 KiB
Matlab
function x = adamspc(functs, init, interval, stepsize)
|
|
% obtain first five steps from RK4
|
|
[x, derivs] = RK4(functs, init, interval, stepsize, 5);
|
|
x = x(2:end, :);
|
|
|
|
% define coefficient tables
|
|
beta = [1901, -2774, 2616, -1274, 251] / 720;
|
|
betastar = [475, 1427, -798, 482, -173, 27] / 1440;
|
|
|
|
% build output based on preceding values
|
|
stepcount = ceil((interval(2) - interval(1)) / stepsize);
|
|
for step = 6:(stepcount + 1)
|
|
% predict
|
|
xpred = x(:, step - 1);
|
|
for eqnum = 1:size(functs, 1)
|
|
for prev = 1:5
|
|
xpred(eqnum) = xpred(eqnum) ...
|
|
+ stepsize * beta(prev) * derivs(eqnum, step - prev);
|
|
end
|
|
end
|
|
|
|
% evaluate
|
|
derivpred = zeros(size(functs, 1), 1);
|
|
for eqnum = 1:size(functs, 1)
|
|
derivpred(eqnum) = functs{eqnum}(xpred);
|
|
end
|
|
|
|
% correct
|
|
x(:, step) = x(:, step - 1);
|
|
for eqnum = 1:size(functs, 1)
|
|
for prev = 1:5
|
|
x(eqnum, step) = x(eqnum, step) ...
|
|
+ stepsize * betastar(prev + 1) * derivs(eqnum, step - prev);
|
|
end
|
|
x(eqnum, step) = x(eqnum, step) ...
|
|
+ stepsize * betastar(1) * derivpred(eqnum);
|
|
end
|
|
|
|
% evaluate
|
|
for eqnum = 1:size(functs, 1)
|
|
derivs(eqnum, step) = functs{eqnum}(x(:, step));
|
|
end
|
|
end
|
|
|
|
% append arguments to output
|
|
x = [interval(1):stepsize:(stepcount * stepsize); x];
|
|
end
|