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





