Appearance
19.8.4 交互程序系统和计算机代数系统的应用
19.8.4.1 Matlab
商用程序系统 Matlab (矩阵实验室) 是一个数学求解公式问题的交互环境, 同时也是科学技术计算的高级原本语言. 优先设置线性代数的问题和算法. Matlab 很方便地将实现数值程序及数据和结果的先进的图形表示统一起来. 根据 IEEE 标准 (表 19.4) 计算大多以双精度浮点数运行. 能与 Matlab 兼容的进一步的选择是可免费下载的 Scilab 和 Octave 系统.
1. 函数概述
下面是 Matlab 中程序和函数的简要概述.
Allgemeine mathematische Funktionen
1. Trigonometrie 5. Koordinatentransformationen 2. Exponentialfunktion, Logarith- 6. Rundung und gebrochener Teil men 3. Spezielle Funktionen 7. Diskrete Mathematik 4. Komplexe Arithmetik 8. Mathematische Konstanten
1. Manipulation von Feldern und
Matrizen
2. Spezielle Matrizen
3. Matrix-Analysis (Normen, Kondi-
tion)
4. Lineare Gleichungssysteme
5. Eigenwerte und Singulärwerte
6. Matrix-Faktorisierungen
7. Matrixfunktionen
8. Verfahren für dünn besetzte Ma-trizen
Numerische Verfahren
1. Berechnung statistischer Daten 7. Ermittlung der konvexen Hülle 2. Korrelation und Regression 8. Numerische Integration 3. Diskrete Fouriertransformation 9. Gewöhnliche Differentialgleichun- 4. Polynome und Splines gen 5. Ein- und mehrdimensionale Inter- 10. Partielle Differentialgleichungen polation 11. Nichtlineare Gleichungen 6. Triangulationen und Zerlegungen 12. Minimierung von Funktionen
此外, Matlab 有许多用来求解不同类型的特殊数学问题的程序包, 即所谓工具箱. 作为某些例子, 这里提到曲线拟合、滤波器、商业数学、时间序列分析、信号和模式处理、神经网络、优化、偏微分方程、样条、统计和小波.
在下面的段落中, 以简单的例子来说明 Matlab 的应用. 在后面 Mathematica 和 Maple 的数值应用中, 将同样讨论这些问题.
2. 数值线性代数
在开启 Matlab 命令提示符 “>>” 后, 命令窗口显示等待接受命令. 若命令不以分号 “; ” 结束,则在命令窗口出现结果. 求解线性方程组
输出为
残量的欧几里得范数表明, 得到的解 (并未显示所有的数字) 以允许的计算机浮点数表示的精度满足方程组.
若矩阵
实现. 得到输出
(这里为了避免混乱用括号表示矩阵).
反斜杠算符首先测试系数矩阵
若系数矩阵
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND
在超定线性方程组的情况下, 相应的线性拟合问题由正交化过程处理, 即由正交变换得到
(参见第 1246 页 19.2.1.3).
0.4673
-0.4953
反斜杠算符也对欠定和缺秩的线性方程组给出了有意义的结果. 如何处理大型稀疏矩阵的方法的详细介绍可见相应的 Matlab 文件和说明 [19.15],[19.30].
3. 方程的数值求解
在 Matlab 中用行向量
的系数. 有多个函数可用来处理多项式.
根作为相应伴随矩阵的特征值被确定. 命令 fzero 用来求非线性标量方程的近似解.
在命令 fzero 下输入方程作为未命名的函数. 显然它依赖于第二个变量的给定初值, 其解是近似的. 迭代过程用二分法和试位法的组合完成 (参见第 1236 页 19.1.1.3).
4. 插值
基于给定数据的函数拟合可以通过插值 (参见第 1276 页 19.6.1) 或最佳函数逼近 (参见第 1280 页 19.6.2.2) 得到. 在 Matlab 中, 命令 plot 是以图形表示数据集合的最简单的方式. 在自打开图表窗口的菜单中包含编辑图形 (线型、符号、标题和说明) 的工具, 用于输出和打印基本拟合.
基本拟合是工具箱的子程序, 提供了多种插值方法和不同阶的最佳逼近多项式. 由函数 “interp1” 和 “polyfit” 来实现.
数据值被置于数据位置

