Mercurial > repos > public > sbplib
annotate +time/Rungekutta4SecondOrder.m @ 345:7b5ef8b89268 feature/beams
Rungekutta bug fixes.
| author | Jonatan Werpers <jonatan@werpers.com> |
|---|---|
| date | Wed, 16 Nov 2016 15:39:16 -0800 |
| parents | e7e73173d44d |
| children | ae905a11e32c |
| 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 | |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
18 % Solves u_tt = Du + Eu_t + S |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
19 % D, E, S can either all be constants or all be function handles, |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
20 % They can also be omitted by setting them equal to the empty matrix. |
| 0 | 21 function obj = Rungekutta4SecondOrder(D, E, S, k, t0, v0, v0t) |
| 22 obj.D = D; | |
| 23 obj.E = E; | |
| 24 obj.S = S; | |
| 25 obj.m = length(v0); | |
|
13
b18d3d201a71
Fixed initialization of step counter in timesteppers.
Jonatan Werpers <jonatan@werpers.com>
parents:
0
diff
changeset
|
26 obj.n = 0; |
| 0 | 27 |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
28 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
29 if isa(D, 'function_handle') || isa(E, 'function_handle') || isa(S, 'function_handle') |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
30 default_arg('D', @(t)sparse(obj.m, obj.m)); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
31 default_arg('E', @(t)sparse(obj.m, obj.m)); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
32 default_arg('S', @(t)sparse(obj.m, 1) ); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
33 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
34 if ~isa(D, 'function_handle') |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
35 D = @(t)D; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
36 end |
|
345
7b5ef8b89268
Rungekutta bug fixes.
Jonatan Werpers <jonatan@werpers.com>
parents:
222
diff
changeset
|
37 if ~isa(E, 'function_handle') |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
38 E = @(t)E; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
39 end |
|
345
7b5ef8b89268
Rungekutta bug fixes.
Jonatan Werpers <jonatan@werpers.com>
parents:
222
diff
changeset
|
40 if ~isa(S, 'function_handle') |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
41 S = @(t)S; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
42 end |
| 0 | 43 |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
44 I = speye(obj.m); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
45 O = sparse(obj.m,obj.m); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
46 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
47 obj.M = @(t)[ |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
48 O, I; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
49 D(t), E(t); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
50 ]; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
51 obj.C = @(t)[ |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
52 zeros(obj.m,1); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
53 S(t); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
54 ]; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
55 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
56 obj.k = k; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
57 obj.t = t0; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
58 obj.w = [v0; v0t]; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
59 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
60 obj.F = @(w,t)(obj.M(t)*w + obj.C(t)); |
| 0 | 61 else |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
62 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
63 default_arg('D', sparse(obj.m, obj.m)); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
64 default_arg('E', sparse(obj.m, obj.m)); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
65 default_arg('S', sparse(obj.m, 1) ); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
66 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
67 I = speye(obj.m); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
68 O = sparse(obj.m,obj.m); |
| 0 | 69 |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
70 obj.M = [ |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
71 O, I; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
72 D, E; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
73 ]; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
74 obj.C = [ |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
75 zeros(obj.m,1); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
76 S; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
77 ]; |
| 0 | 78 |
|
222
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
79 obj.k = k; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
80 obj.t = t0; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
81 obj.w = [v0; v0t]; |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
82 |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
83 obj.F = @(w,t)(obj.M*w + obj.C); |
|
e7e73173d44d
time.Rungekutta4SecondOrder: Started adding code to allow timedependent D,E,S. Might be buggy.
Jonatan Werpers <jonatan@werpers.com>
parents:
13
diff
changeset
|
84 end |
| 0 | 85 end |
| 86 | |
| 87 function [v,t] = getV(obj) | |
| 88 v = obj.w(1:end/2); | |
| 89 t = obj.t; | |
| 90 end | |
| 91 | |
| 92 function [vt,t] = getVt(obj) | |
| 93 vt = obj.w(end/2+1:end); | |
| 94 t = obj.t; | |
| 95 end | |
| 96 | |
| 97 function obj = step(obj) | |
| 98 obj.w = time.rk4.rungekutta_4(obj.w, obj.t, obj.k, obj.F); | |
| 99 obj.t = obj.t + obj.k; | |
| 100 obj.n = obj.n + 1; | |
| 101 end | |
| 102 end | |
| 103 | |
| 104 | |
| 105 methods (Static) | |
| 106 function k = getTimeStep(lambda) | |
| 107 k = rk4.get_rk4_time_step(lambda); | |
| 108 end | |
| 109 end | |
| 110 | |
| 111 end |
