6

Click here to load reader

Ecuacion de Difusion Con Coeficiente Variable

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

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