接口 ODEEventDetector

所有已知子接口:
EventHandler
所有已知实现类:
AbstractODEDetector, EventSlopeFilter, EventSlopeFilterTest.Event, ReappearingEventTest.Event, StepProblem

public interface ODEEventDetector
该接口表示在ODE积分过程中触发的离散事件的检测器。

在解决ODE问题时,有些事件可以在离散时间触发。例如,当集成过程应该在达到某个状态时停止(G-stop功能)时,当精确日期事先未知时,或者当导数有不连续性时,或者当用户想要监视某些状态边界的穿越时,就会发生这种情况。

这些事件被定义为当一个g切换函数的符号发生变化时发生。

由于事件仅依赖于问题并由独立的时间变量和状态向量触发,因此它们可以在几乎任何时间发生,事先未知。积分器将确保在步长内避免符号变化,当检测到此类事件时,它们将减小步长,以便将此事件准确放置在当前步长的末尾。这保证了步长插值(始终具有一个步长范围)即使在存在不连续性的情况下也是相关的。这与积分器提供的监视局部误差的步长控制无关(此事件处理功能适用于所有积分器,包括固定步长积分器)。

请注意,在Hipparchus 3.0之前,此接口中的方法位于ODEEventHandler接口和已废弃的EventHandlerConfiguration接口中。这些接口已重新组织,以允许在事件检测和事件处理中使用不同的对象,从而允许用户重用具有自定义处理程序的预定义事件检测器。

从以下版本开始:
3.0
另请参阅:
  • 方法详细资料

    • getMaxCheckInterval

      AdaptableInterval getMaxCheckInterval()
      获取事件处理程序检查之间的最大时间间隔。
      返回:
      事件处理程序检查之间的最大时间间隔
    • getMaxIterationCount

      int getMaxIterationCount()
      获取事件定位的迭代计数上限。
      返回:
      事件定位的迭代计数上限
    • getSolver

      获取用于检测状态事件的根查找算法。
      返回:
      用于检测状态事件的根查找算法
    • getHandler

      ODEEventHandler getHandler()
      获取基础事件处理器。
      返回:
      基础事件处理器
    • init

      default void init(ODEStateAndDerivative initialState, double finalTime)
      在ODE积分开始时初始化事件处理器。

      此方法在积分开始时调用一次。如果需要,事件处理器可以用于初始化一些内部数据。

      默认实现不执行任何操作

      参数:
      initialState - 初始时间、状态向量和导数
      finalTime - 集成的目标时间
    • g

      double g(ODEStateAndDerivative state)
      计算切换函数的值。

      当此切换函数的符号变化时,将生成离散事件。积分器将以一种方式改变步长,使得这些事件恰好发生在步长边界上。切换函数在其根邻域内必须连续(但不一定平滑),因为积分器需要找到其根以精确定位事件。

      还要注意,为了使积分器检测到事件,切换函数的符号在事件之前和之后必须相反。如果不保持这种一致性,则积分器可能不会检测到任何事件。

      这种一致性的需求有时很难实现。一个典型的例子是使用事件来模拟球在地板上弹跳。表示这一点的第一个想法是g(state) = h(state),其中h是时间state.getTime()时的地板上方的高度。当g(state)达到0时,球在地板上,因此应该弹起,并且通常的方法是反转其垂直速度。然而,这意味着在事件之前g(state)从正值减少到0,而在事件之后g(state)将从0增加到正值。这里破坏了一致性!解决方案是使用g(state) = sign * h(state),其中sign是一个变量,其初始值设置为+1。每次调用eventOccurred时,将sign重置为-sign。这允许g(state)函数保持连续(甚至平滑),即使在事件之间,尽管h(state)不是。基本上,事件用于在弹跳点处折叠h(state),而sign用于展开它,因此求解器看到的g(state)函数在事件之间甚至是平滑的。

      此方法是幂等的,即多次使用相同状态调用此方法将导致相同的值,但有两个例外。首先,当处理程序上的事件发生时,g函数的定义可能会更改,就像上面的示例中一样。其次,当同一积分器中的任何其他事件处理程序的eventOccurred方法返回Action.RESET_EVENTSAction.RESET_DERIVATIVESAction.RESET_STATE时,g函数的定义可能会更改。

      参数:
      state - 当前独立时间变量、状态向量和导数的值
      返回:
      g切换函数的值
      另请参阅: