Mercurial > repos > public > sbplib
annotate +time/ExplicitRungeKuttaDiscreteData.m @ 690:9c3c180c7ed3 feature/d1_staggered
Implement RK4 for discrete data.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Tue, 06 Mar 2018 11:59:43 -0800 |
parents | |
children | 521076a6ffa5 |
rev | line source |
---|---|
690
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
1 classdef ExplicitRungeKuttaDiscreteData < time.Timestepper |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
2 properties |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
3 D |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
4 S % Function handle for time-dependent data |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
5 data % Matrix of data vectors, one column per stage |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
6 F |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
7 k |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
8 t |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
9 v |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
10 m |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
11 n |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
12 order |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
13 a, b, c, s % Butcher tableau |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
14 K % Stage rates |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
15 U % Stage approximations |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
16 T % Stage times |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
17 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
18 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
19 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
20 methods |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
21 function obj = ExplicitRungeKuttaDiscreteData(D, S, data, k, t0, v0, order) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
22 default_arg('order', 4); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
23 default_arg('S', []); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
24 default_arg('data', []); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
25 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
26 obj.D = D; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
27 obj.S = S; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
28 obj.k = k; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
29 obj.t = t0; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
30 obj.v = v0; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
31 obj.m = length(v0); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
32 obj.n = 0; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
33 obj.order = order; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
34 obj.data = data; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
35 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
36 switch order |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
37 case 4 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
38 [obj.a, obj.b, obj.c, obj.s] = time.rkparameters.rk4(); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
39 otherwise |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
40 error('That RK method is not available'); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
41 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
42 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
43 obj.K = sparse(obj.m, obj.s); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
44 obj.U = sparse(obj.m, obj.s); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
45 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
46 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
47 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
48 function [v,t,U,T] = getV(obj) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
49 v = obj.v; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
50 t = obj.t; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
51 U = obj.U; % Stage approximations in previous time step. |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
52 T = obj.T; % Stage times in previous time step. |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
53 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
54 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
55 function [a,b,c,s] = getTableau(obj) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
56 a = obj.a; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
57 b = obj.b; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
58 c = obj.c; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
59 s = obj.s; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
60 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
61 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
62 function obj = step(obj) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
63 v = obj.v; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
64 a = obj.a; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
65 b = obj.b; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
66 c = obj.c; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
67 s = obj.s; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
68 S = obj.S; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
69 dt = obj.k; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
70 K = obj.K; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
71 U = obj.U; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
72 D = obj.D; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
73 data = obj.data; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
74 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
75 for i = 1:s |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
76 U(:,i) = v; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
77 for j = 1:i-1 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
78 U(:,i) = U(:,i) + dt*a(i,j)*K(:,j); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
79 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
80 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
81 K(:,i) = D*U(:,i); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
82 obj.T(i) = obj.t + c(i)*dt; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
83 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
84 % Data from continuos function and discrete time-points. |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
85 if ~isempty(S) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
86 K(:,i) = K(:,i) + S(obj.T(i)); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
87 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
88 if ~isempty(data) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
89 K(:,i) = K(:,i) + data(:,obj.n*s + i); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
90 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
91 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
92 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
93 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
94 obj.v = v + dt*K*b; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
95 obj.t = obj.t + dt; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
96 obj.n = obj.n + 1; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
97 obj.U = U; |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
98 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
99 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
100 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
101 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
102 methods (Static) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
103 function k = getTimeStep(lambda) |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
104 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
105 switch obj.order |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
106 case 4 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
107 k = rk4.get_rk4_time_step(lambda); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
108 otherwise |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
109 error('Time-step function not available for this order'); |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
110 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
111 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
112 end |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
113 |
9c3c180c7ed3
Implement RK4 for discrete data.
Martin Almquist <malmquist@stanford.edu>
parents:
diff
changeset
|
114 end |