Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

ode45

Resolver ecuaciones diferenciales no rígidas: método de orden medio

Descripción

ejemplo

[t,y] = ode45(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 array de soluciones y corresponde a un valor devuelto en el vector de columna t.

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

ode45 es un versátil solver de ODE y es el primer solver que debe probar para la mayoría de los problemas. Sin embargo, si el problema es rígido o requiere una alta precisión, entonces hay otros solvers de ODE que podrían estar mejor adaptados al problema. Para obtener más información, consulte Elija un solucionador de ODE.

ejemplo

[t,y] = ode45(odefun,tspan,y0,options) también utiliza la configuración de integración definida por options, que es un argumento creado mediante la función odeset. Por ejemplo, utilice las opciones AbsTol y RelTol para especificar las tolerancias de error absoluta y relativa, o la opción Mass para proporcionar una matriz de masas.

[t,y,te,ye,ie] = ode45(odefun,tspan,y0,options) además halla dónde las funciones de (t,y), llamadas funciones de eventos, son cero. En la salida, te es la hora del evento, ye es la solución en el momento del evento y ie es el índice del evento desencadenado.

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 importa. Para ello, establezca la propiedad 'Events' como una función, como myEventFcn o @myEventFcn, y cree una función correspondiente: [value,isterminal,direction] = myEventFcn(t,y). Para obtener más información, consulte Ubicación del evento ODE.

ejemplo

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

Ejemplos

contraer todo

Las ODE simples que tienen un componente de solución única pueden especificarse como una función anónima en la llamada al solver. La función anónima debe aceptar dos entradas (t,y) incluso si no se utiliza una de las entradas.

Resuelva la ODE.

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

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

Trace la solución.

plot(t,y,'-o')

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

donde es un parámetro escalar. Reescriba esta ecuación como un sistema de ODES de primer orden realizando la sustitución . El sistema resultante de ODE de primer orden es

El archivo de función vdp1.m representa la ecuación de van der Pol mediante . Las variables y son las entradas y(1) y 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 mediante la función ode45 en el intervalo de tiempo [0 20] con los valores iniciales [2 0]. La salida resultante es un vector de columna de puntos temporales t y un array de soluciones y. Cada fila de y corresponde a un momento devuelto en la fila correspondiente de t. La primera columna de y corresponde a y la segunda columna a .

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

Trace las soluciones para y con respecto a t.

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

ode45 solo funciona con funciones que utilizan dos argumentos de entrada, t e y. Sin embargo, puede pasar parámetros adicionales al definirlos fuera de la función y pasarlos cuando especifique el identificador de función.

Resuelva la ODE.

Reescribir la ecuación como un sistema de primer orden da como resultado

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 mediante ode45. Especifique el identificador de función de forma que pase los valores predefinidos para A y B a odefcn.

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

Trace los resultados.

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

Tenga en cuenta la siguiente ODE con parámetros dependientes del tiempo.

La condición inicial es . La función f(t) se define mediante el vector n por 1 f evaluado en los momentos ft. La función g(t) se define mediante el vector m por 1 g evaluado en los momentos gt.

Cree los vectores f y g.

ft = linspace(0,5,25);
f = ft.^2 - ft - 3;

gt = linspace(1,6,25);
g = 3*sin(gt-0.25);

Escriba una función denominada myode que interpole f y g para obtener el valor de los términos dependientes del tiempo en el momento especificado. Guarde la función en la carpeta actual para ejecutar el resto del ejemplo.

La función myode acepta argumentos de entrada adicionales para evaluar la ODE en cada paso de tiempo, pero ode45 solo utiliza los dos primeros argumentos de entrada t e y.

function dydt = myode(t,y,ft,f,gt,g)
f = interp1(ft,f,t); % Interpolate the data set (ft,f) at time t
g = interp1(gt,g,t); % Interpolate the data set (gt,g) at time t
dydt = -f.*y + g; % Evaluate ODE at time t

Resuelva la ecuación durante el intervalo de tiempo [1 5] mediante ode45. Especifique la función mediante un identificador de función para que ode45 utilice solo los dos primeros argumentos de entrada de myode. Además, atenúe los umbrales de error mediante odeset.

tspan = [1 5];
ic = 1;
opts = odeset('RelTol',1e-2,'AbsTol',1e-4);
[t,y] = ode45(@(t,y) myode(t,y,ft,f,gt,g), tspan, ic, opts);

Trace la solución, y, como una función de los puntos temporales, t.

plot(t,y)

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

Resuelva la ecuación de van der Pol con mediante ode45. La función vdp1.m se incluye con MATLAB® y codifica las ecuaciones. Especifique una salida única para devolver una estructura que contenga información acerca de la solución, como el solver y los puntos de evaluación.

tspan = [0 20];
y0 = [2 0];
sol = ode45(@vdp1,tspan,y0)
sol = struct with fields:
     solver: 'ode45'
    extdata: [1x1 struct]
          x: [1x60 double]
          y: [2x60 double]
      stats: [1x1 struct]
      idata: [1x1 struct]

Utilice linspace para generar 250 puntos en el intervalo [0 20]. Evalúe la solución en estos puntos mediante deval.

x = linspace(0,20,250);
y = deval(sol,x);

Trace el primer componente de la solución.

plot(x,y(1,:))

Amplíe la solución a mediante odextend y agregue el resultado al gráfico original.

sol_new = odextend(sol,@vdp1,35);
x = linspace(20,35,350);
y = deval(sol_new,x);
hold on
plot(x,y(1,:),'r')

Argumentos de entrada

contraer todo

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

La función dydt = odefun(t,y), para un escalar t y un vector de columna y, debe devolver un vector de columna dydt con el tipo de datos single o double que corresponde a f(t,y). odefun debe aceptar ambos argumentos de entrada, t e y, incluso si uno de los argumentos no se utiliza en la función.

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

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

Para un sistema de ecuaciones, la salida de odefun es un vector. Cada elemento del vector es la solución a una ecuación. Por ejemplo, para resolver

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

utilice la función:

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

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 los tiempos inicial y final. Para obtener soluciones en momentos concretos entre t0 y tf, utilice un vector más largo con la forma [t0,t1,t2,...,tf]. Los elementos de tspan deben ser todos crecientes o decrecientes.

El solver impone las condiciones iniciales dadas por y0 en la hora inicial tspan(1) y, después, integra de tspan(1) a tspan(end):

  • Si tspan tiene dos elementos, [t0 tf], el solver devuelve la solución evaluada en cada paso de integración interna 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 dados. Sin embargo, el solver no realiza un paso exacto a cada punto especificado en tspan. En su lugar, el solver utiliza sus propios pasos internos para calcular la solución y, a continuación, evalúa la solución en los puntos solicitados de tspan. Las soluciones producidas en los puntos especificados son del mismo orden de precisión que las soluciones calculadas en cada paso interno.

    La especificación de varios puntos intermedios tiene poco efecto en la eficacia del cálculo, pero para los sistemas grandes puede afectar a la gestión de la memoria.

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

  • Si tspan contiene varios puntos intermedios [t0,t1,t2,...,tf], los puntos especificados dan una indicación de la escala del problema, que puede afectar al valor de InitialStep utilizado por el solver. Por lo tanto, la solución obtenida por el solver puede variar dependiendo de si se especifica tspan como un vector de dos elementos o como un vector con puntos intermedios.

  • Los valores iniciales y finales de tspan se utilizan para calcular el tamaño de paso máximo MaxStep. Por lo tanto, cambiar los valores iniciales o finales en tspan podría hacer que el solver utilizara una secuencia de pasos diferente, 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 un vector. y0 debe tener la misma longitud que la salida vectorial de odefun, de modo que y0 contiene una condición inicial para cada ecuación definida en odefun.

Tipos de datos: single | double

Estructura de opciones, especificada como un array de estructura. Utilice la función odeset para crear o modificar la estructura de opciones. Consulte Resumen de las opciones 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 de error relativa de 1e-5, activa la visualización de las estadísticas del solver y especifica la función de salida @odeplot para trazar la solución tal y como se calcula.

Tipos de datos: struct

Argumentos de salida

contraer todo

Puntos de evaluación, devueltos como vector de 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 igual que tspan.

Soluciones, devueltas como un array. Cada fila de y corresponde a la solución en el valor devuelto en la fila correspondiente de t.

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

Solución en el momento de los eventos, devuelta como un array. Los momentos de los eventos de te corresponden a las soluciones devueltas en ye e ie especifica qué evento se produjo.

Índice de la función del evento de desaparición, devuelto como vector de columna. Los momentos de los eventos de te corresponden a las soluciones devueltas en ye e ie especifica qué evento se produjo.

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

Campo de estructuraDescripción

sol.x

Vector de fila de los pasos 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 y se detectan eventos, sol también incluye estos campos:

Campo de estructuraDescripción

sol.xe

Puntos correspondientes al momento en que ocurrieron los eventos. sol.xe(end) contiene el punto exacto de un evento terminal, si existe.

sol.ye

Soluciones que corresponden a eventos de sol.xe.

sol.ie

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

Algoritmos

ode45 se basa en una fórmula explícita de Runge-Kutta (4,5), el par Dormand-Prince. Se trata de un solver de un solo paso: al calcular y(tn), solo necesita la solución en el punto de tiempo inmediatamente anterior, y(tn-1) [1], [2].

Referencias

[1] Dormand, J. R. and P. J. Prince, “A family of embedded Runge-Kutta formulae,” J. Comp. Appl. Math., Vol. 6, 1980, pp. 19–26.

[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

Introducido antes de R2006a