How to| 验证 NDSolve 的结果

对于大多数微分方程,由 NDSolve 给出的解是相当准确的. 然而,由于它的结果基于数值抽样和误差估计,偶尔可能会出现明显的误差. 当您需要确保解的质量时,对解做些基本检查是是一个好主意.

WorkingPrecision 高于默认 MachinePrecision 时计算得到的解进行比较往往是一种检查结果的有效方法.

解不同,存储解的数据的点的位置可能也会不同,导致在这些点处出现差异. 使用 InterpolationOrder->All 可以使这种差异保持在解的数值误差范围之内.

使用 NDSolve 和默认的 MachinePrecision 计算解:

In[1]:=
Click for copyable input

使用 NDSolveWorkingPrecision->22 计算解:

In[2]:=
Click for copyable input

由于误差往往相当小,用对数坐标来观察它们比较方便. RealExponentLog10[Abs[x]] 相比,唯一的不同是前者在零点处没有奇点,因此用它来观察在某些点处可能为零的误差是一个很好的选择:

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

微分方程的残差是方程左边和右边之差:

In[4]:=
Click for copyable input

NDSolve 中使用的数值方法能够使残差在任何点处都很小. 您可以对残差的对数进行绘图:

In[4]:=
Click for copyable input
In[5]:=
Click for copyable input
Out[5]=

正如您所看到的,在使用较高的 WorkingPrecision 时,数值误差显著变小. 当然,这样做的代价是使计算时间延长.

尽管在大多数情况下,残差越小数值解越准确,但也有例外. 一个简单的例子是 Duffing 方程:

In[6]:=
Click for copyable input
In[7]:=
Click for copyable input
In[8]:=
Click for copyable input
Out[8]=
New to Mathematica? Find your learning path »
Have a question? Ask support »