购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 算法的数值稳定性

通过前面对误差传播规律的分析,同一问题当选用不同的算法时,它们所得到的结果有时会相差很大,这是因为运算中的舍入误差在运算过程中的传播常随算法而异。凡一种算法的计算结果受舍入误差的影响小者称它为数值稳定的算法。下面举几个例子来说明。

例1.7 解方程

x 2 -(10 9 +1)x+10 9 =0

由韦达定理可知,此方程的精确解为

x 1 =10 9 ,x 2 =1

如果利用求根公式

来编制计算机程序,在字长为8、基底为10的计算机上进行运算,则由于计算机实际上采用的是规格化浮点数的运算,这时

-b=10 9 +1=0.1×10 10 +0.0000000001×10 10

的第二项中最后两位数“01”,由于计算机字长的限制,在机器上表示不出来,故在计算机对阶舍入运算时为

于是

这样算出的根x 2 =0显然是严重失真的(因为精确解x 2 =1),这说明直接利用式(1.20)求解此方程是不稳定的。其原因是在于当计算机进行加、减运算时要对阶舍入计算,实际上受到机器字长的限制,绝对值相对小的数被大数“淹没”后就无法发挥其应有的影响,由此带来误差,造成计算结果的严重失真。这时,如要提高计算的数值稳定性,必须改进算法。在本例中算出的根x 1 =10 9 是可靠的,故可利用根与系数的关系式 来计算x 2 ,有

所得结果很好。这说明第二种算法有较好的数值稳定性。

注: 在利用根与系数关系式求第二根时,必须先算出绝对值较大的一个根,然后再求另一个根,才能得到精度较高的结果。

例1.8 试计算积分

由分部积分法可得

因此,有递推公式I n =1-nI n- 1 (n=1,2,…),其中I 1 =1/e。

用上面的递推公式,在字长为6,基底为10的计算机上,从I 1 出发计算前几个积分值,其结果如表1.1。

表 1.1计算结果

被积函数x n e x- 1 在积分限(0,1)区间内都是正值,积分值I 9 取三位有效数字时的精确结果为0.0916,但上表中的I 9 =-0.068480却是负值,与0.0916相差很大。怎么会出现这种现象?可分析如下。

由于在计算I 1 时有舍入误差约为ε=4.412×10 -7 ,且考虑以后的计算都不再另有舍入误差。此ε对后面各项计算的影响为

这样,算到I 9 时产生的误差为9!ε≈0.6101就是一个不小的数值了。

可以改进算法来提高此例的数值稳定性,即将递推公式改写为

从后向前递推计算时,I n 的误差下降为原来的 ,因此只要n取得足够大,误差逐次下降,其影响就会越来越小。

可知:当n→∞时I n →0。因此可取I 20 =0作为初始值进行递推计算。

由于 ,故I 20 =0的误差约为 。在计算I 19 时误差下降到

到计算I 15 时,误差已下降到10 -8 以下,结果如表1.2。

表 1.2 计算结果

这样得到的I 9 =0.0916123已很精确了。可见经过改进后的新算法具有很好的稳定性。

例1.9 对于小的x值,计算e x -1。

如果用e x -1直接进行计算,其稳定性是很差的,因为两个相近数相减会严重丢失有效数字,产生很大的误差。因此得采用合适的算法来保证计算的数值稳定性。可以把e x 在点x=0附近展开成幂级数:

则可得

按上式计算就有很好的数值稳定性。

通过以上这些例子,可以知道算法的数值稳定性对于数值计算的重要性了。如无足够的稳定性,将会导致计算的最终失败。为了防止误差传播、积累带来的危害,提高计算的稳定性,将前面分析所得的各种结果归纳起来,得到数值计算中应注意如下几点:

①应选用数值稳定的计算方法,避开不稳定的算式。

②注意简化计算步骤及公式,减少误差的积累;设法减少乘除法运算,节约计算机的机时。

例如前面讲到过的用秦九韶算法计算多项式,就是一个改变计算公式以减少运算次数的极好例子。

③应合理安排运算顺序,防止参与运算的数在数量级相差悬殊时,大数“淹没”小数的现象发生。

④应避免两相近数相减,可用变换公式的方法来解决。

⑤绝对值太小的数不宜作为除数,否则产生的误差过大,甚至会在计算机中造成“溢出”错误。 LHblelK0Mvhnt+ia7pQYvcH6i6dH0u7btwB6kgKxpikSbF131XbE0bjkn4HtUItn

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开