类 AdamsNordsieckTransformer

java.lang.Object
org.hipparchus.ode.nonstiff.AdamsNordsieckTransformer

public class AdamsNordsieckTransformer extends Object
用于Adams积分器的Nordsieck向量转换器。

这个类被Adams-BashforthAdams-Moulton积分器使用,用于在经典表示和Nordsieck表示之间进行转换,其中经典表示具有几个先前的一阶导数,而Nordsieck表示具有更高阶的缩放导数。

我们在步骤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. \]

根据上述定义,多步方法的经典表示仅使用一阶导数,即处理yn,s1(n)和qn,其中qn定义为:\[ q_n = [ s_1(n-1) s_1(n-2) \ldots s_1(n-(k-1)) ]^T \](为清晰起见,我们在符号中省略了k索引)。

另一种可能的表示使用具有相同步骤的更高次缩放导数的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是由\((j+1) (-i)^j\)项构建的(k-1)×(k-1)矩阵,其中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} \]

将上述公式中的-i替换为+i,可用于计算在步骤开始时经典表示和Nordsieck向量之间的类似转换。结果矩阵简单地是矩阵P的绝对值。

对于Adams-Bashforth方法,步骤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 ]
 

对于Adams-Moulton方法,步骤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
从这个预测向量中,校正向量如下计算:
  • yn+1 = yn + S1(n+1) + [ -1 +1 -1 +1 ... ±1 ] rn+1
  • s1(n+1) = h f(tn+1, yn+1)
  • rn+1 = Rn+1 + (s1(n+1) - S1(n+1)) P-1 u

其中大写的Yn+1,S1(n+1)和Rn+1表示预测状态,而小写的yn+1,sn+1和rn+1表示校正状态。

我们观察到两种方法使用类似的更新公式。在两种情况下,使用不依赖于状态的P-1u向量和P-1 A P矩阵,它们仅依赖于k。这个类处理这些转换。

  • 方法详细资料

    • getInstance

      public static AdamsNordsieckTransformer getInstance(int nSteps)
      获取给定步数的Nordsieck转换器。
      参数:
      nSteps - 多步方法的步数(不包括正在计算的步骤)
      返回:
      指定步数的Nordsieck转换器
    • initializeHighOrderDerivatives

      public 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
    • updateHighOrderDerivativesPhase1

      public Array2DRowRealMatrix updateHighOrderDerivativesPhase1(Array2DRowRealMatrix highOrder)
      更新Adams积分器的高阶缩放导数(阶段1)。

      完整的高阶导数更新形式类似于:\[ r_{n+1} = (s_1(n) - s_1(n+1)) P^{-1} u + P^{-1} A P r_n \] 此方法计算P-1 A P rn部分。

      参数:
      highOrder - 高阶缩放导数(h2/2 y'',... hk/k! y(k))
      返回:
      更新后的高阶导数
      另请参阅:
    • updateHighOrderDerivativesPhase2

      public void updateHighOrderDerivativesPhase2(double[] start, double[] end, Array2DRowRealMatrix highOrder)
      更新Adams积分器的高阶缩放导数(阶段2)。

      完整的高阶导数更新形式类似于:\[ r_{n+1} = (s_1(n) - s_1(n+1)) P^{-1} u + P^{-1} A P r_n \] 此方法计算(s1(n) - s1(n+1)) P-1 u部分。

      更新的第1阶段必须已经执行。

      参数:
      start - 步骤开始时的一阶缩放导数
      end - 步骤结束时的一阶缩放导数
      highOrder - 高阶缩放导数,将被修改(h2/2 y'',... hk/k! y(k))
      另请参阅: