此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

1.12.1 为什么用户通常不需要知道内部信息

本书主要涉及解释 Mathematica 做什么,而不是它怎样做.但本章的目的是至少 说一点 Mathematica 怎样做它要做的事情.
应当认识到了解 Mathematica 的内幕或许是智力方面的兴趣. 在实用中它通常是不重要的. 实际上,Mathematica 的要点之一是它提供了一个环境,在其中能执行数学和其它运算,而不必考虑这些运算如何在计算机中进行的细节. 例如,当用户想要对多项式  分解因式时,仅需给 Mathematica 一个命令 Factor[x^15-1] 即可. 用户不必知道由 Mathematica 内部代码执行的这种因式分解的复杂细节.
实际上,在几乎所有的 Mathematica 的使用中,Mathematica 在内部如何工作的 问题被证明是毫不相干的.在大多数情况下,把 Mathematica 看作一个执行指定 数学和其它运算的抽象系统就足够了.
用户可能认为了解 Mathematica 在内部是如何工作的对于确定它给出的答案是 必要的. 但这只是很罕见的情形.对于 Mathematica 进行的绝大多数运算完全由 数学和其它运算的定义来指定. 例如,3^40 将总是 12157665459056928801,而 不管 Mathematica 内部如何计算这个结果.
然而,有一些情形,几个答案是等价的. 例如,在计算积分时, 通常有几个不同的表达式其导数是相同的. Integrate 生成其中的哪一个可能依赖于 Integrate 的内部工作方式.

这是由 Integrate 生成的结果

这是等价的表达式,如果在内部 Integrate 以不同的方式工作,它可能直接被生成

在数值计算中出现类似的现象. 例如,FindRoot 给出函数的一个根. 但如果有几个根,哪个根被返回取决于 FindRoot 在内部如何工作的详细资料.

这里求出  的一个特殊的根

使用不同的初始点,不同的根被求出.对于每个初始点,哪个根被求出,依赖于内部使用的算法

如果把近似计算扩大到其有效性的极限处,对内部算法的依赖会是更明显的. 例如,如果给 NIntegrate 一个病态被积函数,它是否生成一个有意义 的结果可能依赖于它使用的内部算法.

NIntegrate 知道这个结果是不可靠的. 可能依赖于内部的算法. 所以给出警告信息

传统数值计算系统一直倾向于遵循这种思想:所有的计算应当产生甚少有相 同精度的结果.这个思想的推论是:仅仅看一个结果来知道它是否精确是不够的; 用户还必须分析求出该结果的内部算法.这个事实一直使人们相信,知道数值 计算的内部算法总是重要的.
但是,对于 Mathematica 采取的方法,这是罕见的情形. 因为 Mathematica 通常能使用其任意精度的数值计算能力给出结果,所产生的每一数位遵循 正在执行的运算的精确数学规范.

尽管这是一个近似数值计算,但每一位都由  的数学定义来决定

再一次,这里的每一位由 sin(x) 的数学定义来决定

如果使用机器精度数 Mathematica 不能给出可靠的结果,答案依赖于所使用的内部算法

当用户得到的结果可能被内部算法影响时,不应当依赖这些结果. 如果没有别 的问题.那么 Mathematica 的不同版本在这些结果中可能表现出的差别,或者因为算法 在不同计算机系统上运行有一些不同,或者因为本质上不同的算法被使用在 不同时期发行的版本中.

这是  在一种计算机上的结果

这是它在另一种计算机上的结果

这是它在 Mathematica 第1版中得到的结果

特别在 Mathematica 更高级的应用中,有时可能值得花精力去分析内部 算法以便预言对给定计算的哪一种做法是更有效的.实际上,通过这种分析, 在特定的计算中有时会产生很大的改进.
但是,更多情况下,这种分析是不值得的.因为 Mathematica 内部是相当复杂的, 即便给出一个特定算法的基本描述,要达到这个算法在特定场合的实际行为的详细 实现通常是极端困难的.
一个典型的问题是 Mathematica 有许多内部的最优化方法. 运算的效率在很大程 度上被是否在计算中允许使用内部的优化算法所影响.