程序包 org.hipparchus.ode

类 MultistepFieldIntegrator<T extends CalculusFieldElement<T>>

类型参数:
T - 字段元素的类型
所有已实现的接口:
FieldODEIntegrator<T>
直接已知子类:
AdamsFieldIntegrator

public abstract class MultistepFieldIntegrator<T extends CalculusFieldElement<T>> extends AdaptiveStepsizeFieldIntegrator<T>
这个类是普通微分方程的多步积分器的基类。

我们将第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

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

  • 构造器详细资料

    • MultistepFieldIntegrator

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

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

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

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

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

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

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

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

    • getStarterIntegrator

      public FieldODEIntegrator<T> getStarterIntegrator()
      获取起始积分器。
      返回:
      起始积分器
    • setStarterIntegrator

      public void setStarterIntegrator(FieldODEIntegrator<T> starterIntegrator)
      设置起始积分器。

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

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

      protected void start(FieldExpandableODE<T> equations, FieldODEState<T> initialState, T t) throws MathIllegalArgumentException, MathIllegalStateException
      开始积分。

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

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

      protected abstract Array2DRowFieldMatrix<T> initializeHighOrderDerivatives(T h, T[] t, T[][] y, T[][] 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(T newStepSize)
      重新调整实例的大小。

      由于缩放和Nordsieck数组与调用者共享,因此此方法会导致在调用者中重新调整这些数组的大小。

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

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