类 StepProblem

所有已实现的接口:
ODEEventDetector, OrdinaryDifferentialEquation

public class StepProblem extends AbstractODEDetector<StepProblem> implements OrdinaryDifferentialEquation
  • 构造器详细资料

    • StepProblem

      public StepProblem(AdaptableInterval maxCheck, double threshold, int maxIter, double rateBefore, double rateAfter, double switchTime)
  • 方法详细资料

    • create

      protected StepProblem create(AdaptableInterval newMaxCheck, int newMaxIter, BracketedUnivariateSolver<UnivariateFunction> newSolver, ODEEventHandler newHandler)
      从类复制的说明: AbstractODEDetector
      构建一个新实例。
      指定者:
      create 在类中 AbstractODEDetector<StepProblem>
      参数:
      newMaxCheck - 最大检查间隔
      newMaxIter - 事件时间搜索中的最大迭代次数
      newSolver - 用于检测状态事件的根查找算法
      newHandler - 事件处理程序在事件发生时调用
      返回:
      适当子类型的新实例
    • computeDerivatives

      public double[] computeDerivatives(double t, double[] y)
      从接口复制的说明: OrdinaryDifferentialEquation
      获取状态向量的当前时间导数。
      指定者:
      computeDerivatives 在接口中 OrdinaryDifferentialEquation
      参数:
      t - 当前独立时间变量的值
      y - 包含状态向量当前值的数组
      返回:
      状态向量的时间导数
    • getDimension

      public int getDimension()
      从接口复制的说明: OrdinaryDifferentialEquation
      获取问题的维度。
      指定者:
      getDimension 在接口中 OrdinaryDifferentialEquation
      返回:
      问题的维度
    • setRate

      public void setRate(double rate)
    • init

      public void init(double t0, double[] y0, double t)
      从接口复制的说明: OrdinaryDifferentialEquation
      在ODE积分开始时初始化方程。

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

      默认实现不执行任何操作。

      指定者:
      init 在接口中 OrdinaryDifferentialEquation
      参数:
      t0 - 积分开始时独立时间变量的值
      y0 - 包含积分开始时状态向量值的数组
      t - 积分的目标时间
    • g

      public double g(ODEStateAndDerivative s)
      从类复制的说明: AbstractODEDetector
      计算切换函数的值。

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

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

      这种一致性有时很难实现。一个典型的例子是使用事件来模拟球在地板上弹跳。表示这一点的第一个想法是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 在接口中 ODEEventDetector
      指定者:
      g 在类中 AbstractODEDetector<StepProblem>
      参数:
      s - 当前独立时间变量、状态向量和导数的值
      返回:
      切换函数g的值
      另请参阅: