类 FieldEventSlopeFilter<T extends FieldODEEventDetector<E>,E extends CalculusFieldElement<E>>

java.lang.Object
org.hipparchus.ode.events.AbstractFieldODEDetector<FieldEventSlopeFilter<T,E>,E>
org.hipparchus.ode.events.FieldEventSlopeFilter<T,E>
类型参数:
T - 事件检测器的类型
E - 字段元素的类型
所有已实现的接口:
FieldODEEventDetector<E>

public class FieldEventSlopeFilter<T extends FieldODEEventDetector<E>,E extends CalculusFieldElement<E>> extends AbstractFieldODEDetector<FieldEventSlopeFilter<T,E>,E>
用于仅检测递增或递减事件的包装器。

一般的事件由跨越零点的g函数隐式定义。该函数在事件邻域内需要连续,并且其符号在事件之间保持一致。这意味着在ODE积分期间,触发的事件交替是函数从负值增加到正值的事件,以及函数从正值减少到负值的事件。

有时,用户只对一种类型的事件感兴趣(例如仅递增事件),而不关心另一种类型。在这些情况下,精确查找所有事件的位置并触发稍后将被忽略的事件是浪费计算时间。

用户可以将常规的事件检测器包装在这个类的实例中,并将此包装实例提供给ODE求解器,以避免浪费时间查找不感兴趣的事件。包装器将拦截对g函数eventOccurred方法的调用,以忽略不感兴趣的事件。被包装的常规事件检测器将只看到有趣的事件,即仅为递增事件或递减事件。对g函数的调用次数也将减少。

从以下版本开始:
3.0
  • 构造器详细资料

    • FieldEventSlopeFilter

      public FieldEventSlopeFilter(Field<E> field, T rawDetector, FilterType filter)
      包装一个事件检测器
      参数:
      field - 数组元素所属的字段
      rawDetector - 要包装的事件检测器
      filter - 要使用的过滤器
  • 方法详细资料

    • create

      protected FieldEventSlopeFilter<T,E> create(FieldAdaptableInterval<E> newMaxCheck, int newMaxIter, BracketedRealFieldUnivariateSolver<E> newSolver, FieldODEEventHandler<E> newHandler)
      构建一个新实例。
      指定者:
      create 在类中 AbstractFieldODEDetector<FieldEventSlopeFilter<T extends FieldODEEventDetector<E>,E extends CalculusFieldElement<E>>,E extends CalculusFieldElement<E>>
      参数:
      newMaxCheck - 最大检查间隔
      newMaxIter - 事件时间搜索中的最大迭代次数
      newSolver - 用于检测状态事件的根查找算法
      newHandler - 事件发生时要调用的事件处理程序
      返回:
      适当子类型的新实例
    • getDetector

      public T getDetector()
      获取包装的原始检测器。
      返回:
      包装的原始检测器
    • init

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

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

      默认实现不执行任何操作

      此实现设置积分的方向并初始化事件处理程序。如果子类覆盖此方法,则应调用super.init(s0, t)

      指定者:
      init 在接口中 FieldODEEventDetector<T extends FieldODEEventDetector<E>>
      覆盖:
      init 在类中 AbstractFieldODEDetector<FieldEventSlopeFilter<T extends FieldODEEventDetector<E>,E extends CalculusFieldElement<E>>,E extends CalculusFieldElement<E>>
      参数:
      initialState - 初始时间、状态向量和导数
      finalTime - 积分的目标时间
    • g

      public E g(FieldODEStateAndDerivative<E> 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函数的定义可能会改变。

      指定者:
      g 在接口中 FieldODEEventDetector<T extends FieldODEEventDetector<E>>
      指定者:
      g 在类中 AbstractFieldODEDetector<FieldEventSlopeFilter<T extends FieldODEEventDetector<E>,E extends CalculusFieldElement<E>>,E extends CalculusFieldElement<E>>
      参数:
      state - 独立时间变量、状态向量和导数的当前值
      返回:
      g切换函数的值