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 生成的结果
Out[1]= |  |
这是等价的表达式,如果在内部 Integrate 以不同的方式工作,它可能直接被生成
Out[2]= |  |
在数值计算中出现类似的现象. 例如,FindRoot 给出函数的一个根. 但如果有几个根,哪个根被返回取决于 FindRoot 在内部如何工作的详细资料. 这里求出 的一个特殊的根
Out[3]= |  |
使用不同的初始点,不同的根被求出.对于每个初始点,哪个根被求出,依赖于内部使用的算法
Out[4]= |  |
如果把近似计算扩大到其有效性的极限处,对内部算法的依赖会是更明显的. 例如,如果给 NIntegrate 一个病态被积函数,它是否生成一个有意义 的结果可能依赖于它使用的内部算法. NIntegrate 知道这个结果是不可靠的. 可能依赖于内部的算法. 所以给出警告信息
Out[5]= |  |
传统数值计算系统一直倾向于遵循这种思想:所有的计算应当产生甚少有相 同精度的结果.这个思想的推论是:仅仅看一个结果来知道它是否精确是不够的; 用户还必须分析求出该结果的内部算法.这个事实一直使人们相信,知道数值 计算的内部算法总是重要的. 但是,对于 Mathematica 采取的方法,这是罕见的情形. 因为 Mathematica 通常能使用其任意精度的数值计算能力给出结果,所产生的每一数位遵循 正在执行的运算的精确数学规范. 尽管这是一个近似数值计算,但每一位都由 的数学定义来决定
Out[6]= |  |
再一次,这里的每一位由 sin(x) 的数学定义来决定
Out[7]= |  |
如果使用机器精度数 Mathematica 不能给出可靠的结果,答案依赖于所使用的内部算法
Out[8]= |  |
当用户得到的结果可能被内部算法影响时,不应当依赖这些结果. 如果没有别 的问题.那么 Mathematica 的不同版本在这些结果中可能表现出的差别,或者因为算法 在不同计算机系统上运行有一些不同,或者因为本质上不同的算法被使用在 不同时期发行的版本中. 这是 在一种计算机上的结果
Out[1]= |  |
这是它在另一种计算机上的结果
Out[1]= |  |
这是它在 Mathematica 第1版中得到的结果
Out[2]= |  |
特别在 Mathematica 更高级的应用中,有时可能值得花精力去分析内部 算法以便预言对给定计算的哪一种做法是更有效的.实际上,通过这种分析, 在特定的计算中有时会产生很大的改进. 但是,更多情况下,这种分析是不值得的.因为 Mathematica 内部是相当复杂的, 即便给出一个特定算法的基本描述,要达到这个算法在特定场合的实际行为的详细 实现通常是极端困难的. 一个典型的问题是 Mathematica 有许多内部的最优化方法. 运算的效率在很大程 度上被是否在计算中允许使用内部的优化算法所影响.
|