Mercurial > repos > public > sbplib
annotate +time/Rungekutta4.m @ 984:0585a2ee7ee7 feature/timesteppers
Inline the rk.rungekutta_4 function.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 08 Jan 2019 12:19:33 +0100 |
parents | b89379fb0814 |
children | a99f00896b8e |
rev | line source |
---|---|
0 | 1 classdef Rungekutta4 < time.Timestepper |
2 properties | |
3 F | |
983
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
4 dt |
0 | 5 t |
6 v | |
7 n | |
8 end | |
9 | |
10 | |
11 methods | |
983
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
12 % Create a time stepper for |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
13 % v_t = F(t,v), v(t0) = v0 |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
14 % with step size dt. |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
15 function obj = Rungekutta4(F, dt, t0, v0) |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
16 obj.F = F; |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
17 obj.dt = dt; |
0 | 18 obj.t = t0; |
19 obj.v = v0; | |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
20 obj.n = 0; |
0 | 21 end |
22 | |
23 function [v,t] = getV(obj) | |
24 v = obj.v; | |
25 t = obj.t; | |
26 end | |
27 | |
28 function obj = step(obj) | |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
29 v = obj.v; |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
30 dt = obj.dt; |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
31 |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
32 k1 = obj.F(t, v); |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
33 k2 = obj.F(t + 0.5*dt, v + 0.5*dt*k1); |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
34 k3 = obj.F(t + 0.5*dt, v + 0.5*dt*k2); |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
35 k4 = obj.F(t + dt, v + dt*k3); |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
36 |
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
983
diff
changeset
|
37 obj.v = v + dt*(1/6)*(k1+2*(k2+k3)+k4); |
983
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
38 obj.t = obj.t + obj.dt; |
0 | 39 obj.n = obj.n + 1; |
40 end | |
41 end | |
42 | |
43 methods (Static) | |
983
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
44 function dt = getTimeStep(lambda) |
b89379fb0814
Convert Rungekutta4 to take F(t,y) instead of a matrix
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
45 dt = rk4.get_rk4_time_step(lambda); |
0 | 46 end |
47 end | |
48 end |