Está en la página 1de 0

8-1

8. Ecuaciones diferenciales

En este captulo, primero veremos algunos mtodos bsicos. Luego
repasaremos brevemente un mtodo de Runge-Kutta de segundo orden.
Plantearemos el problema de la resolucin de un sistema de ecuaciones
diferenciales que surge en cintica qumica formal.


8.1. El mtodo de Euler

El mtodo de Euler es uno de los ms sencillos. Dadas una ecuacin
diferencial en la forma y=f(x,y), la condicin inicial (de contorno) de que la
funcin y pase por el punto (x
0
,y
0
) y el paso de integracin h, se calculan los
sucesivos valores de y, {y
k
}, de la siguiente manera

y
k+1
= y
k
+ hf(x
k
,y
k
) (1)

siendo x
k
=x
k-1
+h.

Esta formulacin es equivalente a considerar la expansin en serie de Taylor
de la funcin y(x) hasta primer orden. Claro est que el mtodo slo es exacto
para funciones lineales. El error de magnitud en y
k+1
es

)
( )
2 2
2
1
y h = siendo x
k
< < x
k+1
.

Esta frmula indica que es conveniente tomar pasos de integracin h
pequeos. Esto, sin embargo, implica el hecho de que para hacer la integracin
en un intervalo prefijado se tengan que acumular muchos resultados parciales
a travs de las sumas en (1), lo cual tambin va en detrimento de la precisin
final del clculo.


8.2. Mtodos de Runge-Kutta

Se puede entender el mtodo bsico de Runge-Kutta como una modificacin
del anterior. La frmula fundamental es

y
k+1
= y
k
+ hf(x
k
+h/2 , y
k
+hf(x
k
,y
k
)/2 ).


Se observa como aqu no se considera la pendiente de la funcin en el punto x
k

sino en el punto medio entre x
k
y x
k+1
, es decir el punto x
k
+h/2. Esta pequea
correccin permite ganar precisin en el clculo puesto que la derivada que se
aplica se puede interpretar como un valor medio de las derivadas reales en los
puntos x
k
y x
k+1
.

Una frmula muy popular que explota la idea anterior y que da errores de
quinto orden en h es la siguiente:
8-2

3 6
1
2 3
1
1 3
1
6
1
1
R R R R y y
k k
+ + + + =
+

donde
( )
( )
( )
( )
2 3
1 2
1
,
2 / , 2 /
2 / , 2 /
,
R y h x hf R
R y h x hf R
R y h x hf R
y x hf R
k k
k k
k k
k k
+ + =
+ + =
+ + =
=



8.3. Mtodos predictores-correctores

Los mtodos predictores-correctores utilizan una frmula predictora, P, que
permite evaluar la coordenada y
k
del paso en el que nos encontramos. Luego
este resultado se refina con una frmula correctora, C, mediante un proceso
iterativo que involucra a la ecuacin diferencial. El algoritmo genrico para la
integracin de la funcin en el intervalo [a,b] es el que sigue:


1. Se fija una precisin .
2. k=0. x
0
=a. y
0
=y(x
0
)
3. Se parte de un punto (x
k
,y
k
).
4. Se calcula x
k+1
. Si x
k+1
>b se para el proceso.
5. Mediante la aplicacin del predictor P se evala
( ) i
k
y
1 +
.
6. Se calcula el valor
( )
( )
i
k k k
y x f y
1 1
'
1
,
+ + +
= .
7. Mediante el corrector se corrige
( ) i
k
y
1 +
para dar
( ) 1
1
+
+
i
k
y .
8. Si
( ) ( )
>
+
+
+
i
k
i
k
y y
1
1
1
entonces
( ) ( ) 1
1 1
+
+ +

i
k
i
k
y y y se pasa de nuevo a 6.
9. Definitivamente,
( ) 1
1 1
+
+ +
=
i
k k
y y .
10. k k+1 y se pasa a 4 para evaluar el siguiente punto.


