Apéndice A Códigos

Anuncio
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
Descargar