Mercurial > repos > public > sbplib
annotate +time/Cdiff.m @ 977:c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Mon, 07 Jan 2019 15:56:35 +0100 |
parents | 151ab2b5a686 |
children | 1a30dbe99c7c |
rev | line source |
---|---|
0 | 1 classdef Cdiff < time.Timestepper |
2 properties | |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
3 A, B, C |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
4 AA, BB, CC |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
5 G |
0 | 6 k |
7 t | |
8 v | |
9 v_prev | |
10 n | |
11 end | |
12 | |
13 | |
14 methods | |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
15 % Solves |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
16 % A*v_tt + B*v_t + C*v = G(t) |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
17 % v(t0) = v0 |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
18 % v_t(t0) = v0t |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
19 % starting at time t0 with timestep k |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
20 % Using |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
21 % A*Dp*Dm*v_n + B*D0*v_n + C*v_n = G(t_n) |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
22 function obj = Cdiff(A, B, C, G, v0, v0t, k, t0) |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
23 m = length(v0); |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
24 default_arg('A', speye(m)); |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
25 default_arg('B', sparse(m,m)); |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
26 default_arg('G', @(t) sparse(m,1)); |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
27 default_arg('t0', 0); |
0 | 28 |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
29 obj.A = A; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
30 obj.B = B; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
31 obj.C = C; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
32 obj.G = G; |
227
151ab2b5a686
Added a timedependent version of Cdiff.
Jonatan Werpers <jonatan@werpers.com>
parents:
142
diff
changeset
|
33 |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
34 % Rewrite as AA*v_(n+1) + BB*v_n + CC*v_(n-1) = G(t_n) |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
35 obj.AA = A/k^2 + B/2/k; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
36 obj.BB = -2*A/k^2 + C; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
37 obj.CC = A/k^2 - B/2/k; |
227
151ab2b5a686
Added a timedependent version of Cdiff.
Jonatan Werpers <jonatan@werpers.com>
parents:
142
diff
changeset
|
38 |
0 | 39 obj.k = k; |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
40 obj.v_prev = v0; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
41 obj.v = v0 + k*v0t; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
42 obj.t = t0+k; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
43 obj.n = 1; |
0 | 44 end |
45 | |
46 function [v,t] = getV(obj) | |
47 v = obj.v; | |
48 t = obj.t; | |
49 end | |
50 | |
51 function [vt,t] = getVt(obj) | |
52 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u)) | |
53 t = obj.t; | |
54 end | |
55 | |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
56 function E = getEnergy(obj) |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
57 v = obj.v; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
58 vp = obj.v_prev; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
59 vt = (obj.v - obj.v_prev)/obj.k; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
60 |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
61 E = vt'*obj.A*vt + v'*obj.C*vp; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
62 end |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
63 |
0 | 64 function obj = step(obj) |
977
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
65 v_next = obj.AA\(-obj.BB*obj.v - obj.CC*obj.v_prev + obj.G(obj.t)); |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
66 |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
67 obj.v_prev = obj.v; |
c9009d5a3101
Refactor time.Cdiff and add getEnergyMethod
Jonatan Werpers <jonatan@werpers.com>
parents:
227
diff
changeset
|
68 obj.v = v_next; |
0 | 69 obj.t = obj.t + obj.k; |
70 obj.n = obj.n + 1; | |
71 end | |
72 end | |
73 end |