Main Content

ode23

Resolver ecuaciones diferenciales no rígidas; método de orden bajo

Descripción

ejemplo

[t,y] = ode23(odefun,tspan,y0), donde tspan = [t0 tf], integra el sistema de ecuaciones diferenciales y'=f(t,y) de t0 a tf con condiciones iniciales y0. Cada fila del arreglo de solución y se corresponde con un valor devuelto en el vector columna t.

Todos los solvers de ODE de MATLAB® pueden resolver sistemas de ecuaciones con el formato y'=f(t,y), o problemas que incluyen una matriz de masa, M(t,y)y'=f(t,y). Todos los solvers utilizan sintaxis similares. El solver ode23s solo puede resolver problemas con una matriz de masa si la matriz de masa es constante. ode15s y ode23t pueden resolver problemas con una matriz de masa que es singular, conocidos como ecuaciones algebraicas diferenciales (DAE). Especifique la matriz de masa utilizando la opción Mass de odeset.

ejemplo

[t,y] = ode23(odefun,tspan,y0,options) también utiliza la configuración de integración definida por options, que es un argumento creado utilizando la función odeset. Por ejemplo, utilice las opciones AbsTol y RelTol para especificar tolerancias a errores absolutas y relativas, o la opción Mass para proporcionar una matriz de masa.

[t,y,te,ye,ie] = ode23(odefun,tspan,y0,options) también encuentra dónde son cero las funciones de (t,y), denominadas funciones de evento. En la salida, te es el tiempo del evento, ye es la solución en el momento del evento e ie es el índice del evento activado.

Para cada función de evento, especifique si la integración debe terminar en un cero y si la dirección del cruce por cero tiene importancia. Hágalo estableciendo la propiedad 'Events' en una función, como myEventFcn o @myEventFcn, y creando una función correspondiente: [value,isterminal,direction] = myEventFcn(t,y). Para obtener más información, consulte Ubicación de eventos de EDO.

sol = ode23(___) devuelve una estructura que puede usar con deval para evaluar la solución en cualquier punto del intervalo [t0 tf]. Puede utilizar cualquiera de las combinaciones de argumentos de entrada de las sintaxis anteriores.

Ejemplos

contraer todo

Las ODE sencillas que tienen un solo componente de solución pueden especificarse como función anónima en la llamada al solver. La función anónima debe aceptar dos entradas (t,y), aunque una de las entradas no se utilice en la función.

Resuelva la ODE

y=2t.

Especifique un intervalo de tiempo de [0 5] y la condición inicial y0 = 0.

tspan = [0 5];
y0 = 0;
[t,y] = ode23(@(t,y) 2*t, tspan, y0);

Represente la solución.

plot(t,y,'-o')

Figure contains an axes object. The axes object contains an object of type line.

La ecuación de van der Pol es una ODE de segundo orden

$$y''_1 - \mu \left( 1 - y_1^2\right) y'_1+y_1=0,$$

donde $\mu > 0$ es un parámetro de escalar. Vuelva a escribir esta ecuación como un sistema de ODE de primer orden haciendo la sustitución $y'_1 = y_2$. El sistema resultante de las ODE de primer orden es

$$
\begin{array}{cl}
y'_1 &= y_2\\
y'_2 &= \mu (1-y_1^2) y_2 - y_1.\end{array}
$$

El archivo de función vdp1.m representa la ecuación de van der Pol utilizando $\mu = 1$. Las variables $y_1$ y $y_2$ son las entradas y(1) e y(2) de un vector de dos elementos dydt.

function dydt = vdp1(t,y)
%VDP1  Evaluate the van der Pol ODEs for mu = 1
%
%   See also ODE113, ODE23, ODE45.

%   Jacek Kierzenka and Lawrence F. Shampine
%   Copyright 1984-2014 The MathWorks, Inc.

dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];

Resuelva la ODE utilizando la función ode23 en el intervalo de tiempo [0 20] con los valores iniciales [2 0]. La salida resultante es un vector columna de puntos de tiempo t y un arreglo de solución y. Cada fila en y se corresponde con un tiempo devuelto en la fila correspondiente de t. La primera columna de y se corresponde con $y_1$ y la segunda se corresponde con $y_2$.

[t,y] = ode23(@vdp1,[0 20],[2; 0]);

Represente las soluciones para $y_1$ y $y_2$ con respecto a t.

plot(t,y(:,1),'-o',t,y(:,2),'-o')
title('Solution of van der Pol Equation (\mu = 1) with ODE23');
xlabel('Time t');
ylabel('Solution y');
legend('y_1','y_2')