函数 interp2 提供在二维矩形网格上给定数据作插值的适当方法 (参见第 1295 页 19.7.2.1). 对于非规则分布的数据作插值调用 griddata.
实现了函数
5. 数值积分
在 Matlab 中程序 quad 和 quadl 可用于数值积分. 这两个程序基于自适应选取步长递归应用插值求积. Quad 基于辛普森公式, quadl 应用高阶洛巴托公式 (参见第 1253 页 19.3.2). 在被积函数充分光滑的情况及较高的精度要求下, quadl 比 quad 更有效.
作为第一个例子,考虑近似计算定积分
Warning: Divide by zero.
两个程序显然都认知被积函数在区间左端的不连续性, 但得到积分的近似值并无困难. 基于同一例子在 1257 页 19.3.4.2 中的结果, 函数求值的数目看来很大, 但可自适应递归确定.
(这里没有重复警告信息). 作为进一步的论证给出确定的精度为
被积函数在积分区间的非常宽广的部分形状平坦,而在
6. 微分方程的数值解
Matlab 提供了许多数值求解一阶常微分方程初值问题的程序. 标准的程序为 ode45, 其中应用带自适应步长选取的 4 阶和 5 阶龙格-库塔法 (参见第 1260 页 19.4.1.2). 为达到高精度, 使用预估-校正型线性多步法的程序 ode113 更有效 (参见第 1262 页 19.4.1.4). 此外, 还有些程序对刚性微分方程组特别有效 (参见第 1264 页 19.4.1.5,4.).
得到的解如图 19.20(a) 所示.
在区间
其初值条件为
最后的命令给出了在

19.8.4.2 Mathematica
1. 求解数学问题的工具
计算机代数系统 Mathematica 是能用来求解大量数值数学问题的非常有效的工具. Mathematica 的数学程序完全不同于符号计算. 根据某些预先给定的原则, 类似于图像表示的情况, Mathematica 确定所考虑函数的数值表, 并利用这些数值确定要求的解. 因为点数必须是有限的, 这可能是一个 “坏” 性态函数的问题. 尽管 Mathematica 在问题区域内试图选取更多的节点, 我们必须假定在所考虑区域上的某种连续性. 这可能在最终的结果中产生误差. 建议尽可能使用所考虑问题的许多信息, 且若有可能, 在符号形式下进行计算, 即使这仅对子问题有可能.
在表 19.5 中, 我们介绍了用于数值计算的算子.
NIntegrate | 计算定积分 |
NSum | 计算和 |
NProduct | 计算积 |
NSolve | 数值计算求解代数方程 |
NDSolve | 数值计算求解微分方程 |
在启动 Mathematica 的 "Prompt" 之后显示
2. 曲线拟合与插值
(1) 曲线拟合 Mathematica 可用最小二乘法选取函数拟合数据集 (参见第 609 页 6.2.5), 且平均逼近离散问题 (参见第 1280 页 19.6.2.2). 一般的指令为
这里数值
- 设给定如下数据表:
输入
若
用命令
可得数据表示及图 19.21(a) 给出的近似曲线.

这完全满足给定的数据.
(2) 插值 Mathematica 提供特殊的算法确定插值函数. 它们表示为类似于纯函数构成的所谓插值函数类. 表 19.6 给出了其使用指南. 取代单独的函数值
表 19.6 插值命令
Interpolation | 对 |
Interpolation | 对点列 |
3. 多项式方程的数值解
如同在第 1348 页 20.3.2.1 中所示, Mathematica 能数值确定多项式的根. 命令是
其中
4. 数值积分
Mathematica 为数值积分提供了程序 NIntegrate. 不同于符号方法, 它用被积函数的数值表工作. 考虑以两个非正常积分为例 (参见第 673 页 8.2.3).
Power::infy: Infinite expression
NIntegrate::inum: Integrand ComplexInfinity is not numerical at
在例 B 中, Mathematica 认知在
Mathematica 使用某些预定的选项进行数值积分, 而在某些特殊情况下是不充分的. 可以用参数 MinRecursion 和 MaxRecursion 确定 Mathematica 在问题区域工作的最小和最大递归步数. 默认选项为 0 和 6 . 若此值增加, 则即使 Mathematica 运行变慢, 但结果更好.
NIntegrate::ploss:
数值积分因失去精度停止. 无法达到要求的精度或准确度的目标; 怀疑有如下情况: 高振荡的被积函数或积分的真值为 0 .
若要求为
则结果是
类似地, 可用命令
得到接近于积分真实值的结果. 给出积分上下限间的奇点
5. 微分方程的数值解
Mathematica 介绍了用 InterpolatingFunction 数值求解常微分方程和方程组的结果, 可得到解在给定区间任意点的数值及解函数的简略图形表示. 最常用的命令见表 19.7.
表 19.7 微分方程数值解命令
在 | |
给出点 | |
Plot | 解的图形表示 |
求解描述重物在有摩擦的介质中运动的微分方程. 二维运动方程为
设摩擦正比于速度.
Mathematica 通过插值函数给出答案:
则解
表示为参数曲线 (图 19.22(a)).

