NDSolve 的 StiffnessSwitching方法

引言

"StiffnessSwitching" 方法背后的基本思想是提供一个在非刚性和刚性求解器之间切换的自动方法.

"StiffnessTest""NonstiffTest" 选项(在 "刚性检测" 中有描述)提供了一个有用方法来检测一个问题什么时候表现为刚性.

"StiffnessSwitching" 方法捕捉由 "StiffnessTest" 产生的任何故障代码,并且切换到另一种求解器. "StiffnessSwitching" 方法也使用在 "NonstiffTest" 选项中指定的方法来从刚性方法切换回非刚性方法.    

"Extrapolation" 通过使用动态阶数和步长选择为高度精确的解的计算提供了一个强有力的技术 (见 "NDSolve 的 Extrapolation 方法" 以获得更多详细信息)因此被用作 "StiffnessSwitching" 中的默认选择.

示例

这里加载一些有用的程序包:
这里选择一个刚性问题,并且指定一个比由 NDSolveProblem 指定的默认值更长的积分时间间隔:
默认的 "Extrapolation" 基本方法不适用于刚性问题,因而很快就放弃了:
"StiffnessSwitching" 方法却继续使用刚性求解器积分,而不是放弃:

"StiffnessSwitching" 方法使用一对外插法作为默认值. 非刚性求解器使用 "ExplicitModifiedMidpoint" 基本方法,而刚性求解器使用 "LinearlyImplicitEuler" 基本方法.

对于小的 AccuracyGoalPrecisionGoal 容差值,有时对非刚性求解器使用显式的 RungeKutta 方更合适一些法.

当问题被认为是刚性的时候,"ExplicitRungeKutta" 方法最终选择放弃:
这里把 "ExplicitRungeKutta" 方法设置为 "StiffnessSwitching" 的子方法:
到刚性求解器的一个切换出现在 ,所用步长的图形表明刚性求解器采用大得多的步长:

选项总结

选项名
默认值
Method{Automatic,Automatic}分别对非刚性和刚性求解器指定使用的方法
"NonstiffTest"Automatic指定用于决定是否切换到非刚性求解器所采用的方法

方法 "StiffnessSwitching" 的选项.