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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 classdef Rungekutta4SecondOrder < time.Timestepper
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 properties
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 w
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 function [v,t] = getV(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 v = obj.w(1:end/2);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 function [vt,t] = getVt(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 vt = obj.w(end/2+1:end);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 obj.n = obj.n + 1;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 methods (Static)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 function k = getTimeStep(lambda)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 k = rk4.get_rk4_time_step(lambda);
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
61 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
62 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 end