1、1.8 算法稳定性分析 1.6.3 算法稳定性的实例分析 由误差估计的一般公式容易分析算法的误差传播规律。 (1) 加、减法的误差传播公式 nn i 1i 1 xi ( xi ) n n i r * i x * x x * ( x ) ri * i i 1 i n i 1 * nn i x( x ) j 1 j i x i i 1 n i 1 j * n iri x * x i 1 n i 1 r (2) 乘法的误差传播公 式 * 1 12 2* * 2 2 x x x x (3) 除法的误差传播公 式 1 x 1 x x 2 * * 1 12 * 2 rr x x xx 2 差可能会很大,故
2、应设法避免让绝对值太小的数作为除数。 可见,当除数x*的绝对值很小,接近于零时,商的绝对 误 2 r x 2 x* 1 x x * * x1 2 21 1 22 ( x1 )* * * 1 r1r2 xx x x * 1 x* x* 2 (x*) 2 2x * x * 1 x () x * r1r2 x x 即,两近似值之商的相对误差等于被除数的相对误差与 除数的相对误差之差(代数和)。 (4) 乘方及开方运算的误差传播公 式 p* x x p 1p x *p rr xxp 可见,乘方运算将使结果的相对误差增大为原值 结果的相对误差缩小为原值 次数),精度得到提高。 r * ( x) 的 p(
3、乘方的方次数)倍,降低了精度;开方运算 则使 r * (x) 1 的 q(q 为开方 的方 综上分析可知,大小相近的同号近似数相减,乘数 的绝对值很大,以及除数接近于零等,在数值计算中 都 应设法避免。 3 2 1 x 2 1 应用上述误差估计的公式,可对 1.3.1 中提出算 例 的各种算式进行误差传播分析,比较出它们的优 劣。 6 x 2 1 x 9970 2 6 1 x 2 1 x 1 99 79 2 2 1 x 3 2 1 例如,在字长为 8 基底为 10 的计算机上计算109 1 时, 会出现大数吃小数的现象。 109 10.11010 0.00000000011010 0.1101
4、0 109 这种受到机器字长的限制,导致绝对值小的数被绝对值大 的数“淹没”的现象;使这些相对小的数被“淹没”后 就 无法发挥其应有的影响,由此带来误差,造成计算结 果的 严重失真。 因此,当多个数在计算机中相加时,最好从其中绝对值 最 小的数到绝对值最大的数依次相加,使和的误差减 小。 (1) En 1nEn1(n 2,3, ) n 0 1 xnex1dx(n 1, 2, ) 再如,计算定积分E 1 n nx1 1 n1 x1n 1 E x e nxe dx 1nE 00 利用分部积分可得 可以选择递增和递减两种顺序进行迭代计算,迭代 算式分别为: n 1 En (2) En1 用这两个迭代
5、算式进行计算的结果如下表所示。 En1 nEn 1 (n 2, 3, ) E n n1 1 En n E n 10.367879 20.264242 30.207274 40.170904 50.145480 60.127120 70.110160 80.118720 9-0.068480 n E n 200.0000000 190.0500000 180.0500000 170.0527778 160.0557190 150.0669477 140.0627322 130.0669477 120.0717733 110.0773523 100.0838771 90.0916123 请对两个迭
6、代算式进行误差的传播分析。 算法的数 值稳定性对于数值计算是非常重要的, 算法无足够的稳定性,将会导致计算的最终失败。 为了防止误差传播、积累带来的危害,提高计算 的 稳定性,将前面分析所得的各种结果归纳起 来,得 到数值计算中应注意如下几点: (1) 选用数值稳定的计算方法,避开不稳定的算 式。 (2) 注意简化计算步骤及公式,设法减少运算次数, 选用运算次数少的算式,尤其是乘方幂次要低,乘法 和加法的次数要少,以减少舍入误差的积累,同时 也 可节约计算机的机时。 (3) 应合理安排运算顺序,防止参与运算的数在数量级 相差悬殊时,“大数”淹没“小数”的现象发生。多 个 数相加时,最好从其中绝对值最小的数到绝对值最 大的 数依次相加;多个数相乘时,最好从其中有效位 数最多 的数到有效位数最少的数依次相乘。 (4) 应避免相近的近似数相减,可用恒等变换的方法 来 解决。 (5) 绝对值太小的数不宜作为除数。否则产生的误差过 大, 在计算机中造成“溢出”错误。 1.8 算法稳定性分析 弹幕问题: 1. 乘方运算使结果的相对误差增大,降低了精度;开方运算则 使 结果的相对误差缩小,精度得到提高。对吗? (对) 2. 为了防止误差传播、积累带来的危害,应选用()的算法。 ( c ) a. 简单;b. 运算次数少;c. 稳定;d. 模型好。