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

InterpolatingFunctionAnatomy

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

下面加载该程序包.
In[21]:=
Click for copyable input

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

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

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

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

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

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

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

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

以下产生一个三维图形,显示了每个空间网格点的时间演化. 初始条件用红色显示.
In[15]:=
Click for copyable input
Out[15]=

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

该导数返回一个新的 InterpolatingFunction 对象.
In[16]:=
Click for copyable input
Out[16]=
下面显示将计算哪一阶导数.
In[17]:=
Click for copyable input
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 采用的步长的图形

程序包中提供的函数.

下面加载该程序包.
In[18]:=
Click for copyable input

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

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

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

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

InvariantErrorPlot 选项

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

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

函数 的选项.

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

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

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

New to Mathematica? Find your learning path »
Have a question? Ask support »