0
|
1 classdef Rk4SecondOrderNonlin < time.Timestepper
|
|
2 properties
|
|
3 F
|
|
4 k
|
|
5 t
|
|
6 w
|
|
7 m
|
|
8
|
|
9 D
|
|
10 E
|
|
11 S
|
|
12
|
|
13 n
|
|
14 end
|
|
15
|
|
16
|
|
17 methods
|
|
18 function obj = Rk4SecondOrderNonlin(D, E, S, k, t0, v0, v0t)
|
|
19
|
|
20 if S == 0
|
|
21 S = @(v,t)0;
|
|
22 end
|
|
23
|
|
24 if E == 0
|
|
25 E = @(v,t)0;
|
|
26 end
|
|
27
|
|
28 obj.k = k;
|
|
29 obj.t = t0;
|
|
30 obj.w = [v0; v0t];
|
|
31
|
|
32 m = length(v0);
|
|
33 function wt = F(w,t)
|
|
34 v = w(1:m);
|
|
35 vt = w(m+1:end);
|
|
36
|
|
37 % Def: w = [v; vt]
|
|
38 wt(1:m,1) = vt;
|
|
39 wt(m+1:2*m,1) = D(v)*v + E(v)*vt + S(v,t);
|
|
40
|
|
41 end
|
|
42
|
|
43 obj.F = @F;
|
|
44 obj.D = D;
|
|
45 obj.E = E;
|
|
46 obj.S = S;
|
|
47 obj.m = m;
|
|
48 end
|
|
49
|
|
50 function [v,t] = getV(obj)
|
|
51 v = obj.w(1:end/2);
|
|
52 t = obj.t;
|
|
53 end
|
|
54
|
|
55 function [vt,t] = getVt(obj)
|
|
56 vt = obj.w(end/2+1:end);
|
|
57 t = obj.t;
|
|
58 end
|
|
59
|
|
60 function obj = step(obj)
|
|
61 obj.w = time.rk4.rungekutta_4(obj.w, obj.t, obj.k, obj.F);
|
|
62 obj.t = obj.t + obj.k;
|
|
63 obj.n = obj.n + 1;
|
|
64 end
|
|
65 end
|
|
66
|
|
67
|
|
68 methods (Static)
|
|
69 function k = getTimeStep(lambda)
|
|
70 k = rk4.get_rk4_time_step(lambda);
|
|
71 end
|
|
72 end
|
|
73
|
|
74 end |