一、选用算法的原则
原则如下:
- 尽量避免两个相近数相减
- 尽量简化运算步骤、减少运算次数
- 尽量防止大数“吃掉”小数
- 尽量选用数值稳定性好的算法
1、避免两个相近数相减
举几个例子:
- 当
x很大时,将算式
x1−x+11换为
x(x+1)1
- 当
x很大时,将算式
x+1
−x
换成
x+1
+x
1
- 当
x1、
x2很接近时,将算式
lgx1−lgx2换成
lgx2x1
2、简化运算步骤、减少运算次数
举个例子:
- 计算多项式函数
pn(x)=anxn+an−1xn−1+⋯+a1x+a0时,可以写成
pn(x)=(…((anx+an−1)x+an−2)x+an−3…+a1)x+a
这也是秦九韶算法(递推算法),可以按照下列公式计算:
⎩⎪⎨⎪⎧un=anuk=xuk+1+akpn(x)=u0(k=n−1,n−2,⋯,1,0)
3、防止大数“吃掉”小数
为了防止出现“机器零”,也可以给每个数乘一个大的因子,例如乘以10,最后再计算原数值。
4、选用数值稳定性好的算法
举个例子:
- 计算积分
In=∫01xnex−1dx(n=0,1,2,⋯)
如果采用下面的递推算法,虽然
I0的近似值误差很小,但是当
n很大的时候计算结果往往失真严重,这样的算法,称为数值不稳定的算法。
{I0=1−e−1In=1−nIn−1
因此应该采用这样的算法:
In−1=n1(1−In)
二、算法稳定性评估
一个算法稳定性的判断,关键是要推导出误差的传播公式。若误差在计算过程中变化大就是不稳定的,否则就是稳定的。