ode23 funciona solo con funciones que utilizan dos argumentos de entrada, t e y. Sin embargo, puede pasar parámetros extra definiéndolos fuera de la función y pasándolos cuando especifique el identificador de función.

Resuelva la ODE

$$y'' = \frac{A}{B} t y.$$

Si vuelve a escribir la ecuación como un sistema de primer orden, obtendrá

$$\begin{array}{cl} y'_1 &= y_2\\ y'_2 &= \frac{A}{B} t y_1.
\end{array}$$

odefcn.m representa este sistema de ecuaciones como una función que acepta cuatro argumentos de entrada: t, y, A y B.

function dydt = odefcn(t,y,A,B)
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = (A/B)*t.*y(1);

Resuelva la ODE utilizando ode23. Especifique el identificador de función para que pase los valores predefinidos para A y B a odefcn.

A = 1;
B = 2;
tspan = [0 5];
y0 = [0 0.01];
[t,y] = ode23(@(t,y) odefcn(t,y,A,B), tspan, y0);

Represente los resultados.

plot(t,y(:,1),'-o',t,y(:,2),'-.')

En comparación con ode45, el solver ode23 soluciona mejor los problemas con tolerancias de errores aproximadas.

Compare el rendimiento de ode45 y ode23 solucionando la ODE moderadamente rígida

y=-λy

para λ=1000. Esta ODE es una ecuación de prueba que se vuelve más rígida a medida que aumenta el valor de λ. Use odeset para activar la visualización de las estadísticas del solver.

opts = odeset('Stats','on');
tspan = [0 2];
y0 = 1;
lambda = 1e3;
subplot(1,2,1)
tic, ode45(@(t,y) -lambda*y, tspan, y0, opts), toc
615 successful steps
35 failed attempts
3901 function evaluations
Elapsed time is 1.749528 seconds.
title('ode45')
subplot(1,2,2)
tic, ode23(@(t,y) -lambda*y, tspan, y0, opts), toc
822 successful steps
2 failed attempts
2473 function evaluations
Elapsed time is 1.114290 seconds.
title('ode23')

Figure contains 2 axes objects. Axes object 1 with title ode45 contains 2 objects of type line. Axes object 2 with title ode23 contains 2 objects of type line.

Para este problema moderadamente rígido, ode23 se ejecuta ligeramente más rápido que ode45 y también presenta menos pasos fallidos. Los tamaños de los pasos dados por ode45 y ode23 para este problema están limitados por los requisitos de estabilidad de la ecuación, en lugar de la precisión. Puesto que los pasos dados por ode23 son más sencillos que con ode45, el solver ode23 se ejecuta más rápidamente, aunque necesita más pasos.

Argumentos de entrada

contraer todo

Funciones que resolver, especificadas como identificador de función que define las funciones que se desea integrar.

La función dydt = odefun(t,y), para un escalar t y un vector columna y, debe devolver un vector columna dydt de tipo de datos single o double que se corresponda con f(t,y). odefun debe aceptar tanto argumentos de entrada t como y, aunque uno de los argumentos no se utilice en la función.

Por ejemplo, para resolver y'=5y3, utilice la función:

function dydt = odefun(t,y)
dydt = 5*y-3;
end

Para un sistema de ecuaciones, la salida de odefun es un vector. Cada elemento del vector es el valor calculado del lado derecho de una ecuación. Por ejemplo, considere el sistema de dos ecuaciones

y'1=y1+2y2y'2=3y1+2y2

Una función que calcula el valor del lado derecho de cada ecuación en cada unidad de tiempo es

function dydt = odefun(t,y)
dydt = zeros(2,1);
dydt(1) = y(1)+2*y(2);
dydt(2) = 3*y(1)+2*y(2);
end

Para obtener información sobre cómo proporcionar parámetros adicionales a la función odefun, consulte Parametrizar funciones.

Ejemplo: @myFcn

Tipos de datos: function_handle

Intervalo de integración, especificado como vector. Como mínimo, tspan debe ser un vector de dos elementos [t0 tf] que especifique el momento inicial y final. Para obtener soluciones en momentos específicos entre t0 y tf, utilice un vector más largo con el formato [t0,t1,t2,...,tf]. Los elementos de tspan deben ser todos crecientes o todos decrecientes.

