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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 classdef Cdiff < time.Timestepper
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 k
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 t
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 v
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 v_prev
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 n
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 function [v,t] = getV(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 v = obj.v;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 function [vt,t] = getVt(obj)
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u))
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 t = obj.t;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
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
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69 obj.t = obj.t + obj.k;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
70 obj.n = obj.n + 1;
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72 end
48b6fb693025 Initial commit.
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 end