Mercurial > repos > public > sbplib
annotate +time/Rungekutta4SecondOrder.m @ 1114:f2988a63c3aa feature/timesteppers
Add tests for time.Rungekutta4 and time.Rungekutta4SecondOrder
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 10 Apr 2019 23:10:13 +0200 |
parents | a99f00896b8e |
children |
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 |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
5 t, n |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
6 v, v_t |
0 | 7 end |
8 | |
9 | |
10 methods | |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
11 % 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
|
12 % 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
|
13 % 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
|
14 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
|
15 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
|
16 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
|
17 obj.t = t0; |
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
18 obj.n = 0; |
0 | 19 |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
20 obj.v = v0; |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
21 obj.v_t = v0t; |
0 | 22 end |
23 | |
24 function [v,t] = getV(obj) | |
1114
f2988a63c3aa
Add tests for time.Rungekutta4 and time.Rungekutta4SecondOrder
Jonatan Werpers <jonatan@werpers.com>
parents:
991
diff
changeset
|
25 v = obj.v; |
0 | 26 t = obj.t; |
27 end | |
28 | |
29 function [vt,t] = getVt(obj) | |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
30 vt = obj.v_t; |
0 | 31 t = obj.t; |
32 end | |
33 | |
34 function obj = step(obj) | |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
35 t = obj.t; |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
36 v = obj.v; |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
37 v_t = obj.v_t; |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
38 dt = obj.dt; |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
39 |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
40 k1 = obj.F(t, v, v_t); |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
41 k2 = obj.F(t + 1/2*dt, v + 1/2*dt*v_t, v_t + 1/2*dt*k1); |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
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); |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
43 k4 = obj.F(t + dt, v + dt*v_t + 1/2*dt^2*k2, v_t + dt*k3); |
984
0585a2ee7ee7
Inline the rk.rungekutta_4 function.
Jonatan Werpers <jonatan@werpers.com>
parents:
889
diff
changeset
|
44 |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
45 obj.v = v + dt*v_t + dt^2*(1/6)*(k1 + k2 + k3); |
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
46 obj.v_t = v_t + dt*(1/6)*(k1 + 2*k2 + 2*k3 + k4); |
985
ad6de007e7f6
Convert Rungekutta4SecondOrder to take F(t,v,v_t) instead of matrices
Jonatan Werpers <jonatan@werpers.com>
parents:
984
diff
changeset
|
47 obj.t = obj.t + obj.dt; |
0 | 48 obj.n = obj.n + 1; |
49 end | |
50 end | |
51 | |
52 methods (Static) | |
53 function k = getTimeStep(lambda) | |
54 k = rk4.get_rk4_time_step(lambda); | |
55 end | |
56 end | |
991
a99f00896b8e
Make Rungekutta4SecondOrder native second order
Jonatan Werpers <jonatan@werpers.com>
parents:
985
diff
changeset
|
57 end |