El mtodo predictor-corrector ms simple es el de Euler, para este:

- La frmula predictora P es ( )
k k k k
y x hf y y ,
1
+ =
+
.
- La frmula correctora C es
( )
( )
( )
( ) [ ]
i
k k k k k
i
k
y x f y x f
h
y y
1 1
1
1
, ,
2
+ +
+
+
+ + = .



8.4. Un mtodo numrico de Runge-Kutta de segundo orden

A partir del problema

( )
( ) z y x g z
z y x f y
, , '
, , '
=
=


el mtodo propone las siguientes ecuaciones:
8-3

( ) ( )
( ) ( )
3
2 1 2
1
1
3
2 1 2
1
1
h O l l z z
h O k k y y
n n
n n
+ + + =
+ + + =
+
+

donde
( )
( )
( )
( )
1 1 2
1 1 2
1
1
, ,
, ,
, ,
, ,
l z k y h x hg l
l z k y h x hf k
z y x hg l
z y x hf k
n n n
n n n
n n n
n n n
+ + + =
+ + + =
=
=


El procedimiento se inicia considerando un punto inicial de partida (x
0
,y
0
,z
0
) y
un valor de paso h.


Ejercicios

1. Programar el mtodo de Euler y resolver la ecuacin diferencial y=y en el
intervalo [0,1] sabiendo que y(0)=1. Tomar como paso de integracin h=0.01.
Comparar el resultado con la solucin exacta: y=e
x
.

2. Programar el mtodo de Euler, el de Runge-Kutta y el mtodo predictor-
corrector de Euler para resolver la ecuacin diferencial y=y en el intervalo
[0,10] sabiendo que y(0)=1. Tomar un paso de integracin h=1.0. Comparar
cada resultado con la solucin exacta: y=e
x
. En la grfica que sigue se muestra
el comportamiento de cada mtodo. El ms preciso es el de Runge-Kutta, que
da una funcin solucin que se confunde visualmente con la exacta.


1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
Eje X
0
10000
20000
30000
40000
50000
60000
V
a
l
o
r

d
e

l
a

f
u
n
c
i

n

y
(
x
)
Euler
Euler predictor-corrector
Runge-Kutta


8-4
Aplicacin a sistemas de ecuaciones cinticas

Como ejemplo de aplicacin, resolveremos numricamente el problema de una
reaccin cintica que obedezca al siguiente mecanismo:

C B A
k k

2 1
.

Esto plantea el siguiente sistema de ecuaciones diferenciales:

[ ]
[ ]
[ ]
[ ] [ ]
[ ]
[ ] B k
dt
C d
B k A k
dt
B d
A k
dt
A d
2
2 1
1
=
=
=


Si k
1
k
2
y [B]
0
=[C]
0
=0, la solucin exacta es

[ ] [ ]
[ ] [ ] ( )
[ ] [ ] ( )

+ =

=
=

t k t k
t k t k
t k
e k e k
k k
A C
e e A
k k
k
B
e A A
2 1
2 1
1
1 2
2 1
0
0
1 2
1
0
1
1



Estas funciones de concentracin se representan en la grfica siguiente para
[A]
0
=1M:

0.0 1.0 2.0 3.0 4.0 5.0 6.0
Tiempo (s)
0.0
0.2
0.4
0.6
0.8
1.0
C
o
n
c
e
n
t
r
a
c
i

n

(
M
)
A
B
C


Como ejercicio se propone resolver el sistema de ecuaciones con el mtodo
numrico de segundo orden propuesto arriba. Para ello, basta considerar la
solucin exacta inmediata para la concentracin del compuesto A, con lo cual
se utiliza el mtodo para resolver el sistema de ecuaciones siguiente:

8-5
[ ]
[ ] [ ]
[ ]
[ ] B k
dt
C d
B k e A k
dt
B d
t k
2
2 0 1
1
=
=



