类 AbstractFieldODEDetector<T extends AbstractFieldODEDetector<T,E>,E extends CalculusFieldElement<E>>

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

public abstract class AbstractFieldODEDetector<T extends AbstractFieldODEDetector<T,E>,E extends CalculusFieldElement<E>> extends Object implements FieldODEEventDetector<E>
基类为#@link FieldODEEventDetector
从以下版本开始:
3.0
  • 字段详细资料

    • DEFAULT_MAXCHECK

      public static final double DEFAULT_MAXCHECK
      默认最大检查间隔(秒)。
      另请参阅:
    • DEFAULT_THRESHOLD

      public static final double DEFAULT_THRESHOLD
      默认收敛阈值(秒)。
      另请参阅:
    • DEFAULT_MAX_ITER

      public static final int DEFAULT_MAX_ITER
      事件时间搜索中的默认最大迭代次数。
      另请参阅:
  • 构造器详细资料

    • AbstractFieldODEDetector

      protected AbstractFieldODEDetector(FieldAdaptableInterval<E> maxCheck, int maxIter, BracketedRealFieldUnivariateSolver<E> solver, FieldODEEventHandler<E> handler)
      构建一个新实例。
      参数:
      maxCheck - 最大检查间隔,必须严格为正(秒)
      maxIter - 事件时间搜索中的最大迭代次数
      solver - 用于检测状态事件的根查找算法
      handler - 事件发生时调用的事件处理器
  • 方法详细资料

    • init

      public void init(FieldODEStateAndDerivative<E> s0, E t)
      在ODE积分开始时初始化事件处理器。

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

      默认实现不执行任何操作

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

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

      public abstract E g(FieldODEStateAndDerivative<E> s)
      计算切换函数的值。

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

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

      这种一致性有时很难实现。一个典型的例子是使用事件来模拟球在地板上弹跳。表示这一点的第一个想法是使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函数的定义可能会更改。

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

      public FieldAdaptableInterval<E> getMaxCheckInterval()
      获取事件处理程序检查之间的最大时间间隔。
      指定者:
      getMaxCheckInterval 在接口中 FieldODEEventDetector<T extends AbstractFieldODEDetector<T,E>>
      返回:
      事件处理程序检查之间的最大时间间隔
    • getMaxIterationCount

      public int getMaxIterationCount()
      获取事件本地化中迭代计数的上限。
      指定者:
      getMaxIterationCount 在接口中 FieldODEEventDetector<T extends AbstractFieldODEDetector<T,E>>
      返回:
      事件本地化中迭代计数的上限
    • getSolver

      public BracketedRealFieldUnivariateSolver<E> getSolver()
      获取用于检测状态事件的根查找算法。
      指定者:
      getSolver 在接口中 FieldODEEventDetector<T extends AbstractFieldODEDetector<T,E>>
      返回:
      用于检测状态事件的根查找算法
    • withMaxCheck

      public T withMaxCheck(E newMaxCheck)
      设置最大检查间隔。

      如果之前已配置了最大检查间隔,则将覆盖它。

      参数:
      newMaxCheck - 最大检查间隔(秒)
      返回:
      具有更新配置的新检测器(实例未更改)
    • withMaxCheck

      public T withMaxCheck(FieldAdaptableInterval<E> newMaxCheck)
      设置最大检查间隔。

      如果之前已配置了最大检查间隔,则将覆盖它。

      参数:
      newMaxCheck - 最大检查间隔(秒)
      返回:
      具有更新配置的新检测器(实例未更改)
      从以下版本开始:
      3.0
    • withMaxIter

      public T withMaxIter(int newMaxIter)
      设置事件时间搜索中的最大迭代次数。

      如果之前已配置了迭代次数,则将覆盖它。

      参数:
      newMaxIter - 事件时间搜索中的最大迭代次数
      返回:
      具有更新配置的新检测器(实例未更改)
    • withThreshold

      public T withThreshold(E newThreshold)
      设置收敛阈值。

      这相当于调用withSolver(new FieldBracketingNthOrderBrentSolver<>(zero, newThreshold, zero, 5),因此如果之前配置了解算器,则将覆盖它。

      参数:
      newThreshold - 收敛阈值
      返回:
      具有更新配置的新检测器(实例未更改)
      另请参阅:
    • withSolver

      public T withSolver(BracketedRealFieldUnivariateSolver<E> newSolver)
      设置用于检测状态事件的根查找算法。

      如果之前已配置了解算器,则将覆盖它。

      参数:
      newSolver - 用于检测状态事件的根查找算法
      返回:
      具有更新配置的新检测器(实例未更改)
      另请参阅:
    • withHandler

      public T withHandler(FieldODEEventHandler<E> newHandler)
      设置事件发生时要调用的事件处理程序。

      如果之前已配置了处理程序,则将覆盖它。

      参数:
      newHandler - 事件发生时要调用的事件处理程序
      返回:
      具有更新配置的新检测器(实例未更改)
    • getHandler

      public FieldODEEventHandler<E> getHandler()
      获取基础事件处理程序。
      指定者:
      getHandler 在接口中 FieldODEEventDetector<T extends AbstractFieldODEDetector<T,E>>
      返回:
      基础事件处理程序
    • create

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

      public boolean isForward()
      检查当前传播是向前还是向后。
      返回:
      如果当前传播是向前,则为true