comparison +time/Rungekutta4.m @ 983:b89379fb0814 feature/timesteppers

Convert Rungekutta4 to take F(t,y) instead of a matrix
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 08 Jan 2019 12:07:57 +0100
parents f5e14e5986b5
children 0585a2ee7ee7
comparison
equal deleted inserted replaced
979:7a5e770974ed 983:b89379fb0814
1 classdef Rungekutta4 < time.Timestepper 1 classdef Rungekutta4 < time.Timestepper
2 properties 2 properties
3 D
4 S
5 F 3 F
6 k 4 dt
7 t 5 t
8 v 6 v
9 m
10 n 7 n
11 end 8 end
12 9
13 10
14 methods 11 methods
15 function obj = Rungekutta4(D, S, k, t0, v0) 12 % Create a time stepper for
16 obj.D = D; 13 % v_t = F(t,v), v(t0) = v0
17 obj.k = k; 14 % with step size dt.
15 function obj = Rungekutta4(F, dt, t0, v0)
16 obj.F = F;
17 obj.dt = dt;
18 obj.t = t0; 18 obj.t = t0;
19 obj.v = v0; 19 obj.v = v0;
20 obj.m = length(v0);
21 obj.n = 0; 20 obj.n = 0;
22
23 if S == 0
24 obj.S = zeros(obj.m,1);
25 else
26 obj.S = S;
27 end
28
29 if S == 0
30 obj.F = @(v,t)(obj.D*v);
31 else
32 obj.F = @(v,t)(obj.D*v + obj.S);
33 end
34 end 21 end
35 22
36 function [v,t] = getV(obj) 23 function [v,t] = getV(obj)
37 v = obj.v; 24 v = obj.v;
38 t = obj.t; 25 t = obj.t;
39 end 26 end
40 27
41 function obj = step(obj) 28 function obj = step(obj)
42 obj.v = time.rk.rungekutta_4(obj.v, obj.t, obj.k, obj.F); 29 obj.v = time.rk.rungekutta_4(obj.v, obj.t, obj.dt, obj.F);
43 obj.t = obj.t + obj.k; 30 obj.t = obj.t + obj.dt;
44 obj.n = obj.n + 1; 31 obj.n = obj.n + 1;
45 end 32 end
46 end 33 end
47 34
48
49 methods (Static) 35 methods (Static)
50 function k = getTimeStep(lambda) 36 function dt = getTimeStep(lambda)
51 k = rk4.get_rk4_time_step(lambda); 37 dt = rk4.get_rk4_time_step(lambda);
52 end 38 end
53 end 39 end
54
55 end 40 end