数值微分方程求解的实用程序包
InterpolatingFunctionAnatomy
NDSolve 把解作为 InterpolatingFunction 对象返回. 在大多数情况下,简单地把这些作为函数使用可以实现所需的目的,但是有时访问内部的数据是有用的,这包括实际值和 NDSolve 采取步骤时计算的点. 一个InterpolatingFunction 对象的结构被精确编排使得数据的存储更有效,在一个给定点的计算速度更快. 该结构在 Mathematica 版本之间可能发生改变,因此访问 InterpolatingFunction 对象的代码对于新的 Mathematica 版本可能不适用.
程序包提供了为将来的 Mathematica 版本维护的 InterpolatingFunction 对象中的数据接口.
InterpolatingFunction 对象的分解.
一个
程序包变得有用的常见情况是:当 NDSolve 无法在指定的整个值域上计算一个解,并且用户想要把所有计算所得的解画出图形,以便于尝试对可能出现的错误有更好的理解.
下面是一个微分方程的例子,对这个微分方程不能计算到指定的端点.
| Out[2]= |  |
| Out[3]= |  |
一旦这个区域域已经在一个列表中返回,则很容易使用
Part 获取所需的端点,并且画出图形.
| Out[5]= |  |
从图形中,很显然可以看出形成了一个奇异点,不可能对系统进一步积分.
有时候,查看 NDSolve 在哪里采取步进是有用的. 获取坐标对于实现此目的是有用的.
下面显示在采取的每个步骤中
NDSolve 计算所得的值. 由此可以很明显地看出,将近所有步骤都用来试图解决奇异点.
该程序包对于分析偏微分方程的计算解尤其有用.
使用这个初始条件,Burgers 方程形成了一个陡峭的前端(front).
| Out[9]= |  |
| Out[10]= |  |
以下表明无法解决前端(front)问题已经表现为数值不稳定性.
| Out[11]= |  |
以下显示在时间积分的端点,在空间网格点计算所得的值.
| Out[14]= |  |
从点图中很容易看出,前端(front)还没有被分辨.
以下产生一个三维图形,显示了每个空间网格点的时间演化. 初始条件用红色显示.
| Out[15]= |  |
当采用 InterpolatingFunction 对象的一个导数时,则返回一个新的 InterpolatingFunction 对象,那么在一个点上计算时,它会给出要求的导数.
是决定哪种导数应该计算的一种方法.
| Out[16]= |  |
| Out[17]= |  |
NDSolveUtilities
我们已经编写了许多实用例程来用来对不同的 NDSolve 方法进行考查和比较. 这些函数收集在程序包
中.
| CompareMethods[sys,refsol,methods,opts] | 返回应用到系统 sys 的不同方法的统计 |
| FinalSolutions[sys,sols] | 关于对应于系统 sys 的不同解 sols,在数值积分的末尾返回解的值 |
| InvariantErrorPlot[invts,dvars,ivar,sol,opts] | 返回解 sol 的不变量 invts 中的误差的图形 |
| RungeKuttaLinearStabilityFunction[amat,bvec,var] | 使用变量 var 返回朗格-库塔方法的线性稳定性函数,其中系数矩阵 amat 和权向量 bvec |
| StepDataPlot[sols,opts] | 以对数度量返回解 sols 采用的步长的图形 |
程序包中提供的函数.
分析朗格-库塔方法的有益途径是当应用到一个标量线性测试问题时,研究他们如何表现(见程序包 FunctionApproximations.m).
下面对阶数为4的2-阶段隐式朗格-库塔高斯方法的系数进行(精确或者精度无限高)的负值.
| Out[19]= |  |
下面计算线性稳定性函数,它对应于在原点的指数的 (2,2) Padé 近似.
| Out[20]= |  |
函数
、
、
和
的例子可以在 "NDSolve 的 "ExplicitRungeKutta" 方法" 中找到.
函数
的例子可以在 "NDSolve 的"Projection"方法" 中找到.
InvariantErrorPlot 选项
函数
具有许多可以用来控制结果形式的选项.
函数
的选项.
的默认值用来从输入的结构确定维度,Dimensions[invts].
的默认值是一个计算绝对误差的函数.
的默认值是如果所采取的步骤小于1000,则对所有点采样,在这个阈值之上,则使用一个对数采样率.