第1章 设计数值算法应遵循的原则
数值算法是由各种基本运算和规定的运算顺序构成的、用于在计算机上求解特定问题的完整方案,简称为算法 . 数值分析的基本任务就是构造求解各种数学问题的数值算法,分析算法的误差,研究算法的收敛性和数值稳定性,通过编程和上机实现算法求出问题的数值解,并将求得的结果与相应的理论结果或可能的实验结果作对比分析和图形展示,验证算法的有效性.
描述算法可用自然语言、流程图以及伪代码,其中伪代码用介于自然语言和计算机算法语言之间的文字和运算符描述算法思想和执行过程,不用图形符号,书写简单,修改方便,格式紧凑,且便于程序设计和实现 . 因此,本书采用伪代码描述算法.
为控制数值计算过程中的误差传播和积累,确保计算结果满足精度要求,设计数值算法时必须遵循一定的基本原则,本章介绍五个重要的原则.
1.1通过简化计算步骤尽量减少运算次数
1.1.1 知识要点
对于同一个计算问题,如果能减少运算次数,不但可节省计算时间,而且能减少舍入误差的积累 . 因此,设计数值算法的一个重要原则就是通过简化计算步骤尽量减少运算次数.
例分析计算如下多项式的值所需要的乘法与加法次数 .
解若直接计算 axk (k= 0,1, ., n) ,再逐项相加,则需要做的乘法的次数为
2 需要做的加法次数为 n次. 若先将多项式改写为如下形式
即构造秦九韶算法递推公式
(1.1)
则需要做的乘法和加法次数都是 n次.
1.1.2 算法描述
计算多项式 p(x)在点x0处的值的秦九韶算法如下.
算法 1-1:秦九韶算法
1)输入多项式的次数 n.
2)按降幂顺序输入多项式各次项的系数 .
3)输入点
4)
5)如果,计算;否则,转步骤 7).
6)转步骤 5).
7)输出计算结果
8)结束
1.1.3编程实现举例
例 1-1用秦九韶算法求多项式 7x5 .3x4 +5x2 +11 在 x0 =1.27 和.1.34 两点的值. 解 Matlab程序如下:
1.2避免两个很相近的近似值相减
1.2.1 知识要点
设 x*和 y*分别为精确值 x和 y的近似值,则 z* = x* . y*是精确值 z = x . y的一个近似值,z*的相对误差 Er() 满足
(1.2)
上式表明,如果 x*和 y*是两个很相近的近似值,则非常小,因而 z*的相对误差可能会很大.
例设 x =1000,取 4位有效数字,仿机器计算的值.
解直接计算得
若先对公式作恒等变形,然后再进行计算,则有
恒等变形后再计算的结果有 4位有效数字,而直接计算只有 1位有效数字,直接计算导致有效数字产生了严重损失 . 因此,避免两个很相近的近似值相减是设计数值算法要遵循的重要原则 . 当出现两个近似值相减的运算时,应利用恒等式或等价关系先对计算公式作变形,避免两个很相近的近似值的减法运算,然后再进行计算. 根据代数基本定理,实系数一元二次方程在复数域内一定存在两个根. 解实系数一元二次方程ax2 +bx c 0 ( a ≠0) 在复数域内的根时,根据求根公式,当b2 .4ac >0 时,方程有两个实数根
(1.3)
当b2-4ac =0 时,方程有二重实根
(1.4)
当b2 -4ac <0 时,方程无实数根,但有一对共轭复根
(1.5)
从式( 1.3)可以看到,求两个实数根的公式中,一定有一个要进行两数相减运算. 当时,将出现两个很相近的近似值相减的情形 . 为减少有效数字的损失,应先利用不含两个很相近的近似值相减的求根公式求出其中一个根,如
其中符号函数 sign(b)表示取数 b的符号,
再根据一元二次方程根与系数的关系,求出方程的另一个根
1.2.2 算法描述
在复数域内求一元二次方程的两个根的算法如下:
算法 1-2:求实系数一元二次方程在复数域内的根
1)输入方程的系数 a, b, c.
2)计算
3)如果,则计算,输出计算
结果,转步骤 6);否则,转步骤 4).
4)如果 Δ=0,则计算,输出计算结果,转步骤 6);否则,转步骤 5).
5)计算,输出计算结果 .
6)结束
1.2.3编程实现举例
例 1-2求实系数一元二次方程 ax2 +bx +c =0 ( a ≠0) 在复数域内的两个根,要求精确到小数点后第 6位,其中实系数 a, b和 c通过键盘输入 . 解 Matlab程序如下:
1.3防止大数“吃掉”小数
1.3.1 知识要点
计算机进行算术运算时首先要对阶,将参与运算的两个数都写成绝对值小于 1且阶码相同的数,然后再进行计算 . 当两个量级相差很大的数相加时,由于计算机的字长固定,能表示的有效数字位数有限,绝对值很小的数可能会被大数“吃掉”,严重影响计算结果的可靠性 . 例如, x=6.78×108 +0.12 在计算机上将被记为
若计算机只能表示 8位小数,则计算结果为 x=0.678 ×10-9 ,较小的数 0.12被“吃掉”了 . 因此,为提高计算精度,设计数值算法时要避免绝对值很小的数与大数直接相加,防止大数“吃掉”小数 . 由此也可看到,在计算机上进行加法运算时,交换律与结合律可能并不成立.
设数 a为一个很大的数,一批绝对值相对于数 a很小的数 i(1,2, .n) 存储于一个数据文件中,要计算和
(1.6)
读入数据文件中各个绝对值相对很小的数后,为防止大数“吃掉”小数,应该先计算出,再与 a相加,不能按从左到右的顺序将很大的数与绝对值很小的数逐个相加.
1.3.2 算法描述
计算一个大数与存储于数据文件中的一批绝对值相对很小的数之和的算法如下:
展开