NDSolve 接受影响结果精度的多种选择.
计算的精度可由命令 AccuracyGoal 给出. 类似运行命令 PrecisionGoal. 计算过程中 Mathematica 根据所谓的 WorkingPrecision 运行, 在要求更高精度的计算中应增加五个单位.
Mathematica 在所考虑区域内的工作步数规定为 500 . Mathematica 一般在问题区域的邻域增加节点数, 在奇点邻域可能耗尽步数极限. 在这种情况下, 可用 MaxSteps 增加步数, 也可对 MaxSteps 用命令 Infinity.
- 傅科摆 (Foucault) 方程为
其中
加上
得图 19.22(b).
19.8.4.3 Maple
计算机代数系统 Maple 能用内置逼近法求解许多数值数学问题. 计算要求的节点数,可由规定整体变量 Digits 的任意值
1. 表达式和函数的数值计算
在启动 Maple 后, 显示符号 “Prompt”, 这表示准备输入. 输入和输出通常连在一行中表示,由箭头算子 “
(1) 算子 evalf 能作为实数求值的包含内置和用户定义函数的表达式的数值, 可用命令
计算.
则用命令
在 1 和 4 之间步长为 0.2 的函数值表可用命令
得到. 这里要求用 12 位字节计算.
Maple 以形如
(2) 算子
2. 方程的数值解
大多数情况下使用 Maple 可以数值求解方程或方程组. 其命令是 fsolve. 其句法为
该命令确定实数解. 若 eqn 是多项式形式, 则结果都是实根. 若 eqn 不是多项式形式, 则很可能 fsolve 仅返回一个解. 可用的选项在表 19.8 中给出.
complex | 确定一个复根 (或多项式的所有根) |
maxsols | 确定至少 |
fulldigits | 保证不减少计算中用到的位数 |
intervall | 在给定区间内求根 |
得
Maple 仅得到两个实根. 选择 complex, 也得到复根:
正根的结果为
由
Maple 也确定第二个 (负) 根.
3. 数值积分
通常只可能用数值方法计算定积分的值. 当被积函数太复杂, 或原函数不能表示成基本函数时, 正是这种情况. 在 Maple 中确定定积分的命令为 evalf:
Maple 通过使用逼近公式计算定积分.
若
则答案为: 277.745841695583.
Maple 使用内置逼近法计算有 15 位数字的数值积分.
在某些情况下, 尤其若积分区间太大, 该方法失效. 此时可试用图书馆的另一个逼近程序
该程序使用自适应牛顿法.
输入
得到误差信息. 由
得到正确的结果. 第三个参量规定精度, 最后一个规定逼近法的内部记号.
4. 微分方程的数值解
常微分方程可用 Maple 运算 dsolve 求解. 然而在大多数情况下, 不可能确定封闭形式的解. 在这些情况下必须给定相应的初值条件, 可以数值求解.
为了做到这一点, 使用如下形式的命令 dsolve:
其中选项 numeric 作为第三参量. 这里参量 deqn 包含实际的微分方程和初值条件. 运算结果是一个程序,若记为
Maple 应用龙格-库塔法得到该结果 (参见第 1260 页 19.4.1.2). 相对误差和绝对误差的默认精度为
在解 19.4.1.2 龙格-库塔法一节中给出的问题时, Maple 给出:
其中
我们能确定解,例如在