El solver impone las condiciones iniciales proporcionadas por y0 en el momento inicial tspan(1) y, después, integra desde tspan(1) hasta tspan(end):

  • Si tspan tiene dos elementos [t0 tf], el solver devuelve la solución evaluada en cada salto de integración interno dentro del intervalo.

  • Si tspan tiene más de dos elementos [t0,t1,t2,...,tf], el solver devuelve la solución evaluada en los puntos proporcionados. Sin embargo, el solver no salta con precisión a cada punto especificado en tspan. En su lugar, el solver utiliza sus propios saltos internos para calcular la solución y, a continuación, la evalúa en los puntos solicitados en tspan. Las soluciones generadas en los puntos especificados son del mismo orden de precisión que las soluciones calculadas en cada salto interno.

    El hecho de especificar varios puntos intermedios no afecta mucho a la eficiencia del cálculo, pero puede afectar a la administración de la memoria en el caso de sistemas grandes.

El solver utiliza los valores de tspan para calcular valores adecuados para InitialStep y MaxStep:

  • Si tspan contiene varios puntos intermedios [t0,t1,t2,...,tf], los puntos especificados dan una noción de la escala para el problema, que puede afectar al valor de InitialStep utilizado por el solver. Por lo tanto, es posible que la solución obtenida por el solver sea distinta en función de si especifica tspan como un vector de dos elementos o como un vector con puntos intermedios.

  • Los valores iniciales y finales en tspan se utilizan para calcular el tamaño máximo del salto MaxStep. Por lo tanto, si cambia los valores iniciales o finales en tspan, es posible que el solver utilice una secuencia de saltos distinta, lo que podría cambiar la solución.

Ejemplo: [1 10]

Ejemplo: [1 3 5 7 9 10]

Tipos de datos: single | double

Condiciones iniciales, especificadas como vector. y0 debe tener la misma longitud que el vector de salida de odefun, de forma que y0 contenga una condición inicial para cada ecuación definida en odefun.

Tipos de datos: single | double

Estructura de opciones, especificada como arreglo de estructuras. Use la función odeset para crear o modificar la estructura de options. Consulte Resumen de opciones de ODE para obtener una lista de las opciones compatibles con cada solver.

Ejemplo: options = odeset('RelTol',1e-5,'Stats','on','OutputFcn',@odeplot) especifica una tolerancia a errores relativa de 1e-5, activa la visualización de las estadísticas del solver y especifica la función de salida @odeplot para representar la solución mientras se calcula.

Tipos de datos: struct

Argumentos de salida

contraer todo

Puntos de evaluación, devueltos como vector columna.

  • Si tspan contiene dos elementos [t0 tf], t contiene los puntos de evaluación internos utilizados para realizar la integración.

  • Si tspan contiene más de dos elementos, t es lo mismo que tspan.

Soluciones, devueltas como arreglo. Cada fila en y se corresponde con la solución en el valor devuelto en la fila correspondiente de t.

Momento de eventos, devuelto como vector columna. Los momentos de evento en te se corresponden con las soluciones devueltas en ye, e ie especifica qué evento ha ocurrido.

Solución en momento de eventos, devuelta como arreglo. Los momentos de evento en te se corresponden con las soluciones devueltas en ye, e ie especifica qué evento ha ocurrido.

Índice de función de evento activado, devuelto como vector columna. Los momentos de evento en te se corresponden con las soluciones devueltas en ye, e ie especifica qué evento ha ocurrido.

Estructura de evaluación, especificada como arreglo de estructuras. Utilice esta estructura con la función deval para evaluar la solución en cualquier punto del intervalo [t0 tf]. El arreglo de estructuras sol siempre incluye estos campos:

Campo de estructuraDescripción

sol.x

Vector fila de los saltos elegidos por el solver.

sol.y

Soluciones. Cada columna sol.y(:,i) contiene la solución en el momento sol.x(i).

sol.solver

Nombre del solver.

Además, si especifica la opción Events de odeset y se detectan eventos, sol también incluye estos campos:

Campo de estructuraDescripción

sol.xe

Puntos donde ocurrieron los eventos. sol.xe(end) contiene el punto exacto de un evento terminal, en su caso.

sol.ye

Soluciones que se corresponden con eventos en sol.xe.

sol.ie

Índices en el vector devueltos por la función especificada en la opción Events. Los valores indican qué evento detectó el solver.

Algoritmos

ode23 es una implementación de un par Runge-Kutta (2,3) explícito de Bogacki y Shampine. Puede ser más eficiente que ode45 en tolerancias de errores aproximadas y en presencia de una rigidez moderada. ode23 es un solver de un único paso [1], [2].

Referencias

[1] Bogacki, P. and L. F. Shampine, “A 3(2) pair of Runge-Kutta formulas,” Appl. Math. Letters, Vol. 2, 1989, pp. 321–325.

[2] Shampine, L. F. and M. W. Reichelt, “The MATLAB ODE Suite,” SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1–22.

Capacidades ampliadas

Historial de versiones

Introducido antes de R2006a