comparison +time/Rungekutta4SecondOrder.m @ 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 ad6de007e7f6
children f2988a63c3aa
comparison
equal deleted inserted replaced
990:1066bb31bc95 991:a99f00896b8e
1 classdef Rungekutta4SecondOrder < time.Timestepper 1 classdef Rungekutta4SecondOrder < time.Timestepper
2 properties 2 properties
3 F 3 F
4 dt 4 dt
5 t 5 t, n
6 n 6 v, v_t
7
8 G % RHS for rewritten system
9 w
10 end 7 end
11 8
12 9
13 methods 10 methods
14 % Create a time stepper for 11 % Create a time stepper for
18 obj.F = F; 15 obj.F = F;
19 obj.dt = dt; 16 obj.dt = dt;
20 obj.t = t0; 17 obj.t = t0;
21 obj.n = 0; 18 obj.n = 0;
22 19
23 m = length(v0); 20 obj.v = v0;
24 obj.w = [v0; v0t]; 21 obj.v_t = v0t;
25 obj.G = @(t, w)[
26 w(m+1:end);
27 F(t,w(1:m), w(m+1:end));
28 ];
29 end 22 end
30 23
31 function [v,t] = getV(obj) 24 function [v,t] = getV(obj)
32 v = obj.w(1:end/2); 25 v = obj.v
33 t = obj.t; 26 t = obj.t;
34 end 27 end
35 28
36 function [vt,t] = getVt(obj) 29 function [vt,t] = getVt(obj)
37 vt = obj.w(end/2+1:end); 30 vt = obj.v_t;
38 t = obj.t; 31 t = obj.t;
39 end 32 end
40 33
41 function obj = step(obj) 34 function obj = step(obj)
42 % TODO: Avoid extra storage 35 t = obj.t;
43 w = obj.w; 36 v = obj.v;
37 v_t = obj.v_t;
44 dt = obj.dt; 38 dt = obj.dt;
45 39
46 k1 = obj.G(t, w); 40 k1 = obj.F(t, v, v_t);
47 k2 = obj.G(t + 0.5*dt, w + 0.5*dt*k1); 41 k2 = obj.F(t + 1/2*dt, v + 1/2*dt*v_t, v_t + 1/2*dt*k1);
48 k3 = obj.G(t + 0.5*dt, w + 0.5*dt*k2); 42 k3 = obj.F(t + 1/2*dt, v + 1/2*dt*v_t + 1/4*dt^2*k1, v_t + 1/2*dt*k2);
49 k4 = obj.G(t + dt, w + dt*k3); 43 k4 = obj.F(t + dt, v + dt*v_t + 1/2*dt^2*k2, v_t + dt*k3);
50 44
51 obj.w = w + dt*(1/6)*(k1+2*(k2+k3)+k4); 45 obj.v = v + dt*v_t + dt^2*(1/6)*(k1 + k2 + k3);
46 obj.v_t = v_t + dt*(1/6)*(k1 + 2*k2 + 2*k3 + k4);
52 obj.t = obj.t + obj.dt; 47 obj.t = obj.t + obj.dt;
53 obj.n = obj.n + 1; 48 obj.n = obj.n + 1;
54 end 49 end
55 end 50 end
56
57 51
58 methods (Static) 52 methods (Static)
59 function k = getTimeStep(lambda) 53 function k = getTimeStep(lambda)
60 k = rk4.get_rk4_time_step(lambda); 54 k = rk4.get_rk4_time_step(lambda);
61 end 55 end
62 end 56 end
63
64 end 57 end