Transcript
Page 1: Ecuacion de Difusion Con Coeficiente Variable

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

Page 2: Ecuacion de Difusion Con Coeficiente Variable

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

Page 3: Ecuacion de Difusion Con Coeficiente Variable

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

Page 4: Ecuacion de Difusion Con Coeficiente Variable

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

Page 5: Ecuacion de Difusion Con Coeficiente Variable

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

Page 6: Ecuacion de Difusion Con Coeficiente Variable

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