Comparar el resultado grfico con la solucin exacta. Considerar [A]
0
=1M,
[B]
0
=[C]
0
=0, k
1
=1.0 s
-1
y k
2
=2.0 s
-1
. Integrar para un tiempo total de 6 s.

8-6
Programas

*--------------------------------------------------------------------
program Euler
implicit double precision (a-h,o-z)

h=0.010d0 ! Paso de integracion

xk=0.0 ! Punto inicial
yk=1.0d0 !

do while (xk<1.0d0) ! Hasta el final!

fxy=yk ! La derivada es igual a y

xk=xk+h ! Siguiente valor de x
yk=yk+h*fxy ! Segun Euler

write(*,(3g14.6)) xk,yk,dexp(xk)

end do

end
*--------------------------------------------------------------------



!----------------------------------------
program Runge_Kutta
implicit double precision (a-h,o-z)

h=1.0d0
h2=h/2

xk=0.0d0 ! Punto inicial
yk=1.0d0 !

b=10.0d0 ! Punto final

do while (xk<b)

R =h*derivada(xk ,yk) ! La derivada
R1=h*derivada(xk+h2,yk+R/2)
R2=h*derivada(xk+h2,yk+R1/2)
R3=h*derivada(xk+h ,yk+R2)

xk=xk+h
yk=yk+R/6+R1/3+R2/3+R3/6

write(*,'(3g14.6)') xk,yk,dexp(xk)

end do

end
!----------------------------------------
!----------------------------------------
double precision function derivada(x,y)
implicit double precision (a-h,o-z)
derivada=y
end
!----------------------------------------
8-7
!--------------------------------------------------------------------
program Euler_predictor_corrector
implicit double precision (a-h,o-z)

h=1.0d0 ! Paso h
h2=h/2
epsilon=1.0d-8 ! Precision

a=0.0d0 ! Punto inicial
b=10.0d0 ! Punto final

xk=a ! Condicion de contorno
yk=1.0d0 !

do while (xk<b)

xk1=xk+h

yk1i=yk+h*derivada(xk,yk) ! Predictor

! Proceso iterativo
1 yk1p=derivada(xk1,yk1i)
yk1i1=yk+h2*(derivada(xk,yk)+derivada(xk1,yk1i)) ! Corrector
if (abs(yk1i1-yk1i)>epsilon) then
yk1i=yk1i1
goto 1
end if

yk=yk1i1 ! Nuevo punto
xk=xk1

write(*,'(4g14.6)') xk,yk,dexp(xk),(yk-dexp(xk))/dexp(xk)*100


end do

end
!--------------------------------------------------------------------
!--------------------------------------------------------------------
double precision function derivada(x,y)
implicit double precision (a-h,o-z)
derivada=y
end
!--------------------------------------------------------------------
8-8
*--------------------------------------------------------------------
PROGRAM Runge_Kutta_segundo_orden
parameter (zero=0.0e0,one=1.0e0,two=2.0e0)
*
ao=one
xo=zero
xf=6.0e0
xk1=one
xk2=two
yn=zero
zn=zero
*
open(unit=1,file='b.dat',status='unknown')
open(unit=2,file='c.dat',status='unknown')
*
nt=1000
h=(xf-xo)/nt ! 1000 cortes en el intervalo [0,6]
xn=xo
*
write(1,'(2g14.6)') xn,yn
write(2,'(2g14.6)') xn,zn
do n=1,nt
rk1= h * (xk1*ao*exp(-xk1*xn)-xk2*yn)
rl1= h * (xk2*yn)
xn=xn+h ! Ya es xn1
rk2= h * (xk1*ao*exp(-xk1*xn)-xk2*(yn+rk1))
rl2= h * (xk2*(yn+rk1))
yn1=yn+(rk1+rk2)/2
zn1=zn+(rl1+rl2)/2
write(1,'(2g14.6)') xn,yn1
write(2,'(2g14.6)') xn,zn1
yn=yn1
zn=zn1
end do
close(1)
close(2)
END
*--------------------------------------------------------------------

También podría gustarte