sandbox/easystab/stab2014/Diffusion.m

    Presentation

    Here the code for the diffusion equation. We took the Vibrating String code and modified it to show the diffusion phenomenon. The equation used is the well-known diffusion equation also the Heat Equation without source : \displaystyle f_t=\mu f_{xx} The resolution is the same that the vibrating string, a march in time for the time derivative and a differentiation matrix for the spatial derivative.

    clear all; close all;
    
    % parameters
    N=200; % number of gridpoints
    L=50; % domain length
    mu=0.5; % thermic conductivity
    dt=0.05; % time step
    tmax=20; % final time
    x0=L/2;
    t0=0.5;
    
    % differentiation matrices
    scale=-2/L;
    [x,DM] = chebdif(N,2); 
    dx=DM(:,:,1)*scale;    
    dxx=DM(:,:,2)*scale^2;    
    x=(x-1)/scale; 
    I=eye(N); 
    
    % system matrices
    E=I;
    A=mu*dxx; 
    

    Boundary Conditions

    We know that at the boundary conditions, the solution is zero, thus we put this value in the differentiation matrix like this :

    % boundary conditions
    E([1 N],:)=0; 
    A([1 N],:)=I([1 N],:);
    
    % march in time matrix 
    M=(E-A*dt/2)\(E+A*dt/2);
    

    Initial Condition

    For the initial condition we use the Gaussian function that represent well the diffusion at the initial time : \displaystyle T=\frac{1}{\sqrt{2\pi t_0}}exp\left(\frac{-(x-x_0)^2}{2t_0}\right)

    % initial condition
    q=1/sqrt(2*pi*t0)*exp(-(x-x0).^2/2/t0);
    
    % marching loop
    tvec=0:dt:tmax; 
    Nt=length(tvec);
    filename = 'Diffusion.gif';
    for ind=1:Nt     
        q=M*q; % one step forward
        t=ind*dt;
        
        Tt=1/sqrt(2*pi*(t+t0))*exp(-(x-x0).^2/2/(t+t0));
       
        % plotting
        subplot(1,2,1);    
        plot(x,q,'k+',x,Tt,'g-'); 
        title('Diffusion');
        xlabel('x'); ylabel('T');
        axis([L/4,3*L/4,-0.1,0.5])
        
        subplot(1,2,2);
        plot(t,norm((q-Tt),2),'b.'); grid on; hold on
        drawnow
        title('Error')
        xlabel('t'); ylabel('T');
        
    end