# Package org.apache.commons.math3.ode.events

package org.apache.commons.math3.ode.events

This package provides classes to handle discrete events occurring during Ordinary Differential Equations integration.

Discrete events detection is based on switching functions. The user provides a simple `g(t, y)` function depending on the current time and state. The integrator will monitor the value of the function throughout integration range and will trigger the event when its sign changes. The magnitude of the value is almost irrelevant, it should however be continuous (but not necessarily smooth) for the sake of root finding. The steps are shortened as needed to ensure the events occur at step boundaries (even if the integrator is a fixed-step integrator).

When an event is triggered, several different options are available:

- integration can be stopped (this is called a G-stop facility),
- the state vector or the derivatives can be changed,
- or integration can simply go on.

The first case, G-stop, is the most common one. A typical use case is when an ODE must be solved up to some target state is reached, with a known value of the state but an unknown occurrence time. As an example, if we want to monitor a chemical reaction up to some predefined concentration for the first substance, we can use the following switching function setting:

      public double g(double t, double[] y) {
        return y[0] - targetConcentration;
      }

      public int eventOccurred(double t, double[] y) {
        return STOP;
      }

The second case, change state vector or derivatives is encountered when dealing with discontinuous dynamical models. A typical case would be the motion of a spacecraft when thrusters are fired for orbital maneuvers. The acceleration is smooth as long as no maneuver are performed, depending only on gravity, drag, third body attraction, radiation pressure. Firing a thruster introduces a discontinuity that must be handled appropriately by the integrator. In such a case, we would use a switching function setting similar to this:

      public double g(double t, double[] y) {
        return (t - tManeuverStart) ∗ (t - tManeuverStop);
      }

      public int eventOccurred(double t, double[] y) {
        return RESET_DERIVATIVES;
      }

The third case is useful mainly for monitoring purposes, a simple example is:

      public double g(double t, double[] y) {
        return y[0] - y[1];
      }

      public int eventOccurred(double t, double[] y) {
        logger.log("y0(t) and y1(t) curves cross at t = " + t);
        return CONTINUE;
      }

Related Packages
Package
Description
org.apache.commons.math3.ode
This package provides classes to solve Ordinary Differential Equations problems.
org.apache.commons.math3.ode.nonstiff
This package provides classes to solve non-stiff Ordinary Differential Equations problems.
org.apache.commons.math3.ode.sampling
This package provides classes to handle sampling steps during Ordinary Differential Equations integration.
Class
Description
Action
Enumerate for actions to be performed when an event occurs during ODE integration.
EventFilter
Wrapper used to detect only increasing or decreasing events.
EventHandler
This interface represents a handler for discrete events triggered during ODE integration.
EventHandler.Action
Enumerate for actions to be performed when an event occurs.
EventState
This class handles the state for one `event handler` during integration steps.
FieldEventHandler<T extends RealFieldElement<T>>
This interface represents a handler for discrete events triggered during ODE integration.
FieldEventState<T extends RealFieldElement<T>>
This class handles the state for one `event handler` during integration steps.
FilterType
Enumerate for `filtering events`.