Click here to load reader
Upload
jesus-t-espinoza-sandoval
View
21
Download
1
Embed Size (px)
DESCRIPTION
Tarea de la matería de metodos númericos.Se presenta una solución númerica para la ecuación de difusión cuando tiene un coeficiente variable dependiente de la longitud.
Citation preview
Proyecto Métodos Numéricos
Jesús Toribio Espinoza Sandoval
15 de enero de 2015
Problema
Resolver la ecuación de difusión con coe�ciente de-pendiente de la longitud, tal como se expresa en lasecuaciones 1 y 2.
∂P
∂T= D
∂2P
∂X2(1)
D = 1 + αX (2)
Sujeta a las siguientes condiciones de frontera e ini-ciales:
P (T = 0) = PoP (X = 0) = PfP (X = L) = Po
(3)
Propuesta de solución
Para la solución de la ecuación 1, se propone sim-pli�car el espacio paramétrico utilizando un conjuntode números adimensionales para su transformación.Posteriormente, se propone su solución mediante elmétodo numérico explicito y mediante el método deCrank y Nicolson
Modelo adimensional
Conjunto de transformación:
p = P−Po
Pf−Po
x = XL
t = TL/α
(4)
Ecuaciones adimensionales1:
∂p
∂t=
1
αL(1 + αLx)
∂2p
∂x2(5)
p(t = 0) = 0p(x = 0) = 1p(x = 1) = 0
(6)
1La deducción se muestra en el Apéndice A en la página 3.
Método explicito
De acuerdo a (1) la solución de la ecuación de difu-sión por el método explicito requiere aproximacionesde la segunda derivada en el espacio, y de la primeraderivada en el tiempo. La segunda derivada se repre-senta mediante una diferencia dividida �nita centrada(ecuación (8)), mientras que la derivada con respec-to al tiempo se realiza con una diferencia �nita haciaadelante ((7)).
∂p
∂t=pi,k+1 − pi,k
2∆t(7)
∂2p
∂x2=pi+1,k − 2pi,k + pi−1,k
∆x2(8)
x = xi (9)
combinando las ecuaciones 5, 7, 8, y 9 se obtiene
pi,k+1 − pi,k2∆t
=1
αL(1 + αLxi)
pi+1,k − 2pi,k + pi−1,k
∆x2
(10)Las condiciones de frontera en diferencias �nitas se
expresan como:
pi,1 = 0p1,k = 1
pimax,k = 0(11)
De (10) se despeja el termino del tiempo hacia ade-lante
pi,k+1 = 2r1
αL(1+αLxi) (pi+1,k − 2pi,k + pi−1,k)+pi,k
(12)donde r = ∆t
∆x2
La programación del método explicito es sencilla,se realizó en fortran 90 con las siguientes subrutinas:
MainEqDifExp: Es la subrutina principal, se en-carga de la ejecución de las demas subrutinas.
InputEqDifExp: Llama a un archivo donde se in-gresan los datos.
1
GridEqDifExp: Genera los puntos de la malla queresuelve la ecuación 12
InitialEqDifExp: Contiene la condición inicial mos-trada en 11
BoundaryEqDifExp: Contiene las condiciones defrontera mostradas en 11
SolveEqDifExp: Resuelve la ecuación de difusión.
OutEqDifExp: Genera un archivo de salida de re-sultados.
Los códigos de estas subrutinas se muestran en elApéndice B.
Método de Crank y Nicolson
La solución de la ecuación de difusión por el mé-todo de Crank y Nicolson requiere de�nir la derivadaespacial de 5 en un promedio del tiempo actual y an-terior, y a la derivada temporal en un tiempo actualy anterior, tal como se muestra a continuación:
∂2p
∂x2= λ
pi+1,k − 2pi,k + pi−1,k
∆x2
+(1− λ)pi+1,k−1 − 2pi,k−1 + pi−1,k−1
∆x2(13)
∂p
∂t=pi,k − pi,k−1
∆t(14)
Por tanto, la ecuación 5 se puede reescribir como:
pi.k − pi,k−1 = 1αL (1 + αLxi)
[λr (pi+1,k − 2pi,k + pi−1,k) + (15)
(1− λ)r (pi+1,k−1 − 2pi,k−1 + pi,k−1)]
en la cual se re ordenan los términos para ingresar-los a una matriz tridiagonal.
pi−1,k
[−λr
(1αL (1 + αLxi)
)]+
pi,k[1 + 2 1
αL (1 + αLxi)]
+pi+1,k
[−λr
(1αL (1 + αLxi)
)]= (1− λ)r
(1αL (1 + αLxi)
)(pi+1,k−1 − 2pi,k−1 + pi,k−1)
(16)
Esta ecuación se satisface para valores de i = 2 →iMax − 1y k ≥ 2. Lo que da un total de iMax − 2ecuaciones en cada paso de tiempo k. Por lo que lasdos ecuaciones necesarias restantes son las condicio-nes de frontera, que para el presente modelo son deltipo Dirichlet.Por tanto, el modelo a programar por el método de
Crank y Nicolson es:
ai = −λr(
1
αL(1 + αLxi)
)(17)
bi = 1 + 21
αL(1 + αLxi) (18)
ci = −λr(
1
αL(1 + αLxi)
)(19)
ri =(1− λ)r
(1αL (1 + αLxi)
)(pi+1,k−1 − 2pi,k−1 + pi,k−1)
(20)
con condiciones de frontera:
p1,k = 1 (21)
b1 = 1 (22)
c1 = 0 (23)
r1 = 1 (24)
pimax,k = 0 (25)
aimax = 0 (26)
bimax = 1 (27)
rimax = 0 (28)
La programación del metodo de Crank - Nicholsones un poco más complicada que la del método expli-cito. Las subrutinas utilizadas son las mismas que lasmostradas en la página 1 pero con código diferente,el cual se muestra en el Apéndice C.
Resultados
La �gura 1 muestra los resultados obtenidos me-diante el método explicito y la �gura 2los resultadospor el método de Crank Nicholson. Se observa queambas grá�cas son muy similares, por lo que se con-cluye que los resultados obtenidos son correctos deacuerdo al modelo planteado.
100 read(5,*)IMax
50000 read(5,*)kMax0.125 read(5,*)r10 read(5,*)alfa1 read(5,*)LMax
Cuadro 1: Datos de entrada para el método explicito
2
Figura 1: Método Explicito
100 read(5,*)iMax
1000 read(5,*)kMax1 read(5,*)ZMax0.5 read(5,*)lammda10 read(5,*)alfa1 read(5,*)LMax
Cuadro 2: Datos de entrada para el método implicito
Figura 2: Método de Crank Nicholson
Referencias
[1] Chapra, Steven C; Canale Raymond P. 2006. Nu-merical Methods for Engineers, Fith Edition.
Apéndice A Deducción de mode-
lo adimensional de la ecuación de
difusión
Partiendo de la regla de la cadena, se tiene que:
∂P
∂T=∂P
∂p
∂p
∂t
∂t
∂T(29)
∂P
∂X=∂P
∂p
∂p
∂x
∂x
∂X(30)
∂2P
∂2X=
∂
∂X
(∂P
∂X
)(31)
donde, a partir de 4 en la página 1
∂P
∂p= (Pf − Po)
∂t
∂T=α
L
∂x
∂X=
1
Lpor tanto
∂P
∂T= (Pf − Po)
α
L
∂p
∂t(32)
∂P
∂X= (Pf − Po)
1
L
∂p
∂x(33)
∂2P
∂2X=
∂
∂(Lx)
((Pf − Po)
1
L
∂p
∂x
)∂2P
∂2X=
(Pf − Po)L2
∂2p
∂x2(34)
Combinando las ecuaciones 32, 33 y 34, se obtienela ecuación de difusión en su forma adimensional, quese muestra en 5.
Apéndice B Códigos del método
explicito
Código principal
program MainEqDifExp
use VarEqDifExp
implicit none
call InputEqDifExp
call GridEqDifExp
call InitialEqDifExp
call BoundaryEqDifExp
call SolveEqDifExp
call OutEqDifExp
end program MainEqDifExp
3
Código de variables
module VarEqDifExp
implicit none
integer(kind=4)::i,iMax,k,kMax,status
real(kind=8)::alfa,L,r,dx,dt
real(kind=8), &
allocatable:: p(:,:),x(:),t(:)
end module VarEqDifExp
Código de entrada de datos
subroutine InputEqDifExp
use VarEqDifExp
implicit none
open(unit=5, file='InputEqDifExp.dat')
read(5,*)IMax
read(5,*)kMax
read(5,*)r
read(5,*)alfa
read(5,*)L
close(unit=5)
end subroutine InputEqDifExp
Código de generación de malla
subroutine GridEqDifExp
use VarEqDifExp
implicit none
allocate (x(iMax),t(kMax),p(iMax,kMax),&
stat=status)
if (status /= 0) then
write(*,*) 'Error opening &
RAM memory'
stop
end if
do i=1,iMax
x(i) = (i-1.d0)/(iMax-1.d0)
end do
dx = x(2)
dt = r*dx**2
do k=1,kMax
t(k) = (k-1.d0)*dt
end do
!r = dt/dx**2
write(*,*) 'r = ',r
write(*,*) 'tMax = ',t(kmax)
end subroutine GridEqDifExp
Código de condiciones iniciales
subroutine InitialEqDifExp
use VarEqDifExp
implicit none
do i=1, iMax
p(i,1) = 0.d0
end do
end subroutine InitialEqDifExp
Código de condiciones de frontera
subroutine BoundaryEqDifExp
use VarEqDifExp
implicit none
do k=2, kMax
p(1 ,k) = 1.d0
p(iMax,k) = 0.d0
end do
end subroutine BoundaryEqDifExp
Código de solución de la ecuación de di-
fusión
subroutine SolveEqDifExp
use VarEqDifExp
implicit none
do k=2, kMax-1
do i=2, iMax-1
p(i,k+1) = r*(1/(alfa*L))&
*(1 + alfa*L*x(i))*&
(p(i+1,k)- 2*p(i,k)&
+ p(i-1,k)) + p(i,k)
end do
end do
end subroutine SolveEqDifExp
Código de salida de datos
subroutine OutEqDifExp
use VarEqDifExp
implicit none
open(unit=5, file='Diffusion.plt')
write(5,*)'TITLE = "Diffusion"&
' write(5,*)'VARIABLES = "x" &
' write(5,*)'"y"' write(5,*)'&
"Sat"' write(5,*)'ZONE T= "Unica"&
' write(5,*)'I=', kMax, 'J=',iMax,'K=1,&
F=POINT' !head del archivo de salida
do i=1, iMax
do k=1, kMax &
4
write(5,102)x(i),t(k),p(i,k)
end do
end do 102
format(6e22.14)
close(unit=5)
end subroutine OutEqDifExp
Apéndice C Códigos del Método
de Crank Nicholson
Código principal
program mainEDI
use VarEDI
use VarTridiag
implicit none
call InputEDI
call GridEDI
call InitialEDI
allocate( At(iMax),Bt(iMax),&
Ct(iMax),Rt(iMax), &
Ut(iMax), GAM(iMax), stat=status)
do k=2,kMax
call SolveEDI
end do
deallocate( At, Bt, Ct, Rt, Ut, GAM)
call OutputEDI
end program mainEDI
Código de variables de programa prin-
cipal
module VarEDI
implicit none
integer(kind=4):: i,iMax,&
k,kMax,status
real(kind=8):: alfa, LMax
real(kind=8):: r,lammda,dx,dt,tMax
real(kind=8), allocatable :: u(:,:)&
,t(:),x(:)
end module VarEDI
Código de variables para resolver ma-
triz tridiagonal
module VarTridiag
integer(kind=4)::Nt, Jt
real(kind=8), allocatable ::&
At(:), Bt(:), Ct(:), Rt(:),&
Ut(:), GAM(:)
real(kind=8) :: BET
end module VarTridiag
Código de entrada de datos
subroutine InputEDI
use VarEDI
implicit none
open(unit=5,file='InputEDI.dat')
read(5,*)iMax
read(5,*)kMax
read(5,*)tMax
read(5,*)lammda
read(5,*)alfa
read(5,*)LMax
close(unit=5)
end subroutine InputEDI
Código de generación de malla
subroutine GridEDI
use VarEDI
implicit none
allocate (x(iMax), t(kMax),&
u(iMax,kMax), stat = status )
if(status /= 0) then
write(*,*)'Error opening RAM memory'
stop
end if
do i=1,iMax
x(i) = (i-1.d0)/(iMax-1.d0)
end do
do k=1,kMax
t(k) = tMax*(k-1.d0)/(kMax-1.d0)
end do
dx = x(2)
dt = t(2)
r = dt/dx**2
write(*,*)'r =',r
end subroutine GridEDI
Código de condiciones iniciales
subroutine InitialEDI
use VarEDI
implicit none
do i=1,iMax
u(i,1) = 0.d0
end do
end subroutine InitialEDI
Código para solución de matriz tridia-
gonal
subroutine tridiag
use VarTridiag
implicit none
if (bt(1) == 0.d0)&
5
pause 'tridiag : &
reescribe las ecuaciones' bet=bt(1)
ut(1)=rt(1)/bet
do jt=2,Nt
gam(jt)=ct(Jt-1)/bet
bet=bt(jt)-at(jt)*gam(jt)
if (bet == 0.d0)&
pause 'Error en tridiag'
ut(jt)=(rt(jt)-at(jt)*ut(jt-1))/bet
end do
do jt=Nt-1,1,-1
ut(jt)=ut(jt)-gam(jt+1)*ut(jt+1)
end do
end subroutine tridiag
Código para solución de ecuación de di-
fusión
subroutine SolveEDI
use VarEDI
use VarTridiag
implicit none
bt(1) = 1.d0
ct(1) = 0.d0
rt(1) = 1.d0
do i=2,iMax-1
at(i) = -lammda*r*&
(1/(alfa*Lmax)*(1+alfa*LMax*x(i)))
bt(i) = (1.d0 + 2*lammda*r*&
(1/(alfa*Lmax)*(1+alfa*LMax*x(i))))
ct(i) = -lammda*r*(1/(alfa*Lmax)*&
(1+alfa*LMax*x(i)))
rt(i) = (1.d0-lammda)*r*(1/(alfa*Lmax)*&
(1+alfa*LMax*x(i)))*(u(i+1,k-1) - 2*u(i,k-1)&
+ u(i-1,k-1)) + u(i,k-1)
end do
at(iMax) = 0.d0
bt(iMax) = 1.d0
rt(iMax) = 0.d0
Nt = iMax
call tridiag
do i=1,iMax
u(i,k) = Ut(i)
end do
end subroutine SolveEDI
Código de salida de datos
subroutine OutputEDI
use VarEDI
implicit none
open(unit=5, file='Diffusion.plt')
write(5,*)'TITLE = "Diffusion" '
write(5,*)'VARIABLES = "x"'
write(5,*)'"y"'
write(5,*)'"U"'
write(5,*)'ZONE T= "unica"'
write(5,*)'I=',kMax,' J=',iMax,' K=1,F=POINT'
do i=1,iMax
do k=1,kMax
write(5,102)x(i),t(k),u(i,k)
end do
end do
102 format(6e22.14)
close(unit=5)
end subroutine OutputEDI
6