Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Ubicación de eventos de EDO

¿Qué es la ubicación de eventos?

Parte de la dificultad de resolver algunos sistemas de las EDO reside en determinar un momento apropiado para detener la solución. El momento final en el intervalo de integración podría venir definido por un evento específico y no por un número. Un ejemplo es una manzana cayendo de un árbol. El solver de EDO debería detenerse una vez que la manzana toque el suelo, pero podría no saber con antelación cuándo ocurrirá ese evento. De forma similar, algunos problemas incluyen eventos que no finalizan la solución. Un ejemplo es una luna orbitando un planeta. En este caso, podría no desear detener la integración antes, pero sí detectar cada vez que la luna completa un periodo alrededor del cuerpo más grande.

Use funciones de eventos para detectar cuándo se producen determinados eventos durante la solución de una EDO. Las funciones de eventos toman una expresión especificada y detectan un evento cuando esa expresión es igual a cero. También pueden indicar al solver de EDO que detenga la integración cuando detectan 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 admitir también un tercer argumento de entrada para yp.

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

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

  • isterminal(i) = 1 si la integración debe finalizar cuando se produzca el i-ésimo evento. Si no, es 0.

  • direction(i) = 0 si deben encontrarse todos los ceros (el valor predeterminado). Un valor de +1 encuentra solo ceros donde la función de evento está aumentando, y -1 encuentra solo ceros donde la función de evento está disminuyendo. Especifique direction = [] para utilizar el valor predeterminado de 0 para todos los eventos.

De nuevo, considere el caso de una manzana cayendo de un árbol. La EDO 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 cuándo y(t)=0, que es cuando la manzana toca el suelo. Para este problema, una función de evento que detecta cuándo la manzana toca el suelo 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
end

Información sobre eventos

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

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

Las tres salidas adicionales devueltas por el solver se corresponden con los eventos detectados:

  • te es un vector columna de los momentos en los que se produjeron los eventos.

  • ye contiene el valor de solución de cada uno de los momentos de los eventos en te.

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

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

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

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

Limitaciones

El mecanismo de búsqueda de raíces utilizado por el solver de EDO junto con la función de evento tiene estas limitaciones:

  • Si se produce un evento terminal durante el primer paso de la integración, el solver registra el evento como no terminal y sigue integrando.

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

  • Los ceros se determinan a partir de los cambios de signo entre pasos. Por lo tanto, se pueden omitir los ceros de funciones con un número par de cambios entre pasos.

Si el solver sobrepasa eventos al dar un paso, pruebe a reducir RelTol y AbsTol para mejorar la precisión. De forma alternativa, establezca MaxStep para poner un límite superior en el tamaño de paso. Ajustar tspan no cambia los pasos que da el solver.

Ubicación de eventos sencilla: una pelota que rebota

Este ejemplo muestra cómo escribir una función de evento sencilla que se desea utilizar con un solver de EDO. El archivo de ejemplo ballode modela el movimiento de una pelota que rebota. La función de eventos detiene la integración cada vez que la pelota rebota y, después, la integración se reinicia con nuevas condiciones iniciales. Mientras la pelota rebota, la integración se detiene y se reinicia varias veces.

Las ecuaciones para la pelota que rebota son

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

Cada rebote de la pelota se produce cuando la altura de la pelota $y_1(t)$ es igual a cero después de 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 ilustrar el uso de una función de eventos para simular el rebote de una pelota.

ballode

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

Este ejemplo muestra cómo utilizar los componentes direccionales de una función de evento. El archivo de ejemplo orbitode simula un problema de los tres cuerpos restringido donde un cuerpo está orbitando dos cuerpos mucho más grandes. La función de eventos determina los puntos de la órbita en los que el cuerpo que orbita está más cerca y más lejos. Puesto que el valor de la función de eventos es el mismo en los puntos más cercano y más alejado de la órbita, la dirección del cruce por cero es lo que los distingue.

Las ecuaciones para el problema de los tres cuerpos restringido 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 primeros dos componentes de la solución son coordenadas del cuerpo de masa infinitesimal, por lo que representar uno con respecto al otro proporciona la órbita del cuerpo.

La función de eventos anidada en orbitode.m busca dos eventos. Un evento encuentra el punto de máxima distancia desde el punto de partida, y el otro encuentra el punto donde la nave espacial vuelve al punto de partida. Los eventos se encuentran con precisión, a pesar de que los tamaños de paso utilizados por el integrador no están determinados por las ubicaciones de los eventos. En este ejemplo, la posibilidad de especificar la dirección del cruce por cero es fundamental. Tanto el punto de retorno al punto de partida como el punto de máxima distancia desde el punto de partida tienen los mismos valores de evento, y se utiliza la dirección del cruce para distinguirlos. 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