Partial differential equations
Wave equation - explicit finite differences
Ilustration, how stability of the explicit method depends on the step-length.
Save the following program with an example to a file name.m and run it in Matlab:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% explicit finite differences for wave equation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
c = 2; % wave speed
h = 0.2; % step in space
a = -1; b = 1; % interval of solution (in space)
xh = a:h:b; % division of the interval with step h
n = length(xh); % the number of nodes
f0 = 2*xh(2:n-1); % right hand side: f0(x,t) = 2*x
U0 = 2*xh.^2; % initial condition: u0 = 2*x*x
dU0 = (ones(1,n) - xh).*sin(pi*xh/2); % initial condition: du0/dx
hold off
plot(xh,U0,'g') % graph of initial solution
hold on
tau = 0.08; % step in time
sig = c*tau/h; % coefficient sigma used at finite diff. method
s = sig^2; % all formulas use sigma squared only
% the first time level computed from initial conditions:
U1(2:n-1) = U0(2:n-1) + tau * dU0(2:n-1);
U1(1) = 2*exp(-tau); % b.c. at left - time dependent
U1(n) = 2; % b.c. at right - constant
plot(xh,U1)
% cycle for time levels
disp('Press a Space tab for the next time level ... ');
for k = 2:8
U2(2:n-1) = s*(U1(1:n-2)+U1(3:n))+2*(1-s)*U1(2:n-1)-U0(2:n-1)+tau^2*f0;
U2(1) = 2*exp(-k*tau); % b.c. at left
U2(n) = 2; % b.c. at right
pause
plot(xh,U2)
U0 = U1;
U1 = U2;
end
disp('The end.');
disp('');
% change the time step and compute once again
disp('Now the same with larger time-step:');
disp('Press a Space tab for the next time level ... ');
U0 = 2*xh.^2; % initial condition: u0 = 2*x*x
tau = 0.16; % larger time-step
sig = c*tau/h; % recompute sigma
s = sig^2;
% the first time level computed from initial conditions:
U1(2:n-1) = U0(2:n-1) + tau * dU0(2:n-1);
U1(1) = 2*exp(-tau); % b.c. at left - time dependent
U1(n) = 2; % b.c. at right - constant
plot(xh,U1)
for k = 2:4
U2(2:n-1) = s*(U1(1:n-2)+U1(3:n))+2*(1-s)*U1(2:n-1)-U0(2:n-1)+tau^2*f0;
U2(1) = 2*exp(-k*tau); % b.c. at left
U2(n) = 2; % b.c. at right
pause
plot(xh,U2,'r')
U0 = U1;
U1 = U2;
end
disp('The end.');
%%%%%%%%%%%%%%%%%%
% end of program
%%%%%%%%%%%%%%%%%%