Mercurial > repos > public > sbplib
annotate +time/Rungekutta4SecondOrder.m @ 985:ad6de007e7f6 feature/timesteppers
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 08 Jan 2019 12:34:29 +0100 |
parents | 0585a2ee7ee7 |
children | a99f00896b8e |
rev | line source |
---|---|
0 | 1 classdef Rungekutta4SecondOrder < time.Timestepper |
2 properties | |
3 F | |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
4 dt |
0 | 5 t |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
6 n |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
7 |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
8 G % RHS for rewritten system |
0 | 9 w |
10 end | |
11 | |
12 | |
13 methods | |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
14 % Create a time stepper for |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
15 % v_tt = F(t,v,v_t), v(t0) = v0, v_t(t0) = v0t |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
16 % with step size dt, by rewriting on first order form |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
17 function obj = Rungekutta4SecondOrder(F, dt, t0, v0, v0t) |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
18 obj.F = F; |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
19 obj.dt = dt; |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
20 obj.t = t0; |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
21 obj.n = 0; |
0 | 22 |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
23 m = length(v0); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
24 obj.w = [v0; v0t]; |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
25 obj.G = @(t, w)[ |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
26 w(m+1:end); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
27 F(t,w(1:m), w(m+1:end)); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
28 ]; |
0 | 29 end |
30 | |
31 function [v,t] = getV(obj) | |
32 v = obj.w(1:end/2); | |
33 t = obj.t; | |
34 end | |
35 | |
36 function [vt,t] = getVt(obj) | |
37 vt = obj.w(end/2+1:end); | |
38 t = obj.t; | |
39 end | |
40 | |
41 function obj = step(obj) | |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
42 % TODO: Avoid extra storage |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
43 w = obj.w; |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
44 dt = obj.dt; |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
45 |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
46 k1 = obj.G(t, w); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
47 k2 = obj.G(t + 0.5*dt, w + 0.5*dt*k1); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
48 k3 = obj.G(t + 0.5*dt, w + 0.5*dt*k2); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
49 k4 = obj.G(t + dt, w + dt*k3); |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
50 |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
51 obj.w = w + dt*(1/6)*(k1+2*(k2+k3)+k4); |
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
52 obj.t = obj.t + obj.dt; |
0 | 53 obj.n = obj.n + 1; |
54 end | |
55 end | |
56 | |
57 | |
58 methods (Static) | |
59 function k = getTimeStep(lambda) | |
60 k = rk4.get_rk4_time_step(lambda); | |
61 end | |
62 end | |
63 | |
64 end |