Elegir un solver de ODE
Ecuaciones diferenciales ordinarias
Una ecuación diferencial ordinaria (ODE) contiene una o más derivadas de una variable dependiente, y, con respecto a una variable independiente única, t, a la que normalmente se hace referencia como tiempo. La notación que se utiliza aquí para representar las derivadas de y con respecto a t es para una primera derivada, para una segunda derivada, etc. El orden de la ODE es igual a la derivada de orden más alto de y que aparece en la ecuación.
Por ejemplo, esta es una ODE de segundo orden:
En un problema de valores iniciales, la ODE se resuelve empezando por un estado inicial. La solución se obtiene de forma iterativa utilizando la condición inicial, , así como un periodo de tiempo durante el que obtener la respuesta, . En cada salto, el solver aplica un algoritmo particular a los resultados de saltos anteriores. En el primero de esos saltos, la condición inicial proporciona la información necesaria que permite que la integración continúe. El resultado final es que el solver de ODE devuelve un vector de unidades de tiempo , así como la solución correspondiente en cada salto .
Tipos de ODE
Los solvers de ODE de MATLAB® solucionan estos tipos de ODE de primer orden:
ODE explícitas con el formato .
ODE linealmente implícitas con el formato , donde es una matriz de masa no singular. La matriz de masa puede ser dependiente del tiempo o del estado, o puede ser una matriz constante. Las ODE linealmente implícitas implican combinaciones lineales de la primera derivada de y, que están codificadas en la matriz de masa.
Las ODE linealmente implícitas siempre se pueden transformar a formato explícito, . Sin embargo, especificar la matriz de masa directamente en el solver de ODE evita esta transformación, que no es práctica y puede ser computacionalmente costosa.
Si faltan algunos componentes de , las ecuaciones se llaman ecuaciones algebraicas diferenciales o DAE, y el sistema de DAE contiene algunas variables algebraicas. Las variables algebraicas son variables dependientes cuyas derivadas no aparecen en las ecuaciones. Un sistema de varias DAE se puede reescribir como un sistema equivalente de varias ODE de primer orden tomando derivadas de las ecuaciones para eliminar las variables algebraicas. El número de derivadas necesario para reescribir una DAE como una ODE se denomina índice diferencial. Los solvers
ode15s
yode23t
pueden resolver DAE de índice 1.ODE totalmente implícitas con el formato . Las ODE totalmente implícitas no se pueden reescribir con formato explícito y pueden contener también algunas variables algebraicas. El solver
ode15i
está diseñado para problemas totalmente implícitos, incluidas DAE de índice 1.
Puede proporcionar información adicional al solver para algunos tipos de problemas utilizando la función odeset
para crear una estructura de opciones.
Sistemas de varias ODE
Puede especificar cualquier número de ecuaciones de ODE acopladas para resolver y, en principio, el número de ecuaciones solo está limitado por la memoria de ordenador disponible. Si el sistema de ecuaciones tiene n ecuaciones,
la función que codifica las ecuaciones devuelve un vector con n elementos, que se corresponden con los valores para . Por ejemplo, considere el sistema de dos ecuaciones
Una función que codifica estas ecuaciones es
function dy = myODE(t,y) dy(1) = y(2); dy(2) = y(1)*y(2)-2; end
ODE de orden superior
Los solvers de ODE de MATLAB solo resuelven ecuaciones de primer orden. Debe reescribir las ODE de orden superior como un sistema equivalente de ecuaciones de primer orden utilizando las sustituciones genéricas
El resultado de estas sustituciones es un sistema de n ecuaciones de primer orden
Por ejemplo, considere la ODE de tercer orden
Utilizar las sustituciones
da como resultado el sistema de primer orden equivalente
El código para este sistema de ecuaciones es
function dydt = f(t,y) dydt(1) = y(2); dydt(2) = y(3); dydt(3) = y(1)*y(3)-1; end
ODE complejas
Considere la ecuación de ODE compleja
donde . Para resolverla, separe las partes real e imaginaria en componentes de solución diferentes y, después, vuelva a combinar los resultados al final. Conceptualmente, esto presenta el siguiente aspecto:
Por ejemplo, si la ODE es , puede representar la ecuación utilizando el archivo de función:
function f = complexf(t,y) f = y.*t + 2*i; end
Después, el código para separar las partes real e imaginaria es
function fv = imaginaryODE(t,yv) % Construct y from the real and imaginary components y = yv(1) + i*yv(2); % Evaluate the function yp = complexf(t,y); % Return real and imaginary in separate components fv = [real(yp); imag(yp)]; end
Cuando ejecuta un solver para obtener la solución, la condición inicial y0
también se separa en partes real e imaginaria para proporcionar una condición inicial para cada componente de solución.
y0 = 1+i; yv0 = [real(y0); imag(y0)]; tspan = [0 2]; [t,yv] = ode45(@imaginaryODE, tspan, yv0);
Una vez que obtenga la solución, combine los componentes real e imaginario para obtener el resultado final.
y = yv(:,1) + i*yv(:,2);
Selección de un solver básico
ode45
funciona bien con la mayoría de los problemas de ODE y debería ser, en general, la opción de solver preferida. Sin embargo, ode23
, ode78
, ode89
y ode113
pueden ser más eficientes que ode45
para problemas con requisitos de precisión menos o más estrictos.
Algunos de los problemas de ODE presentan rigidez o dificultad en la evaluación. "Rigidez" es un término difícil de definir con precisión, pero, en general, la rigidez se produce cuando hay una diferencia de escalado en algún lugar del problema. Por ejemplo, si una ODE tiene dos componentes de solución que varían en escalas de tiempo drásticamente diferentes, la ecuación puede ser rígida. Puede identificar un problema como rígido si los solvers no rígidos (como ode45
) no pueden resolver el problema o son extremadamente lentos. Si observa que un solver no rígido es muy lento, pruebe a usar un solver rígido como ode15s
en su lugar. Cuando usa un solver rígido, puede mejorar la fiabilidad y la eficiencia proporcionando la matriz jacobiana o su patrón de dispersión.
Esta tabla proporciona directrices generales sobre cuándo usar cada uno de los diferentes solvers.
Solver | Tipo de problema | Precisión | Cuándo utilizarlo |
---|---|---|---|
ode45 | No rígido | Media | La mayoría de las veces. |
ode23 | Baja |
| |
ode113 | De baja a alta |
| |
ode78 | Alta |
| |
ode89 | Alta |
| |
ode15s | Rígido | De baja a media | Pruebe |
ode23s | Baja |
Si hay una matriz de masa, debe ser constante. | |
ode23t | Baja | Utilice
| |
ode23tb | Baja | Al igual que | |
ode15i | Totalmente implícito | Baja | Utilice |
Para ver detalles y más recomendaciones sobre cuándo usar cada solver, consulte [5].
Resumen de archivos y ejemplos de ODE
Hay varios archivos de ejemplo disponibles que sirven como puntos iniciales perfectos para la mayoría de los problemas de ODE. Para ejecutar la app Differential Equations Examples, que permite explorar y ejecutar ejemplos con facilidad, escriba
odeexamples
Para abrir un archivo de ejemplo individual para editar, escriba
edit exampleFileName.m
Para ejecutar un ejemplo, escriba
exampleFileName
Esta tabla contiene una lista de los archivos de ejemplo de ODE y de DAE disponibles, así como de los solvers y las opciones que utilizan. Se incluyen enlaces para el subconjunto de ejemplos que también se publican directamente en la documentación.
Archivo de ejemplo | Solver utilizado | Opciones especificadas | Descripción | Enlace a la documentación |
---|---|---|---|---|
amp1dae | ode23t |
| DAE rígida: circuito eléctrico con matriz de masa singular constante | Solve Stiff Transistor Differential Algebraic Equation |
ballode | ode23 |
| Ubicación de evento sencillo: pelota que rebota | ODE Event Location |
batonode | ode45 |
| ODE con matriz de masa dependiente del tiempo y del estado: movimiento de un testigo | Solve Equations of Motion for Baton Thrown into Air |
brussode | ode15s |
| Problema grande rígido: difusión en una reacción química (el Brusselator) | Solve Stiff ODEs |
burgersode | ode15s |
| ODE con matriz de masa muy dependiente del estado: ecuación de Burgers resuelta utilizando una técnica de malla móvil | Solve ODE with Strongly State-Dependent Mass Matrix |
fem1ode | ode15s |
| Problema rígido con una matriz de masa dependiente del tiempo: método de los elementos finitos | — |
fem2ode | ode23s |
| Problema rígido con una matriz de masa constante: método de los elementos finitos | — |
hb1ode | ode15s | — | Problema de ODE rígida resuelto en un intervalo muy largo: reacción química de Robertson | — |
hb1dae | ode15s |
| DAE linealmente implícita rígida de una ley de conservación: reacción química de Robertson | Solve Robertson Problem as Semi-Explicit Differential Algebraic Equations (DAEs) |
ihb1dae | ode15i |
| DAE totalmente implícita rígida: reacción química de Robertson | Solve Robertson Problem as Implicit Differential Algebraic Equations (DAEs) |
iburgersode | ode15i |
| Sistema de ODE implícita: ecuación de Burgers | — |
kneeode | ode15s |
| El "problema de rodilla" con restricciones de no negatividad | Nonnegative ODE Solution |
orbitode | ode45 |
| Ubicación de eventos avanzada: problema de los tres cuerpos restringido | ODE Event Location |
rigidode | ode45 | — | Problema no rígido: ecuaciones de Euler de un cuerpo rígido sin fuerzas externas | Solve Nonstiff ODEs |
vdpode | ode15s |
| Ecuación de van der Pol parametrizable (rígida para μ grande) | Solve Stiff ODEs |
Referencias
[1] Shampine, L. F. and M. K. Gordon, Computer Solution of Ordinary Differential Equations: the Initial Value Problem, W. H. Freeman, San Francisco, 1975.
[2] Forsythe, G., M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, New Jersey, 1977.
[3] Kahaner, D., C. Moler, and S. Nash, Numerical Methods and Software, Prentice-Hall, New Jersey, 1989.
[4] Shampine, L. F., Numerical Solution of Ordinary Differential Equations, Chapman & Hall, New York, 1994.
[5] Shampine, L. F. and M. W. Reichelt, “The MATLAB ODE Suite,” SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1–22.
[6] Shampine, L. F., Gladwell, I. and S. Thompson, Solving ODEs with MATLAB, Cambridge University Press, Cambridge UK, 2003.