Main Content

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.

Ubicación de eventos de ODE

¿Qué es la ubicación de eventos?

Parte de la dificultad de resolver algunos sistemas de ODE es determinar un momento apropiado para detener la solución. El momento final del intervalo de integración puede que esté definido por un evento específico y no por un número. Un ejemplo es una manzana que se cae de un árbol. El solver de ODE debería parar una vez que la manzana choque contra la tierra, pero puede que no sepa de antemano cuándo sucederá ese evento. De igual manera, algunos problemas implican eventos que no terminan con la solución. Un ejemplo es una luna que orbita alrededor de un planeta. En este caso puede que no quiera detener la integración pronto, pero aun así le interesa detectar cada vez que la luna completa un periodo alrededor del cuerpo más grande.

Utilice funciones de evento para detectar cuándo suceden determinados eventos durante la solución de una ODE. Las funciones de evento toman la expresión que usted especifique, y detectan un evento cuando esa expresión es igual a cero. También pueden indicarle al solver de ODE que detenga la integración cuando detecten un evento.

Escribir una función de evento

Utilice la opción 'Events' de la función odeset para especificar una función de evento. La función de evento debe tener la forma general

[value,isterminal,direction] = myEventsFcn(t,y)

En el caso de ode15i, la función de evento debe aceptar un tercer argumento de entrada para yp.

Los argumentos de salida value, isterminal y direction son vectores cuyo elemento i-ésimo se corresponde con el evento i-ésimo:

  • value(i) es una expresión matemática que describe el evento i-ésimo. Cuando value(i) es igual a cero sucede un evento.

  • isterminal(i) = 1 si la integración debe terminar cuando sucede el evento i-ésimo. De lo contrario, es 0.

  • direction(i) = 0 si todos los ceros se tienen que ubicar (predeterminado). Un valor de +1 solo ubica ceros donde la función del evento aumenta y -1 solo ubica ceros cuando la función del evento disminuye. Especifique direction = [] para utilizar el valor predeterminado de 0 para todos los eventos.

Una vez más, considere el caso de una manzana que cae de un árbol. La ODE que representa el cuerpo que cae es

y''=1+y'2,

con las condiciones iniciales y(0)=1 y y'(0)=0. Puede utilizar una función de evento para determinar cuando y(t)=0, que es cuando la manzana choca contra la tierra. Para este problema, una función de evento que detecta cuando la manzana choca contra la tierra es

function [position,isterminal,direction] = appleEventsFcn(t,y)
position = y(1); % The value that we want to be zero
isterminal = 1;  % Halt integration 
direction = 0;   % The zero can be approached from either direction

Información de evento

Si especifica una función de eventos, entonces llame al solver de la ODE con tres argumentos de salida adicionales, como

[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)

Las tres salidas adicionales que devuelve el solver se corresponden con los eventos detectados:

  • te es un vector columna de las veces que ha ocurrido un evento.

  • ye contiene el valor de solución en cada una de las ocasiones del evento en te.

  • ie contiene índices en el vector devuelto por la función del evento. Los valores indican qué evento detectó el solver.

De forma alternativa, puede llamar al solver con una sola salida, como

sol = odeXY(odefun,tspan,y0,options)

En este caso, la información del evento se almacena en la estructura como sol.te, sol.ye y sol.ie.

Limitaciones

El mecanismo de búsqueda de raíces empleado por el solver de ODE en conjunción con la función de evento tiene las siguientes limitaciones:

  • Si un evento terminal ocurre durante el primer paso de la integración, entonces el solver registra el evento como no terminal y continúa integrando.

  • Si durante el primer paso sucede más de un evento terminal, entonces solo se registra el primer evento y el solver sigue integrando.

  • Los ceros están determinados por los cruces de signos entre los pasos. Por lo tanto, se pueden perder ceros de funciones con un número par de cruces entre pasos.

Si el solver pasa por eventos pasados, pruebe a reducir RelTol y AbsTol para mejorar la precisión. De forma alternativa, establezca MaxStep para que establezca un límite superior en el tamaño del paso. Ajustar tspan no cambia los pasos que toma el solver.

