Main Content

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 y' para una primera derivada, y'' 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:

y''=9y

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, y0, así como un periodo de tiempo durante el que obtener la respuesta, (t0,tf). 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 t=[t0,t1,t2,...,tf], así como la solución correspondiente en cada salto y=[y0,y1,y2,...,yf].

Tipos de ODE

Los solvers de ODE de MATLAB® solucionan estos tipos de ODE de primer orden:

  • ODE explícitas con el formato y'=f(t,y).

  • ODE linealmente implícitas con el formato M(t,y)y'=f(t,y), donde M(t,y) 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, y'=M1(t,y)f(t,y). 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 y', 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 y ode23t pueden resolver DAE de índice 1.

  • ODE totalmente implícitas con el formato f(t,y,y')=0. 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,

(y'1y'2y'n)=(f1(t,y1,y2,...,yn)f2(t,y1,y2,...,yn)fn(t,y1,y2,...,yn)),

la función que codifica las ecuaciones devuelve un vector con n elementos, que se corresponden con los valores para y'1,y'2,,y'n. Por ejemplo, considere el sistema de dos ecuaciones

{y'1=y2y'2=y1y22.

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

y1=yy2=y'y3=y''yn=y(n1).

El resultado de estas sustituciones es un sistema de n ecuaciones de primer orden

{y'1=y2y'2=y3y'n=f(t,y1,y2,...,yn).

Por ejemplo, considere la ODE de tercer orden

y'''y''y+1=0.

Utilizar las sustituciones

y1=yy2=y'y3=y''

da como resultado el sistema de primer orden equivalente

{y'1=y2y'2=y3y'3=y1y31.

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

y'=f(t,y),

donde y=y1+iy2. 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:

yv=[Real(y)Imag(y)]fv=[Real(f(t,y))Imag(f(t,y))].

Por ejemplo, si la ODE es y'=yt+2i, 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.

SolverTipo de problemaPrecisiónCuándo utilizarlo
ode45No rígidoMedia

La mayoría de las veces. ode45 debería ser el primer solver que pruebe.

ode23Baja

ode23 puede ser más eficiente que ode45 en problemas con tolerancias crudas o si hay rigidez moderada presente.

ode113De baja a alta

ode113 puede ser más eficiente que ode45 en problemas con tolerancias de error estrictas o cuando resulta caro evaluar la función de ODE.

ode78Alta

ode78 puede ser más eficiente que ode45 en problemas con soluciones suaves que tienen requisitos de precisión elevada.

ode89Alta

ode89 puede ser más eficiente que ode78 con problemas muy suaves, cuando se integran en intervalos de tiempo largos o cuando las tolerancias son especialmente estrictas.

ode15sRígidoDe baja a media

Pruebe ode15s cuando ode45 falle o sea ineficiente y sospeche que el problema es rígido. Utilice también ode15s cuando resuelva ecuaciones algebraicas diferenciales (DAE).

ode23sBaja

ode23s puede ser más eficiente que ode15s en problemas con tolerancias de error crudas. Puede resolver algunos problemas rígidos para los que ode15s no es efectivo.

ode23s calcula la jacobiana en cada salto, así que es útil proporcionar la jacobiana mediante odeset para maximizar la eficiencia y la precisión.

Si hay una matriz de masa, debe ser constante.

ode23tBaja

Utilice ode23t si el problema solo es moderadamente rígido y si necesita una solución sin amortiguación numérica.

ode23t puede resolver ecuaciones algebraicas diferenciales (DAE).

ode23tbBaja

Al igual que ode23s, el solver ode23tb puede ser más eficiente que ode15s en problemas con tolerancias de error crudas.

ode15iTotalmente implícitoBaja

Utilice ode15i para problemas totalmente implícitos f(t,y,y’) = 0 y para ecuaciones algebraicas diferenciales (DAE) de índice 1.

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 ejemploSolver utilizadoOpciones especificadasDescripciónEnlace a la documentación
amp1daeode23t
  • 'Mass'

DAE rígida: circuito eléctrico con matriz de masa singular constante

Solve Stiff Transistor Differential Algebraic Equation
ballodeode23
  • 'Events'

  • 'OutputFcn'

  • 'OutputSel'

  • 'Refine'

  • 'InitialStep'

  • 'MaxStep'

Ubicación de evento sencillo: pelota que rebota

ODE Event Location
batonodeode45
  • 'Mass'

ODE con matriz de masa dependiente del tiempo y del estado: movimiento de un testigo

Solve Equations of Motion for Baton Thrown into Air
brussodeode15s
  • 'JPattern'

  • 'Vectorized'

Problema grande rígido: difusión en una reacción química (el Brusselator)

Solve Stiff ODEs
burgersodeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'JPattern'

  • 'MvPattern'

  • 'RelTol'

  • 'AbsTol'

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
fem1odeode15s
  • 'Mass'

  • 'MStateDependence'

  • 'Jacobian'

Problema rígido con una matriz de masa dependiente del tiempo: método de los elementos finitos

fem2odeode23s
  • 'Mass'

Problema rígido con una matriz de masa constante: método de los elementos finitos

hb1odeode15s

Problema de ODE rígida resuelto en un intervalo muy largo: reacción química de Robertson

hb1daeode15s
  • 'Mass'

  • 'RelTol'

  • 'AbsTol'

  • 'Vectorized'

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)
ihb1daeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

DAE totalmente implícita rígida: reacción química de Robertson

Solve Robertson Problem as Implicit Differential Algebraic Equations (DAEs)
iburgersodeode15i
  • 'RelTol'

  • 'AbsTol'

  • 'Jacobian'

  • 'JPattern'

Sistema de ODE implícita: ecuación de Burgers

kneeodeode15s
  • 'NonNegative'

El "problema de rodilla" con restricciones de no negatividad

Nonnegative ODE Solution
orbitodeode45
  • 'RelTol'

  • 'AbsTol'

  • 'Events'

  • 'OutputFcn'

Ubicación de eventos avanzada: problema de los tres cuerpos restringido

ODE Event Location
rigidodeode45

Problema no rígido: ecuaciones de Euler de un cuerpo rígido sin fuerzas externas

Solve Nonstiff ODEs
vdpodeode15s
  • 'Jacobian'

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.

Consulte también

|

Temas relacionados

Sitios web externos