类 AdamsBashforthIntegrator

所有已实现的接口:
ODEIntegrator

public class AdamsBashforthIntegrator extends AdamsIntegrator
This class implements explicit Adams-Bashforth integrators for Ordinary Differential Equations.

Adams-Bashforth方法(实际上是由Adams单独提出的)是显式的多步ODE求解器。这个实现是经典实现的变体:它使用自适应步长来实现误差控制,而经典实现是固定步长的。在步骤n+1处的状态向量的值是步骤n处的值和步骤n、n-1、n-2处的导数的简单组合。根据想要用于计算下一个值的前k个步骤的数量,不同的公式可用:

  • k = 1: yn+1 = yn + h y'n
  • k = 2: yn+1 = yn + h (3y'n-y'n-1)/2
  • k = 3: yn+1 = yn + h (23y'n-16y'n-1+5y'n-2)/12
  • k = 4: yn+1 = yn + h (55y'n-59y'n-1+37y'n-2-9y'n-3)/24
  • ...

一个k步的Adams-Bashforth方法的阶数为k。

在最后一次重置事件和积分结束之间必须有足够的时间让起始积分器starter integrator完成多个步骤,否则在积分过程中可能会抛出异常。用户可以调整积分的结束日期或起始积分器的步长,以确保在积分结束之前可以完成足够数量的步骤。

实现细节

我们将步骤n处的缩放导数si(n)定义为:\[ \left\{\begin{align} s_1(n) &= h y'_n \text{ for first derivative}\\ s_2(n) &= \frac{h^2}{2} y_n'' \text{ for second derivative}\\ s_3(n) &= \frac{h^3}{6} y_n''' \text{ for third derivative}\\ &\cdots\\ s_k(n) &= \frac{h^k}{k!} y_n^{(k)} \text{ for } k^\mathrm{th} \text{ derivative} \end{align}\right. \]

上述定义使用了经典表示法,其中包含几个先前的一阶导数。让我们定义 \[ q_n = [ s_1(n-1) s_1(n-2) \ldots s_1(n-(k-1)) ]^T \](为了清晰起见,我们在符号中省略了k索引)。根据这些定义,Adams-Bashforth方法可以写成:

\[ \left\{\begin{align} k = 1: & y_{n+1} = y_n + s_1(n) \\ k = 2: & y_{n+1} = y_n + \frac{3}{2} s_1(n) + [ \frac{-1}{2} ] q_n \\ k = 3: & y_{n+1} = y_n + \frac{23}{12} s_1(n) + [ \frac{-16}{12} \frac{5}{12} ] q_n \\ k = 4: & y_{n+1} = y_n + \frac{55}{24} s_1(n) + [ \frac{-59}{24} \frac{37}{24} \frac{-9}{24} ] q_n \\ & \cdots \end{align}\right. \]

我们的实现不是使用仅包含一阶导数的经典表示法(yn,s1(n)和qn),而是使用在同一步骤中取得的更高阶缩放导数的Nordsieck向量(yn,s1(n)和rn),其中rn定义为:\[ r_n = [ s_2(n), s_3(n) \ldots s_k(n) ]^T \](在这里我们再次为了清晰起见省略了符号k的索引)

泰勒级数公式表明,对于任何索引偏移i,s1(n-i)可以从s1(n),s2(n) ... sk(n)计算出来,该公式对于k次多项式是精确的。\[ s_1(n-i) = s_1(n) + \sum_{j\gt 0} (j+1) (-i)^j s_{j+1}(n) \] 可以使用几个i值来计算经典表示法和Nordsieck向量之间的转换。根据上述泰勒级数公式得到的rn和qn之间的转换是:\[ q_n = s_1(n) u + P r_n \] 其中u是[ 1 1 ... 1 ]T向量,P是(k-1)×(k-1)矩阵,由带有\((j+1) (-i)^j\)项的项构建,其中i是从1开始的行号,j是从1开始的列号:\[ P=\begin{bmatrix} -2 & 3 & -4 & 5 & \ldots \\ -4 & 12 & -32 & 80 & \ldots \\ -6 & 27 & -108 & 405 & \ldots \\ -8 & 48 & -256 & 1280 & \ldots \\ & & \ldots\\ \end{bmatrix} \]

使用Nordsieck向量有几个优点:

  • 它极大地简化了步骤插值,因为插值器主要应用泰勒级数公式,
  • 当触发截断步骤的离散事件时,它简化了步骤更改,
  • 它允许扩展方法以支持自适应步长。

步骤n+1处的Nordsieck向量的计算方法如下:

  • yn+1 = yn + s1(n) + uT rn
  • s1(n+1) = h f(tn+1, yn+1)
  • rn+1 = (s1(n) - s1(n+1)) P-1 u + P-1 A P rn

其中A是一个行位移矩阵(左下部分是单位矩阵):

        [ 0 0   ...  0 0 | 0 ]
        [ ---------------+---]
        [ 1 0   ...  0 0 | 0 ]
    A = [ 0 1   ...  0 0 | 0 ]
        [       ...      | 0 ]
        [ 0 0   ...  1 0 | 0 ]
        [ 0 0   ...  0 1 | 0 ]
 

P-1u向量和P-1 A P矩阵不依赖于状态,它们仅依赖于k,因此它们只需预先计算一次。

  • 构造器详细资料

    • AdamsBashforthIntegrator

      public AdamsBashforthIntegrator(int nSteps, double minStep, double maxStep, double scalAbsoluteTolerance, double scalRelativeTolerance) throws MathIllegalArgumentException
      使用给定的阶数和步长控制参数构建Adams-Bashforth积分器。
      参数:
      nSteps - 计算中不包括正在计算的步骤的方法步数
      minStep - 最小步长(符号无关,无论积分方向是向前还是向后,最后一步可以小于此值)
      maxStep - 最大步长(符号无关,无论积分方向是向前还是向后,最后一步可以小于此值)
      scalAbsoluteTolerance - 允许的绝对误差
      scalRelativeTolerance - 允许的相对误差
      抛出:
      MathIllegalArgumentException - 如果阶数小于等于1
    • AdamsBashforthIntegrator

      public AdamsBashforthIntegrator(int nSteps, double minStep, double maxStep, double[] vecAbsoluteTolerance, double[] vecRelativeTolerance) throws IllegalArgumentException
      使用给定的阶数和步长控制参数构建Adams-Bashforth积分器。
      参数:
      nSteps - 计算中不包括正在计算的步骤的方法步数
      minStep - 最小步长(符号无关,无论积分方向是向前还是向后,最后一步可以小于此值)
      maxStep - 最大步长(符号无关,无论积分方向是向前还是向后,最后一步可以小于此值)
      vecAbsoluteTolerance - 允许的绝对误差
      vecRelativeTolerance - 允许的相对误差
      抛出:
      IllegalArgumentException - 如果阶数小于等于1
  • 方法详细资料

    • errorEstimation

      protected double errorEstimation(double[] previousState, double predictedTime, double[] predictedState, double[] predictedScaled, RealMatrix predictedNordsieck)
      估计误差。
      指定者:
      errorEstimation 在类中 AdamsIntegrator
      参数:
      previousState - 步骤开始时的状态向量
      predictedTime - 步骤结束时的时间
      predictedState - 步骤结束时的预测状态向量
      predictedScaled - 步骤结束时缩放导数的预测值
      predictedNordsieck
    • finalizeStep

      protected org.hipparchus.ode.nonstiff.AdamsStateInterpolator finalizeStep(double stepSize, double[] predictedState, double[] predictedScaled, Array2DRowRealMatrix predictedNordsieck, boolean isForward, ODEStateAndDerivative globalPreviousState, ODEStateAndDerivative globalCurrentState, EquationsMapper equationsMapper)
      Finalize the step.
      指定者:
      finalizeStep 在类中 AdamsIntegrator
      参数:
      stepSize - 在缩放和Nordsieck数组中使用的步长
      predictedState - 步骤结束时的预测状态
      predictedScaled - 预测的第一个缩放导数
      predictedNordsieck - 预测的Nordsieck向量
      isForward - 积分方向指示器
      globalPreviousState - 全局步骤的起点
      globalCurrentState - 全局步骤的终点
      equationsMapper - ODE方程主要和次要组件的映射器
      返回:
      步骤插值器