Mercurial > repos > public > sbplib
annotate +time/Rungekutta4SecondOrder.m @ 13:b18d3d201a71
Fixed initialization of step counter in timesteppers.
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Tue, 22 Sep 2015 08:41:28 +0200 |
| parents | 48b6fb693025 |
| children | e7e73173d44d b5e5b195da1e |
| rev | line source |
|---|---|
| 0 | 1 classdef Rungekutta4SecondOrder < time.Timestepper |
| 2 properties | |
| 3 F | |
| 4 k | |
| 5 t | |
| 6 w | |
| 7 m | |
| 8 D | |
| 9 E | |
| 10 S | |
| 11 M | |
| 12 C | |
| 13 n | |
| 14 end | |
| 15 | |
| 16 | |
| 17 methods | |
| 18 function obj = Rungekutta4SecondOrder(D, E, S, k, t0, v0, v0t) | |
| 19 obj.D = D; | |
| 20 obj.E = E; | |
| 21 obj.S = S; | |
| 22 obj.m = length(v0); | |
|
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
23 obj.n = 0; |
| 0 | 24 |
| 25 I = speye(obj.m); | |
| 26 O = sparse(obj.m,obj.m); | |
| 27 obj.M = [O, I; D, E*I]; % Multiply with I to allow 0 as input. | |
| 28 | |
| 29 if S == 0 | |
| 30 obj.C = zeros(2*obj.m,1); | |
| 31 else | |
| 32 obj.C = [zeros(obj.m,1), S]; | |
| 33 end | |
| 34 | |
| 35 obj.k = k; | |
| 36 obj.t = t0; | |
| 37 obj.w = [v0; v0t]; | |
| 38 | |
| 39 obj.F = @(w,t)(obj.M*w + obj.C); | |
| 40 end | |
| 41 | |
| 42 function [v,t] = getV(obj) | |
| 43 v = obj.w(1:end/2); | |
| 44 t = obj.t; | |
| 45 end | |
| 46 | |
| 47 function [vt,t] = getVt(obj) | |
| 48 vt = obj.w(end/2+1:end); | |
| 49 t = obj.t; | |
| 50 end | |
| 51 | |
| 52 function obj = step(obj) | |
| 53 obj.w = time.rk4.rungekutta_4(obj.w, obj.t, obj.k, obj.F); | |
| 54 obj.t = obj.t + obj.k; | |
| 55 obj.n = obj.n + 1; | |
| 56 end | |
| 57 end | |
| 58 | |
| 59 | |
| 60 methods (Static) | |
| 61 function k = getTimeStep(lambda) | |
| 62 k = rk4.get_rk4_time_step(lambda); | |
| 63 end | |
| 64 end | |
| 65 | |
| 66 end |
