接口 FieldODEEventDetector<T extends CalculusFieldElement<T>>

类型参数:
T - 字段元素的类型
所有已知实现类:
AbstractFieldODEDetector, EventSlopeFilterTest.FieldEvent, FieldEventSlopeFilter, StepFieldProblem

public interface FieldODEEventDetector<T extends CalculusFieldElement<T>>
该接口表示在ODE积分过程中触发的离散事件的处理程序。

在解决ODE问题时,某些事件可以在离散时间触发。例如,当达到某个状态(G-stop功能)时,当事先未知确切日期时,或者当导数具有状态边界交叉时,就会发生这种情况。

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

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

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

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

    • getMaxCheckInterval

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

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

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

      FieldODEEventHandler<T> getHandler()
      获取基础事件处理程序。
      返回:
      基础事件处理程序
    • init

      default void init(FieldODEStateAndDerivative<T> initialState, T finalTime)
      在ODE积分开始时初始化事件处理程序。

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

      默认实现不执行任何操作

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

      计算切换函数的值。

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

      还请注意,积分器期望一旦发生事件,切换函数在下一步开始时(即在事件发生后)的符号与事件发生前的符号相反。这些步骤之间的一致性必须保持,否则将发生与根未被夹住相关的 异常

      这种一致性有时很难实现。一个典型的例子是使用事件来模拟球在地板上弹跳。表示这一点的第一个想法是 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 函数的定义可能会更改,就像上面的示例中一样。其次,当同一积分器中的任何其他事件处理程序的 事件发生 方法返回 Action.RESET_EVENTSAction.RESET_DERIVATIVESAction.RESET_STATE 时,g 函数的定义可能会更改。

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