jueves, 23 de agosto de 2012

Ecuaciones Diferenciales en Octave (Laboratorio)

Octave cuenta con funciones integradas que resuelven ecuaciones diferenciales no lineales, para resolver este tipo de ecuaciones Octave utiliza la función lsode (the Livermore Solver for Ordinary Differential Equations, descrita en A. C. Hindmarsh, ODEPACK, a Systematized Collection of ODE Solvers, in: Scientific Computing, R. S. Stepleman et al. (Eds.), North-Holland, Amsterdam, 1983, pages 55–64). Dichas ecuaciones deben ser de la forma:


Cabe mencionar que la solución que proporciona Octave es puramente numérica, es una matriz x, con cada filacorrespondiente a un elemento del vector t. El primer elemento de t debe ser t_0 (t subíndice 0 o t inicial) y debe corresponder al estado inicial del sistema x_0, de modo que la primera fila de la salida es x_0 y utilizando dicha matriz puedes obtener con gnuplot una gráfica demostrativa de como se comporta la ecuación en un intervalo determinado. Así que no te esperes resultados con variables, diferenciales y/o constantes como te lo daría un método convencional de solución.

Hay 4 pasos para resolver una ecuación diferencial en octave:

  1. El primer paso es definir una función que represente a la ecuación diferencial.
  2. El segundo paso es definir un vector que represente los valores que va a tomar la variable independiente (x).
  3. El tercer paso es definir la condición inicial para la ecuación.
  4. El cuarto y ùltimo paso es usar el comando lsode para integrar y resolver la ecuación diferencial.

Ahora explicaré un ejemplo para demostrar el funcionamiento de lsode.
La ecuación diferencial no lineal de primer orden que utilizaré para este ejemplo es:

dx/dt = ((e^-t) / (x^2))  con x_0 = 1 y en un rango de [0,20]


Con la terminal abierta en octave

octave:1> function suprema = f(x,t)   "aquí declaramos la funcion con el 
                                                         nombre suprema y de la forma f(x,t)"
> suprema = e^-t / x^2;                    "igualamos la funcion suprema con
                                                          nuestra ecuacion diferencial"
> endfunction                                     "comando con el que indicamos que
                                                          terminamos de definir la ecuacion"
octave:2> x_0 = 1;                             "aquí declaramos el valor inicial de la 
                                                          x_0 yo le puse 1"
octave:3> t = linspace(0, 20);            "declaramos los valores de la variable
                                                          t con la funcion de linspace que crea
                                                         un vector utilizando como parámetros
                                                         los intervalos definidos para evaluar
                                                         la ecuación."
octave:4> y = lsode("f", x_0, t);  "aquí indicamos que lsode que toma como
                                                       parámetros primero la función que 
                                                       declaramos, después el valor que
                                                      le dimos de "x_0" y por ùltimo la 
                                                      variable "t" que contiene el vector
                                                      de los intervalos en que queremos 
                                                      resolver la ecuación. (Si queremos ver
                                                      los valores que calculó para "y" 
                                                      omitimos el ; del final, pero en este
                                                      ejemplo mostraré la gráfica de la
                                                    función para una mejor  representación). 
octave:5> plot (t, y)                      "aquí ya sólo con la función plot  
                                                     hacemos la referencia que queremos la
                                                     gráfica de "t" con respecto a "y"

NOTA: y = x(t)  

La gráfica que nos arroja es la siguiente:




Por ùltimo sólo para comprobar los resultados que obtuve con octave, decidí usar Wolfram|Alpha para resolver la misma ecuación y obtuve el siguiente resultado:


Si comparamos las gráficas podemos ver que quitando las dimensiones son casi idénticas por lo que concluyo podemos confiar en la función lsode de octave cuando necesitemos resolver y/o representar ecuaciones diferenciales no lineales.





Referencias:
http://www.gnu.org/software/octave/doc/interpreter/Simple-Examples.html
http://www.youtube.com/watch?v=Rgu_ZkjIFFE
http://linuxandygt.blogspot.mx/2012/06/ecuaciones-diferenciales-no-lineales.html
http://homepages.math.uic.edu/~hanson/Octave/OctaveODE-EG.html
https://computation.llnl.gov/casc/nsde/pubs/u113855.pdf
http://softwarelibre.unsa.edu.ar/docs/descarga/2003/curso/htmls/octave/x24.html
ftp://ftp.inf.utfsm.cl/pub/Linux/Docs/LuCaS/Presentaciones/200304curso-glisa/octave/curso-glisa-octave-html/x853.html
http://webdelprofesor.ula.ve/ciencias/nunez/cursos/MetodosMatematicos2/2008B/S05_C13.pdf






2 comentarios:

  1. Hubiera sido interesante saber qué algoritmo ocupa Octave para resolver la ecuación que les das ;) Van 14 pts.

    ResponderEliminar
  2. Hola, tu foro es bastante nefasto; resulta que tengo un kilombo de problema y tu basura no me sirve. Sos terrible Inutil.

    Saludos cordiales, y exito en tu nefasta vida

    ResponderEliminar