类 AdamsNordsieckTransformer
这个类被Adams-Bashforth
和Adams-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。这个类处理这些转换。
-
方法概要
修饰符和类型方法说明static AdamsNordsieckTransformer
getInstance
(int nSteps) 获取给定步数的Nordsieck转换器。initializeHighOrderDerivatives
(double h, double[] t, double[][] y, double[][] yDot) 初始化步骤开始时的高阶缩放导数。更新Adams积分器的高阶缩放导数(阶段1)。void
updateHighOrderDerivativesPhase2
(double[] start, double[] end, Array2DRowRealMatrix highOrder) 更新Adams积分器的高阶缩放导数(阶段2)。
-
方法详细资料
-
getInstance
获取给定步数的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
更新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)) - 另请参阅:
-