Mercurial > repos > public > sbplib
comparison +time/Rungekutta4SecondOrder.m @ 886:8894e9c49e40 feature/timesteppers
Merge with default for latest changes
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Thu, 15 Nov 2018 16:36:21 -0800 |
parents | b5e5b195da1e ae905a11e32c |
children | 50d5a3843099 |
comparison
equal
deleted
inserted
replaced
816:b5e5b195da1e | 886:8894e9c49e40 |
---|---|
13 n | 13 n |
14 end | 14 end |
15 | 15 |
16 | 16 |
17 methods | 17 methods |
18 % Solves u_tt = Du + Eu_t + S by | |
19 % Rewriting on first order form: | |
20 % w_t = M*w + C(t) | |
21 % where | |
22 % M = [ | |
23 % 0, I; | |
24 % D, E; | |
25 % ] | |
26 % and | |
27 % C(t) = [ | |
28 % 0; | |
29 % S(t) | |
30 % ] | |
31 % D, E, S can either all be constants or all be function handles, | |
32 % They can also be omitted by setting them equal to the empty matrix. | |
18 function obj = Rungekutta4SecondOrder(D, E, S, k, t0, v0, v0t) | 33 function obj = Rungekutta4SecondOrder(D, E, S, k, t0, v0, v0t) |
19 obj.D = D; | 34 obj.D = D; |
20 obj.E = E; | 35 obj.E = E; |
21 obj.S = S; | 36 obj.S = S; |
22 obj.m = length(v0); | 37 obj.m = length(v0); |
23 obj.n = 0; | 38 obj.n = 0; |
24 | 39 |
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 | 40 |
29 if S == 0 | 41 if isa(D, 'function_handle') || isa(E, 'function_handle') || isa(S, 'function_handle') |
30 obj.C = zeros(2*obj.m,1); | 42 default_arg('D', @(t)sparse(obj.m, obj.m)); |
43 default_arg('E', @(t)sparse(obj.m, obj.m)); | |
44 default_arg('S', @(t)sparse(obj.m, 1) ); | |
45 | |
46 if ~isa(D, 'function_handle') | |
47 D = @(t)D; | |
48 end | |
49 if ~isa(E, 'function_handle') | |
50 E = @(t)E; | |
51 end | |
52 if ~isa(S, 'function_handle') | |
53 S = @(t)S; | |
54 end | |
55 | |
56 obj.k = k; | |
57 obj.t = t0; | |
58 obj.w = [v0; v0t]; | |
59 | |
60 % Avoid matrix formulation because it is VERY slow | |
61 obj.F = @(w,t)[ | |
62 w(obj.m+1:end); | |
63 D(t)*w(1:obj.m) + E(t)*w(obj.m+1:end) + S(t); | |
64 ]; | |
31 else | 65 else |
32 obj.C = [zeros(obj.m,1), S]; | 66 |
67 default_arg('D', sparse(obj.m, obj.m)); | |
68 default_arg('E', sparse(obj.m, obj.m)); | |
69 default_arg('S', sparse(obj.m, 1) ); | |
70 | |
71 I = speye(obj.m); | |
72 O = sparse(obj.m,obj.m); | |
73 | |
74 obj.M = [ | |
75 O, I; | |
76 D, E; | |
77 ]; | |
78 obj.C = [ | |
79 zeros(obj.m,1); | |
80 S; | |
81 ]; | |
82 | |
83 obj.k = k; | |
84 obj.t = t0; | |
85 obj.w = [v0; v0t]; | |
86 | |
87 obj.F = @(w,t)(obj.M*w + obj.C); | |
33 end | 88 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 | 89 end |
41 | 90 |
42 function [v,t] = getV(obj) | 91 function [v,t] = getV(obj) |
43 v = obj.w(1:end/2); | 92 v = obj.w(1:end/2); |
44 t = obj.t; | 93 t = obj.t; |