程序包 org.hipparchus.ode

类 MultistepIntegrator

所有已实现的接口:
ODEIntegrator
直接已知子类:
AdamsIntegrator

public abstract class MultistepIntegrator extends AdaptiveStepsizeIntegrator
这个类是用于普通微分方程的多步积分器的基类。

我们将第n步的缩放导数si(n)定义为:\[ \left\{\begin{align} s_1(n) &= h y'_n \text{ 一阶导数}\\ s_2(n) &= \frac{h^2}{2} y_n'' \text{ 二阶导数}\\ s_3(n) &= \frac{h^3}{6} y_n''' \text{ 三阶导数}\\ &\cdots\\ s_k(n) &= \frac{h^k}{k!} y_n^{(k)} \text{ 第}k\text{阶导数} \end{align}\right. \]

与单独存储几个先前步骤不同,此实现使用Nordsieck向量,其中高阶缩放导数都在同一步骤(yn、s1(n)和rn)中获取,其中rn定义为:\[ r_n = [ s_2(n), s_3(n) \ldots s_k(n) ]^T \](为了清晰起见,我们在符号中省略了k索引)

具有Nordsieck表示的多步积分器对于大步长变化非常敏感,因为当步长乘以因子a时,Nordsieck向量的第k个分量将乘以ak,而最后的分量是最不准确的。因此,默认的最大增长因子设置为相当低的值:21/order

另请参阅:
  • 字段详细资料

    • scaled

      protected double[] scaled
      第一个缩放导数(h y')。
    • nordsieck

      protected Array2DRowRealMatrix nordsieck
      高阶缩放导数的Nordsieck矩阵。

      (h2/2 y'',h3/6 y''' ...,hk/k! y(k)

  • 构造器详细资料

    • MultistepIntegrator

      protected MultistepIntegrator(String name, int nSteps, int order, double minStep, double maxStep, double scalAbsoluteTolerance, double scalRelativeTolerance) throws MathIllegalArgumentException
      使用给定的步长范围构建多步积分器。

      默认的起始积分器设置为带有一些默认设置的Dormand-Prince 8(5,3)积分器。

      默认的最大增长因子设置为相当低的值:21/order

      参数:
      name - 方法的名称
      nSteps - 多步方法的步数(不包括正在计算的步骤)
      order - 方法的阶数
      minStep - 最小步长(即使是向后积分,也必须是正的,最后一步可以比这个小)
      maxStep - 最大步长(即使是向后积分,也必须是正的)
      scalAbsoluteTolerance - 允许的绝对误差
      scalRelativeTolerance - 允许的相对误差
      抛出:
      MathIllegalArgumentException - 如果步数小于2
    • MultistepIntegrator

      protected MultistepIntegrator(String name, int nSteps, int order, double minStep, double maxStep, double[] vecAbsoluteTolerance, double[] vecRelativeTolerance)
      使用给定的步长范围构建多步积分器。

      默认的起始积分器设置为带有一些默认设置的Dormand-Prince 8(5,3)积分器。

      默认的最大增长因子设置为相当低的值:21/order

      参数:
      name - 方法的名称
      nSteps - 多步方法的步数(不包括正在计算的步骤)
      order - 方法的阶数
      minStep - 最小步长(即使是向后积分,也必须是正的,最后一步可以比这个小)
      maxStep - 最大步长(即使是向后积分,也必须是正的)
      vecAbsoluteTolerance - 允许的绝对误差
      vecRelativeTolerance - 允许的相对误差
  • 方法详细资料

    • getStarterIntegrator

      public ODEIntegrator getStarterIntegrator()
      获取起始积分器。
      返回:
      起始积分器
    • setStarterIntegrator

      public void setStarterIntegrator(ODEIntegrator starterIntegrator)
      设置起始积分器。

      此起始积分器的各种步骤和事件处理程序将由多步积分器自动管理。在使用之前,将清除这些元素的任何用户配置。

      参数:
      starterIntegrator - 起始积分器
    • start

      protected void start(ExpandableODE equations, ODEState initialState, double finalTime) throws MathIllegalArgumentException, MathIllegalStateException
      开始积分。

      此方法使用基础起始积分器计算一个步骤,并在步骤开始时初始化Nordsieck向量。起始积分器的目的仅是建立初始条件,它本身不会真正改变时间。顶层多步积分器仍然负责处理时间传播和事件处理,因为它将从头开始自己的计算。在某种意义上,起始积分器可以被视为一个虚拟的积分器,因此它永远不会触发任何用户事件,也不会调用任何用户步骤处理程序。

      参数:
      equations - 要积分的完整微分方程组
      initialState - 初始状态(时间、主要状态向量和次要状态向量)
      finalTime - 积分的目标时间(可以设置为小于initialState.getTime()的值以进行向后积分)
      抛出:
      MathIllegalArgumentException - 如果数组维度与方程设置不匹配
      MathIllegalArgumentException - 如果积分步长太小
      MathIllegalStateException - 如果函数评估次数超过限制
      MathIllegalArgumentException - 如果无法将事件的位置围绕起来
    • initializeHighOrderDerivatives

      protected abstract Array2DRowRealMatrix initializeHighOrderDerivatives(double h, double[] t, double[][] y, double[][] yDot)
      在步骤开始时初始化高阶缩放导数。
      参数:
      h - 用于缩放的步长
      t - 第一步的时间
      y - 第一步的状态
      yDot - 第一步的导数
      返回:
      第一步的Nordieck向量(h2/2 y''n,h3/6 y'''n ... hk/k! y(k)n
    • getMinReduction

      public double getMinReduction()
      获取步长控制的最小缩小因子。
      返回:
      最小缩小因子
    • setMinReduction

      public void setMinReduction(double minReduction)
      设置步长控制的最小缩小因子。
      参数:
      minReduction - 最小缩小因子
    • getMaxGrowth

      public double getMaxGrowth()
      获取步长控制的最大增长因子。
      返回:
      最大增长因子
    • setMaxGrowth

      public void setMaxGrowth(double maxGrowth)
      设置步长控制的最大增长因子。
      参数:
      maxGrowth - 最大增长因子
    • getSafety

      public double getSafety()
      获取步长控制的
      返回:
      安全系数
    • setSafety

      public void setSafety(double safety)
      设置步长控制的安全系数。
      参数:
      safety - 安全系数
    • getNSteps

      public int getNSteps()
      获取多步方法的步数(不包括正在计算的步数)。
      返回:
      多步方法的步数(不包括正在计算的步数)
    • rescale

      protected void rescale(double newStepSize)
      重新调整实例。

      由于缩放和Nordsieck数组与调用者共享,因此此方法会对调用者中的这些数组进行重新调整。

      参数:
      newStepSize - 用于在缩放和Nordsieck数组中使用的新步长
    • computeStepGrowShrinkFactor

      protected double computeStepGrowShrinkFactor(double error)
      根据标准化误差计算步长增长/缩小因子。
      参数:
      error - 当前步骤的标准化误差
      返回:
      下一步的增长/缩小因子