NDSolve 框架设计
特点
为了减少维护和代码复制的代价,通用的成分在方法之间是共用的.
NDSolve 框架的主要特点是:
- 使用本地优化算术,基于 BLAS 模型的推广的矢量化框架 [LAPACK99]
共同的时间步进
一个共同的时间步进的机制用于所有一步的方法. 该程序处理大量不同的指标,包括:
数据封装
每种方法都有自己的包含该方法调用所需信息的数据对象. 这包括,但不限于,系数、工作区、步长控制参数、步长接受/拒绝信息,以及雅可比矩阵. 这是用于像 LSODA 这样的代码中的思想的推广([H83], [P83]).
方法层级
方法是可重入的,并且具有层级的,这意味着一个方法可以调用另一个. 这是用于一般常微分方程 (ODE) 求解系统,即Godess (见 [O95]、[O98] 和所附的参考文献)的思想的推广,它用 C++ 实现.
初始设计
NDSolve ⟶ "ExplicitRungeKutta"
NDSolve ⟶ "ImplicitRungeKutta"
第一次修订
这在后来被扩展到允许一个方法以顺序方式,按照任意数量的嵌套,调用另一个方法.
NDSolve ⟶ "Extrapolation" ⟶ "ExplicitMidpoint"
NDSolve ⟶ "Projection" ⟶ "ExplicitRungeKutta"
第二次修订
当前状态
扩展了树的调用过程,以允许由每个方法求解子场,而不是整个向量场.
这个例子出现在 "NDSolve 的 "Composition" 和 "Splitting" 方法" 的ABC流章节中.
用户扩展性
内置方法可以用作特殊用途(复合)积分器的有效构建的组成块. 也可以添加用户定义的方法.
方法类
诸如 "ExplicitRungeKutta" 等的方法包括大量不同阶数的方案. 此外,不同的系数选择也可以由用户指定. 这是在RKSUITE 中的思想的推广 [BGS93].
自动选择和用户可控性
该框架提供自动步长选择和方法顺序选择. 方法可由用户通过方法选项来配置.
例如,用户可以选择一类 "ExplicitRungeKutta" 方法,代码将根据问题、相对和绝对局部误差容差和初始步长估计,自动尝试确定“最优”的阶数.
下面是适用于 "ExplicitRungeKutta" 的一个选项列表.
MethodMonitor
为了说明一些方法的底层行为,如刚性切换或者运行时的阶数变化,已经加入一个新的 "MethodMonitor".
它介于相对粗糙的 "StepMonitor" 解决方法和优良的 "EvaluationMonitor" 解决方案之间.
共享特色
这些特点并不一定局限于 NDSolve,因为它们也可以用于其它数值方法.
- 函数的计算是使用一个 NumericalFunction 来执行的,它能够根据需要动态改变类型,比如当 IEEE 浮点溢出或者下溢发生时,在适当的时候,为高效起见,它也调用 Wolfram 语言编译器 Compile .
- 已经执行的其他支持功能在 "NDSolve 中的范数" 中有描述.
一些基本方法
虽然隐式中点法尚未作为一个单独的方法实现,但是它可以通过 "ImplicitRungeKutta" 方法的一阶段高斯方案得到.