Apéndice A Códigos En esta sección presentamos los códigos que han sido utilizados en este trabajo . %=========================================================== function [u,x,t]=dfinitas_cn(xi,xf,n,m,dt,alfa,beta,ui,uf) % funcion que resuelve por diferencias finita la % ecuacion de Adveccion difusion %Ut+aUx=kUxx % por crank-nicolson %=========================================================== %x:vector que tiene el mallado %xi ,xf pto inicial y final del intervalo para x %n #ptos para en que discretisamos el intervalo espacio %m #pasos temporales %dt paso de tiempo %ui ;uf son los valores en los bordes izquierdo y derecho %variables, incognitas, pasos del mallado, constantes del sistema x=zeros(n+1,1); b=zeros(n+1,1); u=zeros(n+1,m+1); A=zeros(n+1,n+1); B=zeros(n+1,n+1); % h=(xf-xi)/n; x=xi:h:xf; cr=alfa*dt/h; 101 102 pe=alfa*dt/beta; landa=cr/pe; % %variables para la gadiente r=zeros(n+1,1); f=zeros(n+1,1); d=zeros(n+1,1); alfaG=0; betaG=0; % %cargamos datos iniciales % fix es el maximo entero % n2=fix((n+1)/2); for i=1:n2 u(i,1)=2*(x(i)-xi); end for i=n2+1:n+1 u(i,1)=2*(xf-x(i)); end %cargamos las condiciones de borde u(1,:)=ui; u(n+1,:)=uf; %cargamos las matrices A ; B %segun el esquema de Crank-nicolson for i=2:n A(i,i-1)=-cr/4-landa/2; A(i,i)=1+landa; A(i,i+1)=cr/4-landa/2; %matriz B B(i,i-1)=cr/4+landa/2; B(i,i)=1-landa; B(i,i+1)=-cr/4+landa/2; end A(1,1)=1; A(n+1,n+1)=1; %cargamos el nuevo vector b para Au=(Bu+b) ,es decir el % nuevo b es b=Bu+b resolvemos m sistemas de ecuaciones A. Códigos 103 %esto te lo indica j=1..m+1 en j=1 el %u(:,1) el conocido de la condicion inicial for j=1:m for i=2:n b(i)=B(i,i-1)*u(i-1,j)+B(i,i)*u(i,j)+B(i,i+1)*u(i+1,j); end b(1)=ui; b(n+1)=uf; %resolver A*u(:,j+1)=b(:) para obtener u(:,j+1) %gradiente conjugada modificada tolerancia=0.001; r=b-A*u(:,j); d=r; error=0;niterac=1; while (error>tolerancia) & (niterac<=n) alfaG=d’*r/(d’*A*d); u(:,j+1)=u(:,j+1)+alfaG*d; f=r; r=r-alfaG*A*d; betaG=r’*r/(f’*f); d=r+betaG*d; error=norm(r); niterac=niterac+1; end t(j)=(j-1)*dt; end %======================================================================= % GARFICO DE RESULTADOS %======================================================================= %escritura de los resultados t(m+1)=m*dt; % grafica %================================================================= %ANIMACION %================================================================= figure(1) for j=1:m+1 plot(x,u(1:n+1,j),’b’);pause(0.01) 104 F(j)=getframe; end movie(F) %(1:n+1) estaba como argumento de x xlabel(’eje x’); ylabel(’Concentracion’); title(’Solucion Aproximada la Ecuacion Ut+aUx=kUxx metodo Implicito’); legend(’solucion aproximada’) %====================================================================== figure(2) title(’ECUACION Ut+aUx=kUxx metodo Implicito y solucion aproximada’); plot(x,u(1:n+1,1),’-.r’); figure(3); plot(x(1:n+1),u(1:n+1,m)); xlabel(’eje x’); ylabel(’Concentracion’); figure(4); %subplot(1,2,2); [X,T]=meshgrid(x,t); surf(X,T,u’); xlabel(’eje x’); ylabel(’eje t’); zlabel(’concentracion’); title(’Solucion Aproximada Cran-Nicolson para la ecuacion Ut+aUx=kUxx’); shading interp cr pe %============================================================================= % Resuelve la ecuacion de adveccion difusion %============================================================================= % Ut+aUx=kUxx % usando diferencia finitas % con el esquema explicito centrado para el espacio y adelantado para el tiemp %============================================================================= while(1) clear;clc; fprintf(’_________________________________________________________________\n’) A. Códigos 105 fprintf(’ \n’) fprintf(’...... Resolucion numerica de la ecuacion Ut+aUx=kUxx .......\n’) fprintf(’ \n’) fprintf(’ U(xi,t)= Ui \n’); fprintf(’ U(xf,t)= Uf \n’); fprintf(’ U(x,0) = Uo \n’); fprintf(’ \n’) fprintf(’ Metodo de diferencias finitas y esquema explicito \n’) fprintf(’ \n’) fprintf(’_________________________________________________________________\n’) disp(’ ’); disp(’ xi es el punto incial del intervalo de resolucion del intervalo ’); disp(’ xf es el punto final de resolucion del intervalo ’); disp(’ n es el numero de puntos en que discretizamos el intervalo en el espacio’); disp(’ m es el numero de pasos temporales ’); disp(’ dt es el es el paso del tiempo ’); disp(’ a es el coeficiente de Conveccion ’); disp(’ k es el coeficiente de difusion ’); disp(’Ui, Uf son los valores de U en los bordes izquierdo y derecho respectivamente’); disp(’ ’); disp(’EJ. Esquema inestable con datos v= [ 0,1,100,100,0.0049,1,1,0,0 ] ’); disp(’ ’); disp(’EJ. Esquema inestable con datos v= [ 0,1,100,100,0.000079,1,1,0,0 ]’); disp(’ ’); disp(’EJ. Esquema estable con datos v= [ 0,1,100,100,0.000049,1,1,0,0 ]’); disp(’ ’); v=input(’Ingrese el vector con los datos iniciales v= ’); xi=v(1); xf=v(2); n=v(3); m=v(4); dt=v(5); a=v(6); k=v(7); ui=v(8); uf=v(9); x=zeros(n+1); u=zeros(n+1,m+1); U=zeros(n+1,m+1); 106 h=(xf-xi)/n; x=xi:h:xf; %numero de couran, petclet,lamba cr=(a*dt)/h; pe=(a*h)/k; lamba=cr/pe; %la estabilidad se tiene si 0<=cr<=pe/2<1 %=================================================== %datos condiciones iniciales n1=fix((n+1)/2); for i=1:n1 u(i,1)=2*(x(i)-xi);%original %u(i,1)=2*x(i); end % for i=n1+1:n+1 u(i,1)=2*(xf-x(i));%original % u(i,1)=2-2*x(i); end %for i=1:n+1 % u(i,1)=1 %end %datos condiciones de frontera u(1,:)=ui; u(n+1,:)=uf; %=================================================== % Algoritmo for j=1:m for i=2:n u(i,j+1)=u(i-1,j)*(lamba+(cr/2))+u(i,j)*(1-2*lamba)+u(i+1,j)*(lamba-(cr/2)); U(i,j)=0.5*( erfc( ( x(i)-a*j )/(2*sqrt(k*j)) )+ exp(x(i)*a/k)*erfc( (x(i)+a*j)/(2*sqrt(k*j)))); end t(j)=(j-1)*dt; end t(m+1)=m*dt; %------------------------------------------------------------------% grafica A. Códigos 107 %------------------------------------------------------------------%animacion figure(1) %subplot(1,2,1); for j=1:m+1 plot(x,u(1:n+1,j),’b’); F(j)=getframe; end movie(F) %(1:n+1) estaba como argumento de x xlabel(’eje x’); ylabel(’Concentracion’); title(’Solucion Aproximada la Ecuacion Ut+aUx=kUxx metodo explicito’); legend(’solucion aproximada’) %solucion exacta ...............estoy probando.......borrar figure(2) for j=1:m+1 plot(x,U(1:n+1,j),’b’); G(j)=getframe; end movie(G) figure(3); %subplot(1,3,3); [X,T]=meshgrid(x,t); surf(X,T,u’); xlabel(’eje x’); ylabel(’eje t’); zlabel(’concentracion’); title(’Solucion Aproximada la Ecuacion Ut+aUx=kUxx metodo explicito’); shading interp figure(4); %subplot(1,3,3); [X,T]=meshgrid(x,t); surf(X,T,U’); xlabel(’eje x’); ylabel(’eje t’); zlabel(’concentracion’); title(’Solucion Exacta la Ecuacion Ut+aUx=kUxx metodo explicito’); 108 shading interp cr pe if pe*0.5<1 if cr<pe*0.5 disp(’el esquema es estable’) else disp(’el esquema es inestable’) end end %legend(’Ut+aUx=kUxx’,’Numero de Courand cr’,’Numero de Petclet pe’, ’location’,’NorthEastOutside’) %-------------------------------------------------------------------------%opciones para continuar o culminar %-------------------------------------------------------------------------M=menu(’....MARLO DESEAS REALIZAR NUEVOS CALCULOS....’,’..SI..’,’..NO..’) switch(M) case 1 clear; clc; case 2 disp(’------------------------------------------------------’); disp(’...........GRACIAS EL PROGRAMA HA FINALIZADO..........’); disp(’------------------------------------------------------’); close all; break end end %while