WOLFRAM 语言教程

NDSolve 框架设计

特点

支持大量微分方程的数值积分方法花费很多工作.

为了减少维护和代码复制的代价,通用的成分在方法之间是共用的.

这种方法还允许代码的优化只在几个中心例程中进行.

NDSolve 框架的主要特点是:

  • 统一的设计和接口
  • 代码重复使用(通用代码库)
  • 对象定位(方法属性规范和通讯)
  • 数据隐藏
  • 方法的初始化阶段和运行时段计算的分离
  • 分层和折返(reentrant)数值方法
  • 舍入误差的统一处理(见 [HLW02]、[SS03] 和所附的参考文献)
  • 使用本地优化算术,基于 BLAS 模型的推广的矢量化框架 [LAPACK99]
  • 允许方法系列共享一个实现的张量框架
  • 所有方法的类型和精度动态
  • 允许用户可扩展和成型的插件功能
  • 专门的数据结构

共同的时间步进

一个共同的时间步进的机制用于所有一步的方法. 该程序处理大量不同的指标,包括:

  • 在一个数值积分中的步长在值方面没有变得太小,这可能发生在求解刚性系统中
  • 步长没有意外地改变符号,这可能是用户编程错误的结果
  • 步长在一个步进拒绝后没有增加
  • 步长不朝着一个积分的末尾大幅下降
  • 指定的(或者探测到的)奇异点由重新启动积分来处理
  • 隐式方法的迭代的发散(例如使用固定的大步长)
  • 不可恢复的积分错误(例如,数字例外)
  • 舍入误差反馈(补偿求和)对于高阶方法或者在数值积分过程中保持特定量的方法尤其有利

数据封装

每种方法都有自己的包含该方法调用所需信息的数据对象. 这包括,但不限于,系数、工作区、步长控制参数、步长接受/拒绝信息,以及雅可比矩阵. 这是用于像 LSODA 这样的代码中的思想的推广([H83], [P83]).

方法层级

方法是可重入的,并且具有层级的,这意味着一个方法可以调用另一个. 这是用于一般常微分方程 (ODE) 求解系统,即Godess (见 [O95]、[O98] 和所附的参考文献)的思想的推广,它用 C++ 实现.

初始设计

原有的方法框架允许大量方法在求解器中被调用.

NDSolve

NDSolve

第一次修订

这在后来被扩展到允许一个方法以顺序方式,按照任意数量的嵌套,调用另一个方法.

NDSolve

复合积分方法的构建对于几何数值积分特别有用.

NDSolve

第二次修订

需要一个更普遍的树调用过程来实现组成方法.

NDSolve

这是一个由连接方法组成的方法的例子.

当前状态

扩展了树的调用过程,以允许由每个方法求解子场,而不是整个向量场.

这个例子出现在 "NDSolve 的 "Composition" 和 "Splitting" 方法" 的ABC流章节中.

NDSolve

用户扩展性

内置方法可以用作特殊用途(复合)积分器的有效构建的组成块. 也可以添加用户定义的方法.

方法类

诸如 等的方法包括大量不同阶数的方案. 此外,不同的系数选择也可以由用户指定. 这是在RKSUITE 中的思想的推广 [BGS93].

自动选择和用户可控性

该框架提供自动步长选择和方法顺序选择. 方法可由用户通过方法选项来配置.

例如,用户可以选择一类 方法,代码将根据问题、相对和绝对局部误差容差和初始步长估计,自动尝试确定最优的阶数.

下面是适用于 的一个选项列表.    

In[1]:=
Click for copyable input
Out[1]=

MethodMonitor

为了说明一些方法的底层行为,如刚性切换或者运行时的阶数变化,已经加入一个新的 .

它介于相对粗糙的 解决方法和优良的 解决方案之间.

此功能没有正式编档,并且这些功能在未来版本中可能会改变.

共享特色

这些特点并不一定局限于 NDSolve,因为它们也可以用于其它数值方法.

  • 函数的计算是使用一个 来执行的,它能够根据需要动态改变类型,比如当 IEEE 浮点溢出或者下溢发生时,在适当的时候,为高效起见,它也调用 Wolfram 语言编译器 Compile .
  • 雅可比的计算使用符号微分,或者有限差分近似,包括自动或者用户可指定的稀疏性检测.
  • 稠密线性代数是以 LAPACK为基础,而稀疏线性代数使用专用的程序包,如 UMFPACK.
  • 代表一个微分系统的函数数值计算中的共同子表达式被检测和收集,以避免重复的工作.

    该系统在数值积分中动态地从实数到复数进行类型切换,根据需要自动重新编译.

    In[2]:=
    Click for copyable input
    Out[2]=

一些基本方法

顺序
方法
公式
1显式欧拉
2显式中点
1反向或者隐式欧拉(1-阶段 RadauIIA)
2隐式中点(1-阶段高斯)
2梯形 (2-阶段 Lobatto IIIA)
1线性隐式欧拉
2线性隐式中点

已经实现的一些一步方法.

这里 表示单位矩阵,而 表示雅可比矩阵 .

虽然隐式中点法尚未作为一个单独的方法实现,但是它可以通过 方法的一阶段高斯方案得到.