Contents
% This code simulates a diffusion equation on a 1D spatial domain [-L,L]; % It is a {\bf Fickian} diffusion % A reaction term F(u) can be added. For instance F(u)=ru(1-u/K). % Determine a function u(t,x) as a matrix where lines correspond to % different time steps and columns correspond to different space locations. % Initial Conditions are provided in the variable CI and plotted on % Figure(1) % Boundary conditions are Dirichlet conditions at infinity (u->0 when % x->+/-\infty % The diffusion coefficient is space dependent and given in function % DiffCoef.m, its derivative is needed and given in dDiffCoef.m % Jean-Christophe POGGIALE - Mars 2016 clear all;clc; global A B M L p reac %Parameter setting A=0.2;B=0.2; % Define the diffusion coefficient tmax=20; % Time length of the simulation dt=0.1; % Time step dx=0.05; % Space step L=10; % Domain=[-L,L] x=-L:dx:L; % Define the space mesh r=2;K=2;p=[r;K]; % Parameters of the reaction term, inserted in a vector p % OPTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BC0flux=0; % if =1 then no flux at the boundaries -L and L, else L and -L are not boundaries reac=0; % if =1 then the reaction term is included in the simulation SolAnalyt=1; % if =1, compares the numerical solution to the analytical solution %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initial conditions x0=0;% Center of the initial distribution sigma=0.1; CI=exp(-((x-x0)/sigma).^2); % Gaussian curve around x_0 CI=CI/(sum(CI)*dx); % Normalization, the total amount of matter is 1 % Calculus of the diffusion matrix D=DiffCoef(x); dD=dDiffCoef(x); M=diag(-2*D/dx^2); MU=diag((dD(1:end-1)/2+D(1:end-1)/dx)/dx,1); ML=diag((D(2:end)/dx-dD(2:end)/2)/dx,-1); M=M+ML+MU; % Neuman Boundary conditions for a closed domain if BC0flux==1 M(1,2)=2*D(1,2)/dx^2; M(end,end-1)=2*D(end,end-1)/dx^2; end % Running simulation [t u]=ode45(@ModelDiff1D,0:dt:tmax,CI); % Analytical Solution t0=sigma^2/(2*DiffCoef(x0)); i=1;UA=[]; for i=0:length(t) uA=GaussFunct(t0+i*dt,x,x0,DiffCoef(x0),t0); UA=[UA;uA]; end
GRAPHS
figure(1) % Initial Condition plot(x,CI) xlabel('Space');ylabel('initial u distribution'); figure(2) % Diffusion coefficient as a function of space plot(x,D); ylim([0 max(D)]) xlabel('Space');ylabel('Diffusion coefficient'); figure(3) % dynamics of u on the spatial domaine for i=1:length(t) if SolAnalyt==1 plot(x,u(i,:),x,UA(i,:)); else plot(x,u(i,:)); end xlim([-L L]); ylim([0 2]) xlabel('Space');ylabel('u(t,x)') F(i)=getframe; end
figure(4) % Total amount of matter versus time S=sum(u')*dx;S=S'; plot(t,S) ylim([0 max(S)+1]) xlabel('Time');ylabel('U_T'); title('Total amount of matter versus time')