Ubicación de eventos simples: Pelota botando

Este ejemplo muestra cómo escribir una función de evento simple para utilizarla con un solver de ODE. El archivo de ejemplo ballode modela el movimiento de una pelota botando. La función de eventos detiene la integración cada vez que bota la pelota y, luego, la integración se reinicia con las nuevas condiciones iniciales. A medida que bota la pelota, la integración se pausa y se reinicia varias veces.

Las ecuaciones para una pelota botando son

$$\begin{array}{cl} y'_1 &= y_2\\ y'_2 &= -9.8 . \end{array}$$

Un bote de pelota sucede cuando la altura de la pelota $y_1(t)$ es igual a cero tras disminuir. Una función de eventos que codifica este comportamiento es

function [value,isterminal,direction] = bounceEvents(t,y)
value = y(1);     % Detect height = 0
isterminal = 1;   % Stop the integration
direction = -1;   % Negative direction only

Escriba ballode para ejecutar el ejemplo e ilustre el uso de una función de eventos para simular el bote de una pelota.

ballode

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

En este ejemplo se muestra cómo utilizar los componentes direccionales de una función de evento. El archivo de ejemplo orbitode simula un problema restringido de tres cuerpos donde uno de los cuerpos orbita alrededor de dos cuerpos mucho mayores. La función de eventos determina los puntos de la órbita en los que el cuerpo orbitante está más lejos y más cerca. Dado que el valor de la función de eventos es el mismo en el punto más cercano y en el más lejano de la órbita, la dirección de cruce por punto cero es lo que los distingue.

Las ecuaciones para el problema restringido de tres cuerpos son

$$\begin{array}{cl} y'_1 &= y_3\\ y'_2 &= y_4 \\ y'_3 &= 2y_4 + y_1 -
\frac{\mu^* (y_1 + \mu)}{r_1^3} - \frac{\mu(y_1 - \mu^*}{r_2^3}\\ y'_4 &=
-2y_3 + y_2 - \frac{\mu^* y_2}{r_1^3} - \frac{\mu y_2}{r_2^3},
\end{array}$$

donde

$$\begin{array}{cl} \mu &= 1/82.45\\ \mu^* &= 1-\mu\\ r_1 &=
\sqrt{(y_1+\mu)^2+y_2^2}\\ r_2 &= \sqrt{(y_1-\mu^*)^2 +
y_2^2}.\end{array}$$

Los dos primeros elementos de la solución son coordenadas del cuerpo de masa infinitesimal, por lo que representar uno contra el otro da la órbita del cuerpo.

La función de eventos anidada en orbitode.m busca dos eventos. Un evento localiza el punto de máxima distancia del punto de partida, y el otro localiza el punto donde la nave espacial regresa al punto de partida. Los eventos se ubican con precisión, a pesar de que los tamaños de los pasos utilizados por el integrador no están determinados por la ubicación de los eventos. En este ejemplo, la capacidad de especificar la dirección del cruce por cero es decisiva. Tanto el punto de retorno al punto de partida como el punto de máxima distancia del punto de partida tienen los mismos valores de evento, y para distinguirlos se utiliza la dirección del cruce. Una función de eventos que codifica este comportamiento es

function [value,isterminal,direction] = orbitEvents(t,y)
% dDSQdt is the derivative of the equation for current distance. Local
% minimum/maximum occurs when this value is zero.
dDSQdt = 2 * ((y(1:2)-y0(1:2))' * y(3:4)); 
value = [dDSQdt; dDSQdt];  
isterminal = [1;  0];         % stop at local minimum
direction  = [1; -1];         % [local minimum, local maximum]
end

Escriba orbitode para ejecutar el ejemplo.

orbitode
This is an example of event location where the ability to
specify the direction of the zero crossing is critical.  Both
the point of return to the initial point and the point of
maximum distance have the same event function value, and the
direction of the crossing is used to distinguish them.

Calling ODE45 with event functions active...

Note that the step sizes used by the integrator are NOT
determined by the location of the events, and the events are
still located accurately.

Consulte también

|

Temas relacionados