本节书摘来自华章出版社《数值分析(原书第2版)》一 书中的第2章,第2.3节,作者:(美)Timothy Sauer,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
正如我们已经描述的,在高斯消去法中有两个潜在的误差来源.病态问题的概念和解对于输入数据的敏感性相关.我们将使用第1章中的后向和前向误差讨论条件数.在求解病态矩阵方程时,几乎没什么办法可以避免误差,因而能够尽可能识别并避免病态矩阵很重要.第二个误差来源的原因是淹没,在大部分问题中可以通过一个简单的修正,称为部分主元,进行避免,这部分将在2.4节中进行讨论.85
随后介绍向量和矩阵范数的概念,并用于度量误差的大小,在当前方程组中的误差用向量表示.我们将主重点关注一个叫做无穷范数的概念上.
在第1章中,我们发现部分方程求解问题在前向和后向误差之间有很大差异.对于线性方程组系统也是如此.为了量化误差,我们首先讲述向量的无穷范数概念.
定义2.3 向量x=(x1,…,xn)的无穷范数或者最大范数为‖x‖∞=maxxi,i=1,…,n,即x所有元素中的最大绝对值.
后向误差和前向误差和定义1.8相关.后向误差表示输入时候的差异,或者问题的数据一方,而前向误差表示在输出时候的差异,在算法解的一方.
定义2.4 令xa是线性方程组Ax=b的近似解.余项是向量r=b-Axa.后向误差是余项的范数‖b-Axa‖∞,前向误差是‖x-xa‖∞.
例2.10 找出近似解xa=[1,1]的后向误差和前向误差,方程组如下:11
3-4x1
x2=3
2正确的解是x=[2,1].使用无穷范数,后向误差是‖b-Axa‖∞=3
2-11
3-41
1∞=1
3∞=3前向误差是‖x-xa‖∞=2
1-1
1∞=1
0∞=1在其他情况下,后向误差和前向误差可能具有不同的数量级.
例2.11 找出近似解[-1,3.0001]的后向误差和前向误差,方程组如下x1+x2=2
1.0001x1+x2=2.0001(2.17)首先,计算精确解[x1,x2].高斯消去包含步骤11|2
1.00011|2.0001→第2行减去第1行的1.0001倍→11|2
0-0.0001|-0.0001
86求解得到的方程组x1+x2=2
-0.0001x2=-0.0001得到解[x1,x2]=[1,1].
后向误差是如下向量的无穷范数b-Axa=2
2.0001-11
1.00011-1
3.0001
=2
2.0001-2.0001
2=-0.0001
0.0001误差是0.0001.前向误差是如下向量差的无穷范数图2.2 例2.11对应的几何表示.系统(2.17)表示为直线x2=2-x1和x2=2.0001-1.0001x1,它们的交点在(1,1).点(-1,3.0001)差一点就在两条直线上,并对应一个近似解.在图中,两条直线之间的差异被放大,它们实际上离得非常近x-xa=1
1--1
3.0001=2
-2.0001前向误差为2.0001.
图2.2有助于理解为什么小的后向误差和大的前向误差可以同时存在.即使“近似根”(-1,3.0001)相对远离真实根(1,1),这个近似根也几乎就位于两个直线上.由于两条直线近似平行,所以出现这种情况也是可能的.如果两条直线不平行,前向误差和后向误差将在同一个数量级上.
把余项表示为r=b-Axa.系统Ax=b的相对后向误差定义为‖r‖∞‖b‖∞相对前向误差定义为
‖x-xa‖∞‖x‖∞87条件 条件数的概念贯穿整个数值分析.在第1章讨论威尔金森多项式时,我们知道当给方程f(x)=0一个小的扰动,如何求“解根过程”的误差放大因子.对于矩阵方程Ax=b,也有相似的误差放大因子,最大可能的放大因子是cond(A)=‖A‖‖A-1‖.
方程Ax=b的误差放大因子是二者的比率,或者误差放大因子=相对前向误差相对后向误差=‖x-xa‖∞‖x‖∞‖r‖∞‖b‖∞(2.18)对于系统(2.17),相对后向误差是0.00012.0001≈0.00005=0.005%相对前向误差是2.00011=2.0001≈200%误差放大因子是2.001/(0.0001/2.0001)=40004.0001.
在第1章中,我们定义条件数的概念,条件数对应在预先定义的输入误差范围中最大的误差放大倍数.“预定义范围”依赖于上下文.现在我们对于当前线性方程组系统将更精确定义这个概念.对于一个固定的矩阵A,考虑对不同向量b求解Ax=b.在这个上下文中,b是输入,对应的解x是输出.输入中小的变化对应b的小变化,这对应一个误差放大因子.我们做如下定义:
定义2.5 方阵A的条件数cond(A)为求解Ax=b时,对于所有右侧向量b,可能出现的最大误差放大因子.
令人惊讶的是,对于方阵有一个关于条件数的紧致的公式.和向量范数类似,定义n×n矩阵A的矩阵范数为‖A‖∞=每行元素绝对值之和的最大值(2.19)即每行元素绝对值求和,并把n行求和的最大值作为矩阵A的范数.
定理2.6 n×n矩阵A的条件数是cond(A)=‖A‖·‖A-1‖后面证明的定理允许我们计算例2.11的系数矩阵的条件数.根据(2.19),矩阵A=11
1.0001188的范数为‖A‖=2.0001.A的逆为A-1=-1000010000
10001-10000对应的范数‖A-1‖=20001.A的条件数是cond(A)=(2.0001)(20001)=40004.0001这正是我们在例2.11中看到的条件数,如此定义的条件数显然对应最糟的情况.在这个系统中,对于任何其他的b,误差放大因子将小于或者等于40004.0001.习题3要求计算其他的误差放大因子.
条件数的重要性和第1章相同.误差放大因子可能具有cond(A)的数量级.在浮点算术中,相对后向误差不可能小于εmach,这是由于b的元素的存储已经引入了和εmach差不多大的误差.依据(2.18),在求解Ax=b可能出现的相关前向误差是εmach·cond(A).换句话讲,如果cond(A)≈10k,我们在计算x时,将丢掉k位数字精度.
在例2.11中,cond(A)≈4×104,因而在双精度中求解x时,我们应该期望得到16-4=12个正确数位.我们可以通过引入MATLAB中的通用方程求解器“\”来验证.
在MATLAB中,反斜线命令x=A\b使用最先进的LU分解方法求解线性方程组,我们将在第2.4节中进行描述.现在,我们将它作为例子,来看看在浮点算术中我们从最好的算法可以得到什么结果.下面的MATLAB命令可以得到例2.10的计算机解xa:
和正确解x=[1,1]相比,计算机求解有大约11个正确的数位,和条件数预测的结果相似.
希尔伯特矩阵H的元素是Hij=1/(i+j-1),其对应的条件数非常大.
例2.12 令H表示n×n希尔伯特矩阵.使用MATLAB的\命令从n=6和10计算Hx=b的解,其中b=H·[1,…,1]T.
选择右侧的b,使得对应的解向量中的所有n个元素都是1,这使得前向误差的检查十分简单.MATLAB使用无穷范数找出条件数,并计算解:
条件数大约是107,可以预计在最坏的情况下得到16-7=9个正确的数位;在求解中有大约9位正确的数位.现在计算n=10的情况:
由于条件数是1013,在解中只出现16-13=3个正确的数位.
对于比10大一点儿的n,希尔伯特矩阵的条件数比1016大,在求解xa时不能保证具有正确的数位.
对于病态问题即使最优的软件也可能无能为力.提高精度会有所帮助;在扩展精度中εmach=2-64≈5.42×10-20,我们开始计算时具有20位而不是16位.但是,希尔伯特矩阵的条件数最终随着n的增长而快速变大,使得任何有意义的有限精度都变得无能为力.
幸运的是,大条件数的希尔伯特矩阵并不常见.n个方程n个未知变量构成的良态线性系统通常在双精度中可以解到n=104或者更大规模.但同时,知道病态问题是否存在也很重要,而条件数有助于诊断病态问题是否出现.在编程问题1~4还有更多关于误差放大和条件数的例子.
在本节中无穷范数以一种简单方式给向量定义了一个长度.它是向量范数‖x‖的一个例子,向量范数满足如下的属性:
(i) ‖x‖≥0,当且仅当x=[0,…,0]时等号成立.
(ii) 对于每个标量α和向量x,‖αx‖=α·‖x‖.
(iii) 对于向量x、y,‖x+y‖≤‖x‖+‖y‖.
此外,‖A‖∞是矩阵范数的例子,矩阵范数满足三个和上面相似的性质:
(i) ‖A‖≥0,当且仅当A=0时等号成立.
(ii) 对于每个标量α和矩阵A,‖αA‖=α·‖A‖.
(iii) 对于矩阵A、B,‖A+B‖≤‖A‖+‖B‖.
作为一个不同的例子,向量x=[x1,…,xn]的1-范数是‖x‖1=x1+…+xn.n×n矩阵A的矩阵1-范数是‖A‖1=最大绝对列和,即列向量的1-范数的最大值.关于这些范数定义的验证,可以参见习题9和习题10.90
刚刚讨论的误差放大因子、条件数和矩阵范数可用于定义任何向量或者矩阵范数.我们将仅关注称为算子范数的矩阵范数,这意味着矩阵范数使用特定的向量范数进行定义‖A‖=max‖Ax‖‖x‖对于所有非零向量x取最大值.然后,根据该定义,矩阵范数和相关的向量范数一致,对于任意矩阵A和向量x满足‖Ax‖≤‖A‖·‖x‖(2.20)(2.20)中定义的无穷范数‖A‖∞不仅是矩阵范数,而且是算子范数,验证见习题10和习题11.
该事实允许我们证明前面所讲的对于cond(A)的简单表示.该证明对于无穷范数和任何算子范数都成立.
定理2.6的证明 我们使用等式A(x-xa)=r以及Ax=b.由相容性质(2.20),‖x-xa‖≤‖A-1‖·‖r‖以及1‖b‖≥1‖A‖‖x‖把两个不等式放在一起得到‖x-xa‖‖x‖≤‖A‖‖b‖‖A-1‖·‖r‖表明‖A‖‖A-1‖是所有误差放大因子的上界.第二,通常可以取到这个上界.选择x满足‖A‖=‖Ax‖/‖x‖,以及r满足‖A-1‖=‖A-1r‖/‖r‖,二者都可以根据算子矩阵范数的定义获得.令xa=x-A-1r,因而x-xa=A-1r.对于特定选择的x和r还需要验证如下等式:‖x-xa‖‖x‖=‖A-1r‖‖x‖=‖A-1‖‖r‖‖A‖‖Ax‖2.3.2 淹没
经典高斯消去法的第二个主要误差来源可以用更加简单的方式来修正.我们使用下面的例子来展示淹没.
例2.13 考虑方程组10-20x1+x2=1
x1+2x2=4我们将三次求解这个方程组:一次使用完全精度,第二次模拟IEEE双精度算术进行求解,第三次我们首先交换方程的顺91序.
1.精确解.在表格形式中,高斯消去过程如下10-201|1
12|4→第2行减去第1行的1020倍→10-201|1
02-1020|4-1020底端的方程为(2-1020)x2=4-1020→x2=4-10202-1020顶端的方程得到10-20x1+4-10202-1020=1
x1=10201-4-10202-1020
x1=-2×10202-1020精确解是[x1,x2]=2×10201020-2,4-10202-1020≈[2,1]2.IEEE双精度.计算机版本的的高斯消去有一些不同:10-201|1
12|4→第2行减去第1行的1020倍→10-201|1
02-1020|4-1020IEEE双精度中,2-1020由于舍入等于-1020.类似地,4-1020也被保存为-1020.现在底端的方程是-1020x2=-1020→x2=1顶端方程的机器算术版本为10-20x1+1=1因而x1=0.得到的计算解是[x1,x2]=[0,1]和真实解相比,这个解有非常大的相对误差.
3.IEEE双精度,使用行交换.我们改变了两个方程的顺序,重复进行高斯消去法的计算机版本的计算.12|4
10-201|1→第2行减去第1行的10-20倍
→12|4
01-2×10-20|1-4×10-20在IEEE双精度中,1-2×10-20保存为1,1-4×10-20保存为1.方程变为x1+2x2=4
x2=1
92得到的计算解是x1=2,x2=1.很显然,这不是精确解,但是它具有大约16位的精确数位,这是我们使用52位浮点数字所能得到的最大精度.
前面的两次计算之间的差异很大.第3种方法给出一个可以接受的结果,但是第2种方法却没有.关于第2种方法为什么出了问题,经过分析发现问题出在消去过程中的乘子1020.从底部的方程减去顶部方程的1020倍,底部方程会被抑制,或者称为“swamp,”.尽管初始的时候有两个独立的方程或者源信息,但是经过第2种计算的消去,这里仅仅留下了顶部方程的两个副本.由于底部方程消失,出于所有实际的目的,我们不能指望计算结果可以满足底部的方程,实际上得到的解也不能满足对应的方程.
而另一方面,第3种方法,在消去过程中没有产生覆盖,因为乘子是10-20.在消去之后,原始的两个方程仍然存在,并且变为三角形式.结果是更加精确的近似解.
例2.13的主要意思是在高斯消去的过程中保证乘子尽可能小,同时避免淹没.幸运的是,通过对朴素的高斯消去法的简单修正,可以使得高斯消去法中的乘子的绝对值不大于1.这种新的原则,包括在表格中明智的行交换,称为部分主元方法,在下一节中将进行详细的描述.
2.3节习题
1.对于下面的矩阵计算‖A‖∞.
(a) A=12
34(b) A=151
-12-3
1-70
2.找出下述矩阵的条件数(无穷范数).
(a) A=12
34(b) A=12.01
36(c) A=63
42
3.找出例2.11中方程组的如下的近似解xa的前向和后向误差,以及误差放大因子(使用无穷范数):
(a) [-1,3] (b) [0,2] (c) [2,2] (d) [-2,4] (e) [-2,4.0001]
4.找出x1+2x2=1,2x1+4.01x2=2方程组在如下近似解时的前向和后向误差,以及误差放大因子:
(a) [-1,1] (b) [3,-1] (c) [2,-1/2]
5.对于方程组x1-2x2=3,3x1-4x2=7,在如下的近似解处,找出相对的前向和后向误差以及误差放大因子:(a) [-2,-4](b) [-2,-3](c) [0,-2](d) [-1,-1](e) 系数矩阵的条件数是多少?
6.对于方程组x1+2x2=3,2x1+4.01x2=6.01,在如下的近似解处,找出相对的前向和后向误差以及误差放大因子:(a) [-10,6],(b) [-100,52],(c) [-600,301],(d) [-599,301].(e) 系数矩阵的条件数是多少?93
7.计算5×5希尔伯特矩阵的‖H‖∞.
8.(a) 找出方程组系数矩阵的条件数关于δ>0的函数11
1+δ1x1
x2=2
2+δ(b) 找出近似解xa=[-1,3+δ]处的误差放大因子.
9.(a) 证明:无穷范数‖x‖∞是向量范数.(b) 证明:1-范数‖x‖1是向量范数.
10.(a) 证明:无穷范数‖A‖∞是矩阵范数.(b) 证明:1-范数‖A‖1是矩阵范数.
11.证明:矩阵无穷范数是向量无穷范数的算子范数.
12.证明:矩阵1-范数是向量1-范数的算子范数.
13.对于习题1中的矩阵,找出满足‖A‖∞=‖Ax‖∞/‖x‖∞的向量.
14.对于习题1中的矩阵,找出满足‖A‖1=‖Ax‖1/‖x‖1的向量.
15.找出矩阵A的LU分解:A=10201
11.996
0501所需的最大数量级的乘子lij是多少?
2.3节编程问题
1.对于元素为Aij=5/(i+2j-1)的n×n矩阵,令x=[1,…,1]T,b=Ax.使用编程问题2.1.1的MATLAB程序或者MATLAB的反斜线命令计算双精度解xc.找出Ax=b的前向误差和误差放大因子的无穷范数,并与A的条件数进行比较:(a) n=6(b) n=10.
2.对于元素是Aij=1/(i-j+1)的矩阵执行编程问题1.
3.令A是n×n的矩阵,元素是Aij=i-j+1.定义x=[1,…,1]T,b=Ax.对于n=100,200,300,400,500,使用编程问题2.1.1中的MATLAB程序或者MATLAB的反斜线命令计算双精度的计算解xc.对于每个解计算前向误差的无穷范数.找出问题Ax=b的5个误差放大因子,并和对应的条件数进行比较.
4.对于元素是Aij=(i-j)2+n/10的矩阵执行编程问题3中的步骤.
5.n取多少,可以使得编程问题1中的解没有正确的有效数字?
6.使用编程问题2.1.1中的MATLAB程序计算例2.13第2和第3种方法的双精度实现,并和课本中的理论解进行比较.94