% waveeqn.m
% Copyright Joel Feldman. 2007. All rights reserved. 

clear all; close all;

% set various values
ell = 10 ;       % length of string
a=0.28  ;        % the left edge of the spike is at a*ell
d=0.3 ;          % the peak of the spike is at d*ell
b=0.32 ;         % the right edge of the spike is at b*ell
c=1.0 ;          % wave equation c (speed of propagation)
dx = 0.05 ;      % spacing in x space for plotting
dt = 0.05 ;      % time step for animation
tfinal = 20 ;    % final time for animation
nModes = 400 ;   % number of Fourier modes
delay = 0.0 ;    % extra time (in seconds) between animation frames 

% compute the Fourier coefficients for the initial position of the string

alpha = zeros(1, nModes) ;
for k = 1:nModes
     alpha(k) = - 2*sin(k*pi*a)/( (d-a)*k*k*pi*pi ) ...
                + 2*(b-a)*sin(k*pi*d)/( (d-a)*(b-d)*k*k*pi*pi ) ...
                - 2*sin(k*pi*b)/( (b-d)*k*k*pi*pi ) ;
end

% compute the temporal frequencies

for k = 1:nModes
     Om(k) = c*k*pi/ell ;
end

% run the time evolution

X = 0:dx:ell ;
set(gcf,'DoubleBuffer', 'on') ;
for t = 0:dt:tfinal                     % for each fixed t
     B = alpha .* cos(t*Om) ;           % construct coeffs of sin(k*x*pi/ell)
                                        % for time t
     U = zeros(1, length(X)) ;          % next construct u(x,t)
     for k = 1:nModes 
          U = U + B(k)*sin( k*pi*X/ell ) ;
     end
     plot(X,U) ;                        % plot u(x,t)
     axis([0 ell -1 1]) ;
     title(sprintf('t = %4.1f', t)) ; 
     pause(delay) ;
end

