Una rutina en C++ para resolver ecuaciones diferenciales (página 2)
Enviado por Oscar Guerrero Miramontes
Error porcentual que se obtuvo al comparar diferentes puntos (x, y) de la solución analítica a la ecuación diferencial (10) con la solución numérica usando: a) El algoritmo Runge–Kutta de cuarto orden (en azul); b) El algoritmo de Adam-Bashforth–Moulton (en verde)
El siguiente ejemplo resuelto es :
12)
La ecuación diferencial (12), se resolvió en el rango [0, 40] usando ambos métodos. En la siguiente imágen se muestra la solución obtenida numéricamente al resolver por: a) Runge–Kutta en línea azul. b) Adam-Bashforth–Moulton en línea verde. c) la solución analitica a la ecuación diferencial en color rojo .
Solución numérica obtenida al resolver la ecuación (12) en el rango [0, 40] usando el algoritmo de Runge–Kutta (azul), y el de Adam-Bashforth–Moulton (verde), se usó un tamaño de paso h=0.001. La solución analítica se muestra con una línea de color rojo.
La imágen superior muestra que ambos métodos, se aproximan adecuadamente a la solución analítica de la ecuación diferencial. Para ver cual algoritmo converge mejor a la solución se calculó el error porcentual. En la siguiente imágen se muestra el error porcentual al usar Runge–Kutta (en azul ) y Adams Bashforth–Moulton (en color verde).
Error relativo que se obtuvo al comparar diferentes puntos (x, y) de la solución analítica a la ecuación diferencial (12) con la solución numérica usando:a) Algoritmo Runge–Kutta de cuarto orden (en azul).b) Algoritmo de Adam-Bashforth–Moulton (en verde)
El método de Runge Kutta es más eficiente en calcular la solución numérica a la ecuación diferencial (12) al tener un rango de error entre 0–4%, mientras que el método de Adam-Bashforth–Moulton alcanza errores porcentuales de hasta 8%. Otra prueba que se realizó fue el comparar el rango de estabilidad entre los dos métodos numéricos.
Para tener una idea más clara, se muestra los resultados obtenidos al aumentar el rango de la solución numérica.
Solución numérica obtenida al resolver la ecuacion (12) en el rango [0, 100] usando el algoritmo de Runge–Kutta (línea azul), se uso un tamaño de paso h=0.001. La solución analítica se muestra en color rojo.
Evidentemente el método de Runge Kutta muestra una inestabilidad (un incremento repentino que no corresponde a la solución analítica), como se muestra en la imágen superior, cuando x>45 el resulado difiere totalmente. No se continuó la graficación de la solución a valores más grandes, debido a que no era posible tener una imágen a una escala visible para comparar entre la solución analítica y la solución numérica .
Ahora se presenta el resultado de implementar el Algoritmo de Adam-Bashforth–Moulton en el rango [0, 100] para resolver la ecuación diferencial (12). A diferencia del método de Runge–Kutta, el método de Adam-Bashforth–Moulton ofrece un mayor rango de estabilidad, fallará luego de que x>80, otra obervación importante, fue el encontrar que la forma en que diverge el método no es tan repentina y drástica como lo hace el método de Runge–Kutta
Solución numérica obtenida al resolver la ecuación (12) en el rango [0, 100] usando el algoritmo de Adam-Bashforth–Moulton (línea azul), se usó un tamaño de paso h=0.001. La solución analítica se muestra en color rojo.
Resolución numérica a un sistema de acoplado de N ecuaciones diferenciales usando el método Runge-Kutta
El método numérico de Runge–Kutta puede extenderse para resolver un sistema acoplado de N ecuaciones diferenciales, donde se tendran N condiciones iniciales. En este artículo se creó una rutina en C++ para resolver un sistema acoplado de tres ecuaciones diferenciales. En breve, la idea es que conforme avance el número de N variables en el método de Runge–Kutta, ver ecuaciónes (2), (3), (4), (5) y (6), se agregarán N constantes definidas en (3), (4), (5) y (6).
Un ejemplo muy conocido es el Atractor de Lorenz, el sistema acoplado de tres ecuaciones diferenciales que se resolvió usando el método Runge–Kutta de cuarto orden con un tamaño de paso h=0.001 es el siguiente:
la solución obtenida al resolver el sistema acoplado (13) se grafica a continuación:
Solución numérica obtenida al resolver la ecuación (13) en el rango [0, 200] usando el algoritmo de Runge–Kutta de 4to orden, se uso un tamaño de paso h=0.001.
No se muestra el error porcentual al sistema acoplado por que no hay solución analítica.
Ecuaciones diferenciales de segundo orden
Las ecuaciones diferenciales de segundo orden, relacionan la segunda derivada con la primera derivada, es necesario dos condiciones iniciales para resolver el problema
(14)
la ecuación diferencial más general de segundo orden tiene la siguiente forma:
(15)
Un truco bien conocido, es el de expresar la ecuación (12) en un sistema acoplado de dos ecuaciones diferenciales de primer orden.
El método de Runge–Kutta de cuarto orden para resolver el sistema acoplado de ecuaciones diferenciales (16) es el siguiente:
Se resolvió un ejemplo de ecuaciones diferenciales de segundo orden para probar si el algoritmo implementado, que está basado en el método Runge–Kutta que se mencionó con anteriodidad en el arreglo de ecuaciones definido en (14) funciona correctamente.
El ejemplo resuelto es el siguiente:
(15)
Se resolvió usando el método de Runge–Kutta de cuarto ver ecuación (14) en el rango [0, 10], usando un tamaño de paso h=0.01, a continuación se muestra en una gráfica la solución obtenida usando el método numérico (línea azul) y la solución analitica a la ecuacion diferencial (en verde). El resultado obtenido, claramente converge a la solución analítica.
Solución numérica obtenida al resolver la ecuación diferencial (15) usando el algoritmo de Runge–Kutta (en azul), se usó un tamaño de paso h=0.01. La solución analítica se muestra en color verde.
El error porcentual se muestra a continuación :
Error porcentual que se obtuvo al comparar diferentes puntos (x, y) de la solución analítica a la ecuación diferencial (15) con la solución numérica usando el algoritmo Runge–Kutta de cuarto orden (punto azul).
Conclusiones
No hay conclusiones. En realidad este trabajo fue echo en horas de ocio como una forma de entretenerme, y ayudó a tener una idea mas amplia de como se usan los métodos numéricos para resolver ecuaciones diferenciales. Este es un tema muy conocido y hay muy buenas referencias para la gente que quiera encontrar mas información. En ningún momento se ha pensado que esta rutina pueda competir con los programas que existen para resolver ecuaciones diferenciales. Como ya se mencionó, este programa sólo fue un proyecto para entretenimiento personal. Se puede decir que se implementó de forma exitosa un algoritmo en C++ para resolver ecuaciones diferenciales de primer y segundo orden.
Por ultimo quiero agradecer a Lord Guazu por su ayuda en la revisión y corrección tanto de ideas como de gramática y ortografía…
Referencias
1 Shaharuddin Salleh,Albert Y. Zomaya,Sakhinah Abu Bakar, Computing for numerical methods using Visual C++, Wiley-Interscience, 2007
2 S. B. Rao,C. K. Shanta, Numerical methods: with programs in BASIC, FORTRAN, Pascal and C++, Universities Press, 2004
3 S.O. Fatunla, Numerical methods for initial value problems in ordinary differential equations, Acad. Press (1988)
4 J.C. Butcher, The numerical analysis of ordinary differential equations. Runge–Kutta and general linear methods, Wiley (1987)
Apéndice
El código desarrollado en C++ se compiló en los sistemas operativos Linux (OpenSuse 11) y en Windows Xp. Se uso el compilador gratuito GNU gcc version 3.3.3.
Para compilar el código (si se encuentra en una plataforma con sistema operativo linux), la libreria function parser for C++ v2.2x por Warp fparser.hh y fparser.cc deben estar en el mismo directorio que el código fuente .cpp , es posible encontrar una versión actualizada de la libreria en la página del autor http://warp.povusers.org/FunctionParser/, en ese sitio también se encuentra mas información de como se debe compilar la libreria. Si se interesa por el código fuente del software creado, contacte al autor ([email protected])…
Autor:
Oscar Guerrero Miramontes
Página anterior | Volver al principio del trabajo | Página siguiente |