WOLFRAM 语言教程

NDSolve 的 DoubleStep方法

引言

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

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

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

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

  • 采取一个步长为 的步进,以获取一个解 .
  • 采取两个步长为 的步进,以获取一个解 .
    • 寻找阶数 的一个误差估计,如下:
  • 更正项 可用于误差估计,开启对任何基础方法的一个自适应步长方案.
    • 要么使用 作为新解,要么使用如下的局部外推法形成一个改进的近似.
  • 如果基础数值积分方法是对称的,那么改进的近似具有阶数 ;否则,它具有阶数 .    

示例

加载一些具有实例问题和功用函数的程序包.
In[1]:=
Click for copyable input
从该程序包中选择一个非刚性问题.
In[2]:=
Click for copyable input
从该程序包中选择一个刚性问题.
In[3]:=
Click for copyable input

扩展内置方法

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

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

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

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

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

下面是如何对经典朗格-库塔方法定义一个顶层插入(详情参见 "NDSolve 方法的插件框架: 经典 RungeKutta""NDSolve 的 "ExplicitRungeKutta" 方法").
In[8]:=
Click for copyable input

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

阶数和对称性

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

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

这里定义了一个方法属性来对具有阶数4的经典朗格-库塔方法的框架进行通讯.
In[10]:=
Click for copyable input
方法 现在能够确定 具有阶数4,并且当对解进行完善和估计局部误差时,能够使用该信息.
In[11]:=
Click for copyable input
Out[11]=

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

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

这里明确规定,经典朗格-库塔方法使用 属性时是不对称的.
In[12]:=
Click for copyable input

刚性检测

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

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

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

  • 如果 True,那么根据具有阶数 (对称)或者 的方法选择一个通用值.    
    • 如果 False,那么检查基础方法的属性 . 如果没有指定值,那么具有阶数 的方法的默认值被选中.
    这里对阶数为4的通用方法,计算线性稳定性边界.
    In[13]:=
    Click for copyable input
    Out[13]=
    使用 属性的一个默认值.
    这里显示如何对框架指定方法的线性稳定性边界. 只有当 的情况下调用时,才使用该值.
    In[15]:=
    Click for copyable input
    默认情况下假定,当不指定 属性时,一个方法不适合于刚性问题(并且因此使用刚性检测). 下面显示如何定义该属性.
    In[16]:=
    Click for copyable input

高阶

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

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

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

的嵌套应用用于提高阶数,并且提供了一个自适应步长估计.
In[17]:=
Click for copyable input
Out[17]=

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

选项总结

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

方法 的选项.

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

选项 的默认设置 Automatic 对一个刚性的基础方法,使用值 ,而对于一个非刚性的基础方法,使用值 .