Mercurial > repos > public > sbplib
comparison +time/Cdiff.m @ 1113:47e86b5270ad feature/timesteppers
Change name of property k to dt in time.Timestepper
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 10 Apr 2019 22:40:55 +0200 |
parents | 7a5e770974ed |
children |
comparison
equal
deleted
inserted
replaced
1112:835c8fa456ec | 1113:47e86b5270ad |
---|---|
1 classdef Cdiff < time.Timestepper | 1 classdef Cdiff < time.Timestepper |
2 properties | 2 properties |
3 A, B, C | 3 A, B, C |
4 AA, BB, CC | 4 AA, BB, CC |
5 G | 5 G |
6 k | 6 dt |
7 t | 7 t |
8 v, v_prev | 8 v, v_prev |
9 n | 9 n |
10 end | 10 end |
11 | 11 |
13 methods | 13 methods |
14 % Solves | 14 % Solves |
15 % A*v_tt + B*v_t + C*v = G(t) | 15 % A*v_tt + B*v_t + C*v = G(t) |
16 % v(t0) = v0 | 16 % v(t0) = v0 |
17 % v_t(t0) = v0t | 17 % v_t(t0) = v0t |
18 % starting at time t0 with timestep k | 18 % starting at time t0 with timestep dt |
19 % Using | 19 % Using |
20 % A*Dp*Dm*v_n + B*D0*v_n + C*v_n = G(t_n) | 20 % A*Dp*Dm*v_n + B*D0*v_n + C*v_n = G(t_n) |
21 function obj = Cdiff(A, B, C, G, v0, v0t, k, t0) | 21 function obj = Cdiff(A, B, C, G, v0, v0t, dt, t0) |
22 m = length(v0); | 22 m = length(v0); |
23 default_arg('A', speye(m)); | 23 default_arg('A', speye(m)); |
24 default_arg('B', sparse(m,m)); | 24 default_arg('B', sparse(m,m)); |
25 default_arg('G', @(t) sparse(m,1)); | 25 default_arg('G', @(t) sparse(m,1)); |
26 default_arg('t0', 0); | 26 default_arg('t0', 0); |
29 obj.B = B; | 29 obj.B = B; |
30 obj.C = C; | 30 obj.C = C; |
31 obj.G = G; | 31 obj.G = G; |
32 | 32 |
33 % Rewrite as AA*v_(n+1) + BB*v_n + CC*v_(n-1) = G(t_n) | 33 % Rewrite as AA*v_(n+1) + BB*v_n + CC*v_(n-1) = G(t_n) |
34 obj.AA = A/k^2 + B/(2*k); | 34 obj.AA = A/dt^2 + B/(2*dt); |
35 obj.BB = -2*A/k^2 + C; | 35 obj.BB = -2*A/dt^2 + C; |
36 obj.CC = A/k^2 - B/(2*k); | 36 obj.CC = A/dt^2 - B/(2*dt); |
37 | 37 |
38 obj.k = k; | 38 obj.dt = dt; |
39 obj.v_prev = v0; | 39 obj.v_prev = v0; |
40 obj.v = v0 + k*v0t; | 40 obj.v = v0 + dt*v0t; |
41 obj.t = t0+k; | 41 obj.t = t0+dt; |
42 obj.n = 1; | 42 obj.n = 1; |
43 end | 43 end |
44 | 44 |
45 function [v,t] = getV(obj) | 45 function [v,t] = getV(obj) |
46 v = obj.v; | 46 v = obj.v; |
47 t = obj.t; | 47 t = obj.t; |
48 end | 48 end |
49 | 49 |
50 function [vt,t] = getVt(obj) | 50 function [vt,t] = getVt(obj) |
51 vt = (obj.v-obj.v_prev)/obj.k; % Could be improved using u_tt = f(u)) | 51 vt = (obj.v-obj.v_prev)/obj.dt; % Could be improved using u_tt = f(u)) |
52 t = obj.t; | 52 t = obj.t; |
53 end | 53 end |
54 | 54 |
55 function E = getEnergy(obj) | 55 function E = getEnergy(obj) |
56 v = obj.v; | 56 v = obj.v; |
57 vp = obj.v_prev; | 57 vp = obj.v_prev; |
58 vt = (obj.v - obj.v_prev)/obj.k; | 58 vt = (obj.v - obj.v_prev)/obj.dt; |
59 | 59 |
60 E = vt'*obj.A*vt + v'*obj.C*vp; | 60 E = vt'*obj.A*vt + v'*obj.C*vp; |
61 end | 61 end |
62 | 62 |
63 function obj = step(obj) | 63 function obj = step(obj) |
64 v_next = obj.AA\(-obj.BB*obj.v - obj.CC*obj.v_prev + obj.G(obj.t)); | 64 v_next = obj.AA\(-obj.BB*obj.v - obj.CC*obj.v_prev + obj.G(obj.t)); |
65 | 65 |
66 obj.v_prev = obj.v; | 66 obj.v_prev = obj.v; |
67 obj.v = v_next; | 67 obj.v = v_next; |
68 obj.t = obj.t + obj.k; | 68 obj.t = obj.t + obj.dt; |
69 obj.n = obj.n + 1; | 69 obj.n = obj.n + 1; |
70 end | 70 end |
71 end | 71 end |
72 end | 72 end |