Mercurial > repos > public > sbplib
changeset 991:a99f00896b8e feature/timesteppers
Make Rungekutta4SecondOrder native second order
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 09 Jan 2019 10:17:00 +0100 |
parents | 1066bb31bc95 |
children | bbd165cc585c |
files | +time/Rungekutta4.m +time/Rungekutta4SecondOrder.m +time/Timestepper.m |
diffstat | 3 files changed, 18 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
diff -r 1066bb31bc95 -r a99f00896b8e +time/Rungekutta4.m --- a/+time/Rungekutta4.m Wed Jan 09 09:09:15 2019 +0100 +++ b/+time/Rungekutta4.m Wed Jan 09 10:17:00 2019 +0100 @@ -26,6 +26,7 @@ end function obj = step(obj) + t = obj.t; v = obj.v; dt = obj.dt;
diff -r 1066bb31bc95 -r a99f00896b8e +time/Rungekutta4SecondOrder.m --- a/+time/Rungekutta4SecondOrder.m Wed Jan 09 09:09:15 2019 +0100 +++ b/+time/Rungekutta4SecondOrder.m Wed Jan 09 10:17:00 2019 +0100 @@ -2,11 +2,8 @@ properties F dt - t - n - - G % RHS for rewritten system - w + t, n + v, v_t end @@ -20,45 +17,41 @@ obj.t = t0; obj.n = 0; - m = length(v0); - obj.w = [v0; v0t]; - obj.G = @(t, w)[ - w(m+1:end); - F(t,w(1:m), w(m+1:end)); - ]; + obj.v = v0; + obj.v_t = v0t; end function [v,t] = getV(obj) - v = obj.w(1:end/2); + v = obj.v t = obj.t; end function [vt,t] = getVt(obj) - vt = obj.w(end/2+1:end); + vt = obj.v_t; t = obj.t; end function obj = step(obj) - % TODO: Avoid extra storage - w = obj.w; + t = obj.t; + v = obj.v; + v_t = obj.v_t; dt = obj.dt; - k1 = obj.G(t, w); - k2 = obj.G(t + 0.5*dt, w + 0.5*dt*k1); - k3 = obj.G(t + 0.5*dt, w + 0.5*dt*k2); - k4 = obj.G(t + dt, w + dt*k3); + k1 = obj.F(t, v, v_t); + k2 = obj.F(t + 1/2*dt, v + 1/2*dt*v_t, v_t + 1/2*dt*k1); + k3 = obj.F(t + 1/2*dt, v + 1/2*dt*v_t + 1/4*dt^2*k1, v_t + 1/2*dt*k2); + k4 = obj.F(t + dt, v + dt*v_t + 1/2*dt^2*k2, v_t + dt*k3); - obj.w = w + dt*(1/6)*(k1+2*(k2+k3)+k4); + obj.v = v + dt*v_t + dt^2*(1/6)*(k1 + k2 + k3); + obj.v_t = v_t + dt*(1/6)*(k1 + 2*k2 + 2*k3 + k4); obj.t = obj.t + obj.dt; obj.n = obj.n + 1; end end - methods (Static) function k = getTimeStep(lambda) k = rk4.get_rk4_time_step(lambda); end end - -end \ No newline at end of file +end