数值微分方程求解的实用程序包

InterpolatingFunctionAnatomy

NDSolve 把解作为 InterpolatingFunction 对象返回. 在大多数情况下,简单地把这些作为函数使用可以实现所需的目的,但是有时访问内部的数据是有用的,这包括实际值和 NDSolve 采取步骤时计算的点. 一个InterpolatingFunction 对象的结构被精确编排使得数据的存储更有效,在一个给定点的计算速度更快. 该结构在 Wolfram 语言版本之间可能发生改变,因此访问 InterpolatingFunction 对象的代码对于新的 Wolfram 语言版本可能不适用. DifferentialEquations`InterpolatingFunctionAnatomy` 程序包提供了为将来的 Wolfram 语言版本维护的 InterpolatingFunction 对象中的数据接口.

InterpolatingFunctionDomain[ifun]InterpolatingFunction 对象 ifun 的每个维度,返回定义域的一个列表
InterpolatingFunctionCoordinates[ifun]InterpolatingFunction 对象 ifun 的每个维度上指定的数据,返回数据坐标的一个列表
InterpolatingFunctionGrid[ifun]返回为 InterpolatingFunction 对象 ifun 指定数据的网格点.
InterpolatingFunctionValuesOnGrid[ifun]通过在每个网格点上计算 InterpolatingFunction 对象 ifun,返回计算所得的值
InterpolatingFunctionInterpolationOrder[ifun]返回对 InterpolatingFunction 对象 ifun 的每个维度所用的插值顺序
InterpolatingFunctionDerivativeOrder[ifun]返回基本函数的导数的阶数,其值当计算 InterpolatingFunction 对象 ifun 时指定

InterpolatingFunction 对象的分解.

下面加载该程序包:

一个 InterpolatingFunctionAnatomy 程序包变得有用的常见情况是:当 NDSolve 无法在指定的整个值域上计算一个解,并且用户想要把所有计算所得的解画出图形,以便于尝试对可能出现的错误有更好的理解.

下面是一个微分方程的例子,对这个微分方程不能计算到指定的端点:
下面得到这个区域(domain):
一旦这个区域域已经在一个列表中返回,则很容易使用 Part 获取所需的端点,并且画出图形:

从图形中,很显然可以看出形成了一个奇异点,不可能对系统进一步积分.

有时候,查看 NDSolve 在哪里采取步进是有用的. 获取坐标对于实现此目的是有用的.

下面显示在采取的每个步骤中 NDSolve 计算所得的值. 由此可以很明显地看出,将近所有步骤都用来试图解决奇异点:

该程序包对于分析偏微分方程的计算解尤其有用.

使用这个初始条件,Burgers 方程形成了一个陡峭的前端(front):
下面显示了在每个维度上使用的点数:
以下显示在每个维度上使用的插值阶数:
以下表明无法解决前端(front)问题已经表现为数值不稳定性:
以下显示在时间积分的端点,在空间网格点计算所得的值:

从点图中很容易看出,前端(front)还没有被分辨.

以下产生一个三维图形,显示了每个空间网格点的时间演化. 初始条件用红色显示:

当采用 InterpolatingFunction 对象的一个导数时,则返回一个新的 InterpolatingFunction 对象,那么在一个点上计算时,它会给出要求的导数. InterpolatingFunctionDerivativeOrder 是决定哪种导数应该计算的一种方法.

该导数返回一个新的 InterpolatingFunction 对象:
下面显示将计算哪一阶导数:

NDSolveUtilities

我们已经编写了许多实用例程来用来对不同的 NDSolve 方法进行考查和比较. 这些函数收集在程序包 DifferentialEquations`NDSolveUtilities` 中.

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 采用的步长的图形

NDSolveUtilities 程序包中提供的函数.

下面加载该程序包:

分析朗格-库塔方法的有益途径是当应用到一个标量线性测试问题时,研究他们如何表现(见程序包 FunctionApproximations.m).

下面对阶数为4的2-阶段隐式朗格-库塔高斯方法的系数进行(精确或者精度无限高)的负值:
下面计算线性稳定性函数,它对应于在原点的指数的 (2,2) Padé 近似:

函数 CompareMethodsFinalSolutionsRungeKuttaLinearStabilityFunctionStepDataPlot 的例子可以在 "NDSolve 的 ExplicitRungeKutta 方法" 中找到.

函数 InvariantErrorPlot 的例子可以在 "NDSolve 的Projection方法" 中找到.

InvariantErrorPlot 选项

函数 InvariantErrorPlot 具有许多可以用来控制结果形式的选项.

选项名
默认值
InvariantDimensionsAutomatic指定不变量的维度
InvariantErrorFunctionAbs[Subtract[#1,#2]]&指定用于比较误差的函数
InvariantErrorSampleRateAutomatic指定对误差进行采样的频率

函数 InvariantErrorPlot 的选项.

InvariantDimensions 的默认值用来从输入的结构确定维度,Dimensions[invts].

InvariantErrorFunction 的默认值是一个计算绝对误差的函数.

InvariantErrorSampleRate 的默认值是如果所采取的步骤小于1000,则对所有点采样,在这个阈值之上,则使用一个对数采样率.