-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathCh1Q19FiniteDiffs.m
62 lines (50 loc) · 1.75 KB
/
Ch1Q19FiniteDiffs.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
%% Finite differences for the advection-diffusion equation
%
% - D u_xx + v u_x = 1
%
% on the domain x=[0,1],
% with boundary conditions u(0)=u(1)=0.
%
% Computational Science and Engineering
% Chapter 1, Section 1.2, p 25, Question 19.
%
clear
clc
close all
% try experimenting with parameters D, v, and N.
% D=1; v=1;
D=0.05; v=0.2;
% D=0.05; v=2; % boundary layer
N=5+1; % mesh points
xL=0; xR=1; h=(xR-xL)/(N-1); % h is the spatial discretization size
x=xL:h:xR; x=x';
% True solution:
r=v/D;
C=1/(v*(exp(r)-1));
uTrue=x/v+C*(1-exp(r*x));
% diffusion matrix
e = ones(N,1); K = spdiags([e -2*e e], -1:1, N, N); K=D*K/h^2;
%K=full(K) % uncomment this line to see the matrix K (it will be easier if N is small)
% centered difference matrix
Del0 = spdiags([-e e], [-1 1], N, N); Del0=v*Del0/(2*h);
%Del0=full(Del0)
% upwind difference matrix
DelPlus = spdiags([-e e], 0:1, N, N); DelPlus=v*DelPlus/h;
%DelPlus=full(DelPlus)
%% Linear solve
A=Del0-K; % centered advection matrix, plus diffusion matrix
A(1,:)=0; A(end,:)=0; A(1,1)=1; A(end,end)=1; % boundary conditions
b=ones(size(x)); b(1)=0; b(end)=0; % boundary conditions
u=A\b; % solve with backslash (centered)
A=DelPlus-K; % upwind advection matrix, plus diffusion matrix
A(1,:)=0; A(end,:)=0; A(1,1)=1; A(end,end)=1; % boundary conditions
U=A\b; % solve with backslash (upwind)
%% plot results
FS='FontSize';
figure(1)
plot(x,u, x,U, '--', x, uTrue, '+', 'LineWidth', 2)
title({'- D u_{xx} + v u_x = 1 ', [' D=', num2str(D), ' v=', num2str(v), ' h=', num2str(h)]}, FS, 16)
legend('u centered', 'U upwind', 'true solution')
xlabel('x', FS, 16)
ylabel('u', FS, 16)
disp('Finished.')