NDSolve 的 DoubleStep方法

引言

方法 "DoubleStep" 对任何一步积分法执行 Richardson 外推法的单个应用.

虽然它并不总是最优的,它是对一个方法装备一个误差估计(因而在步长上具有自适应性)并外推以增加局部准确性的阶数的总体方案.

"DoubleStep" 是外推法的一种特殊情况,但是已经作为提高效率的单独方法来实现了.

给定一个具有阶数 的方法:

示例

加载一些具有实例问题和功用函数的程序包:
从该程序包中选择一个非刚性问题:
从该程序包中选择一个刚性问题:

扩展内置方法

方法 "ExplicitEuler" 使用欧拉方法执行一个积分步骤. 它没有局部误差控制,因此使用固定的步长.

这里使用具有基础方法 "ExplicitEuler" 的 Richardson 外推法的一个应用对一个微分系统进行积分(参见 (1)):
应用局部误差估计 (2) 在积分过程中动态调整步长:
这里显示在数值积分中,步长如何变化:
刚性检测设备(详见 "刚性检测")测出 "ExplicitEuler" 方法是被稳定性限制,而不是被局部准确性限制:
另一种基本方法对于该问题更加合适:

用户自定义的方法和方法属性

积分方法可以被加入到 NDSolve 框架中.

为了让这些方法可以像内置方法一样工作,可能有必要指定各种方法属性. 那么这些属性就可以被其它方法用来建立复合积分器.

下面是如何对经典朗格-库塔方法定义一个顶层插入(详情参见 "NDSolve 方法的插件框架: 经典 RungeKutta""NDSolve 的 "ExplicitRungeKutta" 方法"):

现在描述 "DoubleStep" 所采用的方法属性.

阶数和对称性

这里尝试使用基于经典朗格-库塔方法的 Richardson 外推法的一个应用,对一个系统进行积分:

如果不知道基础方法的阶数,"DoubleStep" 不能执行 Richardson 外推法.    

这里定义了一个方法属性来对具有阶数4的经典朗格-库塔方法的框架进行通讯:
方法 "DoubleStep" 现在能够确定 ClassicalRungeKutta 具有阶数4,并且当对解进行完善和估计局部误差时,能够使用该信息:

Richardson 外推法的结果的阶数取决于外推法是否具有幂为 或者 的局部误差展开(如果基础方法是对称的,那么就出现后者).

如果没有定义对称性的方法属性,"DoubleStep" 方法在默认情况下假定,基础积分器不是对称的.

这里明确规定,经典朗格-库塔方法使用 "SymmetricMethodQ" 属性时是不对称的:

刚性检测

用于刚性检测的方案的详细信息可以参阅 "刚性检测".

刚性检测依赖于方法的线性稳定性边界的知识,这是没有被定义的.

计算外推法下一个方法的精确线性稳定性边界可以是相当复杂的. 因此,选择了一个对所有方法适用的默认值. 这相当于考虑对指数在0处的第 p 阶幂级数展开的近似,并且忽视高阶项.

高阶

下面例子对阶数为4的经典朗格-库塔方法使用 (3) 的两个应用进行外推.

"DoubleStep" 的内部规格构建了一个具有阶数5的方法.

"DoubleStep" 的第二个应用是用来获取一个阶数为6的方法,它采用自适应步长.

"DoubleStep" 的嵌套应用用于提高阶数,并且提供了一个自适应步长估计:

一般说来,方法 "Extrapolation" 更适合于从低阶方法构建高阶积分方案.

选项总结

选项名
默认值
"LocalExtrapolation"True指定是否根据 (4) 使用局部外推法推进解
MethodNone指定作为基础积分方案来使用的方法
"StepSizeRatioBounds"{,4}指定新步长 hn+1 从当前步长 hn 的相对改变的边界,即low hn+1/h n high
"StepSizeSafetyFactors"Automatic指定安全因子,以结合进用于自适应步长的误差估计 (5)
"StiffnessTest"Automatic指定是否采用刚性测试功能

方法 "DoubleStep" 的选项.

选项 "StiffnessTest" 的默认设置 Automatic 表明如果一个非刚性的基础方法被采用,则激活刚性测试.

选项 "StepSizeSafetyFactors" 的默认设置 Automatic 对一个刚性的基础方法,使用值 {9/10,4/5},而对于一个非刚性的基础方法,使用值 {9/10,13/20}.