1.5.1 数值稳定性
定量地分析舍入误差的积累,对大多数算法来说是非常困难的,为了推断舍入误差是否影响结果的可靠性,提出了数值稳定性的概念。
如果在执行算法的过程中舍入误差在一定条件下能够得到控制(或者说舍入误差的增长不影响产生可靠的结果),则该算法是数值稳定的,否则是数值不稳定的。
算法数值稳定的一个必要条件是原始数据小的变化只会引起最后结果有小的变化。具体地说,假定原始数据有误差ε,而且算法执行过程中的一切误差仅由ε引起,设结果的误差为e,则稳定的算法必满足“当ε相对于原始数据不太大时,е相对于结果也不太大”。
在实际运算过程中,参与运算的各种数一般都带有一定的误差,这个误差或者是初值本身就有(如观测误差、估算误差等),或者是由于受计算机有效数字位数的限制所造成的舍入误差。这些初始数据的误差(也称之为摄动),以及在运算过程中所产生的舍入误差即使很小,也会随着计算过程的进行不断地传播下去,对以后的结果产生一定的影响。所谓数值稳定性问题,就是指误差的传播(或积累)是否受控制的问题。如果计算结果对初始数据的误差以及计算过程中的舍入误差不敏感,则可认为算法是数值稳定的,否则就是数值不稳定的。由于原始数据来自工程实际,因此往往是近似的,而且在计算过程中不可避免地会产生舍入误差,因此,确定算法时,必须要考虑数值稳定性问题。
例如,要计算积分,由分部积分法有
可以得到计算In的递推公式
In=1-nIn-1,n=1,2,…
假设用4位小数计算9个积分值(I0,I1,…,I8),先算出=1-e-1≈0.6321,然后按递推关系计算出其余I1,I2,…,I8的值(如表1-1第一列所示的从上而下的正推值),可以看到I8为负值,显然与In>0矛盾。事实上,I7和第三列真值(四位有效数字)相比已经连一位有效数字也没有了。发生这个现象的原因是I0带有不超过的误差,但这个初始数据的误差在以后的每次计算时顺次乘以n=1,2,…而传播积累到In中,使得算到I7就完全不准确了。
表1-1
如果将递推式改写成
由积分估计式
有估计式
当n=8时,有0.0409<I8<0.1111,取初值I8=0.1000,按递推式(1-16)对n=7,6,…,1倒推计算,计算中小数点后第5位四舍五入得I7,I6,…,I0(如表1-1第二列所示的从下而上的倒推值)。与第三列真值(4位有效数字)相比较,I5,I4,…,I0各值全部为有效数字。这样计算的结果如此精确的原因是I8的误差传播到I7时要乘以,直到I0时,I8的误差已缩小为倍。
上面的例子说明,在确定算法时应该选用数值稳定性好的计算公式。