WOLFRAM 语言教程

数值数学的不定性

Wolfram 系统求数值积分的方法与求符号积分的方法完全不同.

求符号积分时,Wolfram 系统取被积函数的函数形式,对其使用一系列精确的符号变换规则来计算积分.

然而,当 Wolfram 系统求数值积分时,在一些初始符号预处理时候,它具有的被积函数的信息仅仅是被积函数的一系列数值值. 要得到积分的确切结果,Wolfram 系统必须对被积函数的光滑性和其它性质做出某种假定. 如果被积函数是严重病态的,这些假定可能失效,因此,Wolfram 系统可能对积分给出错误结果.

例如,当对在特定位置具有非常细的尖峰的函数进行数值积分时,这个问题可能出现. Wolfram 系统在许多点处对函数采样,然后假定函数在这些点间光滑变化. 因此,如果没有接近尖峰的采样点,那么尖峰将检测不到,它对该数值积分的贡献就不能正确地包括进去.

这里是函数 的图形.
In[1]:=
Click for copyable input
Out[1]=
NIntegrate 给出在区间 上的数值积分的正确结果.
In[2]:=
Click for copyable input
Out[2]=
然而如果在区间 上求此积分,NIntegrate 将丢失 附近的尖峰,而给出错误的结果.
In[3]:=
Click for copyable input
Out[3]=

NIntegrate 力图尽可能好地利用能得到的关于数值积分的信息. 例如,当 NIntegrate 注意到在某一区域中估计误差较大时,它会在该区域取更多的采样点. 用这种方法,NIntegrate 尽量使运算适应特定的被积函数.

NIntegrate 使用的这种适应程序与函数 Plot 力图画出函数的光滑曲线所做的事情相类似. 在两种情况下,Wolfram 系统都是在特定区域中尽量取更多的采样点,直到在该区域找出函数的光滑近似为止.

出现在数值积分中的这种问题也会出现在函数的其它数值运算中.

例如,当求无穷级数和的数值近似时,Wolfram 系统在级数中取一定数量的项作为样本,然后用外插法估计其它项. 如果在级数中很后面的地方插入大的项,那么做外插时可能检测不到它们,这样可能得到错误的结果.

在求函数极小值的数值近似时,出现类似的问题. Wolfram 系统只采有限个样本值,然后在这些值之间对函数进行光滑插值. 如果函数在某区域有一个急剧的下降, Wolfram 系统可能错过这个下降,而给出错误的最小值.

仅对函数进行数值计算时,无法避免以上讨论的各种问题. 当然,如果进行精确的符号运算,可以避免这些问题.

在许多计算中,最好是尽量地使用符号运算,然后再引用数值方法,这样能最后地避免在纯数值计算中出现的问题.