第二章 线性方程组的直接方法(2)
上一讲我们介绍了Gauss消去法的局限性,为了避免其局限性,提高计算的数值稳定性,在消元过程中采用选择主元的方法。常采用的是列主元消去法和全主元消去法。
2.2 列主元Gauss消去法
给定线性方程组Ax=b ,记A(1)=A,b(1)=b,列主元Gauss消去法的具体过程如下:
(1)首先在增广矩阵B(1)=(A(1),b(1))的第一列元素中,取:
在第一列中取绝对值最大的元素为主元素,然后将该行与第一行进行互换,即
∣ak1(1)∣=max1≤i≤n∣ai1(1)∣,rk⇔r1
然后进行第一步消元得增广矩阵B(2)=(A(2),b(2))。
(2)再在矩阵B(2)=(A(2),b(2))的第二列元素中,取:
∣ak2(2)∣=max2≤i≤n∣ai2(2)∣,rk⇔r2
然后进行第二步消元得增广矩阵B(3)=(A(3),b(3))。
(3)按此方法继续进行下去,经过n−1步选主元和消元运算,得到增广矩阵B(n)=(A(n),b(n))。则方程组A(n)x=b(n)是与原方程等价的上三角形方程组,可进行回代求解。
列主元Gauss消去法可以很好地提高数值稳定性,并且每次选择一列中绝对值最大的数来作为主元,那么它可以执行完消元的充要条件是,
只要∣A∣=0,列主元Gauss消去法就可以顺利进行。
例2:采用十进制四位浮点计算,分别用顺序Gauss消去法和列主元Gauss消去法求解线性方程组:
⎩⎪⎨⎪⎧0.012x1+0.01x2+0.167x3=0.6781x1+0.8334x2+5.91x3=12.13200x1+1200x2+4.2x3=981
我们观察发现,这个线性方程组的数量级差距很大,因此在加减和乘除运算中就很容易出现问题,可能会产生“大数吃小数”的问题。
方程组具有四位有效数字的精确解为:x1∗=17.46,x2∗=−45.76,x3∗=5.546
解:1. 用顺序Gauss消去法求解,消元过程为:
⎣⎡0.01201.00032000.01000.833412000.1675.9104.2000.678112.10981.0⎦⎤
=⎣⎡0.0120000.01000.1000×10−3−14670.167−8.010−4453×100.6781−44.41−1798×102⎦⎤
=⎣⎡0.0120000.01000.1000×10−300.167−8.010−1175×1050.6781−44.41−6517×105⎦⎤
回代得x3=5.546,x2=100.0,x1=−104.0
我们前面说过,顺序Gauss消去法是直接方法,不存在截断误差,那么导致误差巨大的原因就来自于舍入误差,产生舍入误差大的原因在于主元非常小。
使用列主元Gauss消去法求解,消元过程为:
⎣⎡0.01201.00032000.01000.833412000.1675.9104.2000.678112.10981.0⎦⎤
选主元,将第一行和第三行互换,得:⎣⎡32001.0000.012012000.83340.01004.2005.9100.167981.012.100.6781⎦⎤
消元得:⎣⎡32000012000.45840.55×10−24.2005.9090.167981.011.790.6744⎦⎤
⎣⎡32000012000.458404.2005.9090.0961981.011.790.5329⎦⎤
回代得:x3=5.545,x2=−45.77,x1=17.46
因此我们看到,列主元Gauss消去法确实能够提高方法的数值稳定性。
小结:列主元Gauss消去法是在每一步消元前,在主元所在的一列选取绝对值最大的元素作为主元素。
而还有一种方法叫做全主元Gauss消去法,是在每一步消元前,在所有元素中选取绝对值最大的元素作为主元素。但由于运算量大增,实际应用中并不常用。
2.3 矩阵三角分解法
我们在消去时都是采用增广矩阵来进行消去,目的是为了保持方程的等价性。本节我们仅对系数矩阵来进行矩阵运算。每对矩阵进行一次消元,实际上就是实施了一次初等行变换。那么从左乘初等矩阵的角度来看是怎样的呢?
对矩阵A(1)=⎣⎢⎢⎢⎢⎢⎢⎡a11(1)a21(1)a31(1)⋮an1(1)a12(1)a22(1)a32(1)⋮an2(1)a13(1)a23(1)a33(1)⋮an3(1).........⋱...a1n(1)a2n(1)a3n(1)⋮ann(1)⎦⎥⎥⎥⎥⎥⎥⎤
第一步:若a11(1)=0,令li1=a11(1)ai1(1),(i=2,3,...,n),记:
L1=⎣⎢⎢⎢⎢⎢⎡1−l21−l31⋮−ln111⋱1⎦⎥⎥⎥⎥⎥⎤
像L1这样的矩阵称为单位下三角矩阵,其主对角线上元素都是1,上三角部分都是0。接下来用L1左乘A(1)得:
A(2)=L1A(1)=⎣⎢⎢⎢⎢⎢⎢⎡a11(1)00⋮0a12(1)a22(2)a32(2)⋮an2(2)a13(1)a23(2)a33(2)⋮an3(2).........⋱...a1n(1)a2n(2)a3n(2)⋮ann(2)⎦⎥⎥⎥⎥⎥⎥⎤
第二步:若a22(2)=0,令li2=a22(2)ai2(2),(i=3,4,...,n),记:
L2=⎣⎢⎢⎢⎢⎢⎡11−l32⋮−ln21⋱1⎦⎥⎥⎥⎥⎥⎤
矩阵L2仍然是单位下三角矩阵,我们用L2去左乘矩阵A(2),得:
A(3)=L2A(2)=⎣⎢⎢⎢⎢⎢⎢⎡a11(1)00⋮0a12(1)a22(2)0⋮0a13(1)a23(2)a33(2)⋮an3(2).........⋱...a1n(1)a2n(2)a3n(2)⋮ann(2)⎦⎥⎥⎥⎥⎥⎥⎤
如此进行下去,第n−1步得到:
A(n)=Ln−1A(n−1)=⎣⎢⎢⎢⎢⎢⎢⎡a11(1)a12(1)a22(2)a13(1)a23(2)a33(2).........⋱a1n(1)a2n(2)a3n(2)⋮ann(2)⎦⎥⎥⎥⎥⎥⎥⎤
整理整个过程得:
A(n)=Ln−1A(n−1)=Ln−1Ln−2A(n−2)=...=Ln−1Ln−2...L2L1A(1)
其中每一个Lk都是一个单位下三角矩阵,而且都是可以求解出来的,说明它们都是可逆矩阵,所以有:
A=A(1)=L1−1L2−1...Ln−1−1A(n)=LU
这就是A的LU三角分解。
A=LU=⎣⎢⎢⎡1l21l31l4101l32l42001l430001⎦⎥⎥⎤⎣⎢⎢⎡u11000u12u2200u13u23u330u14u24u34u44⎦⎥⎥⎤
2.4 直接三角分解法
定理1:若n阶方阵A的各阶顺序主子式不为0,则存在唯一单位下三角矩阵L和上三角矩阵U使A=LU。
证明:只证唯一性,设有两种分解A=LU=L′U′
则有L′−1L=U′U−1=I(若下三角矩阵=上三角矩阵,则等号两边都为单位矩阵)
所以L=L′,U=U′。
于是Ax=b可以写成LUx=b,令Ux=y,得:
{Ly=bUx=y
大家知道,矩阵乘向量得到的是向量,那么Ly=b,Ux=y。那么原来一个线性方程组的求解,经过三角分解后变成两个三角形方程组的求解,而三角形线性方程组的求解,相对于普通线性方程组的求解要容易的很多。我们刚刚给出的三角分解和顺序Gauss消元法是一样的。
下面介绍三角分解的Doolittle分解方法,设:
⎣⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2......⋱...a1na2n⋮ann⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎡1l21l31⋮ln11l32⋮ln21⋮ln3⋱...1⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡u11u12u22......⋱u1nu2n⋮unn⎦⎥⎥⎥⎤
为了求得两个三角矩阵的分量元素,我们要利用两个三角矩阵的特殊形式和矩阵乘法的运算规则。
则⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧u1j=a1j,j=1,2,...,nli1=ai1÷u11,i=2,3,...,nakj=lk1u1j+lk2u2j+...+lkk−1uk−1j+ukjukj=akj−∑m=1k−1lkmumj,j=k,k+1,...,nlik=(aik−∑m=1k−1limumk)÷ukk,i=k+1,k+2,...,n
求解顺序:先求U的第一行,再求L的第一列,再求U的第二行,再求L的第二列,以此类推。
由{Ly=bUx=y,得
⎣⎢⎢⎢⎢⎢⎡1l21l31⋮ln11l32⋮ln21⋮ln3⋱...1⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡b1b2⋮bn⎦⎥⎥⎥⎤
⎣⎢⎢⎢⎡u11u12u22......⋱u1nu2n⋮unn⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎤
可得:
⎩⎪⎪⎪⎨⎪⎪⎪⎧y1=b1yk=bk−∑i=1k−1lkiyi,k=2,3,...,nxn=yn÷unnxi=(yi−∑j=i+1nuijxj)÷uii,i=n−1,n−2,...,1
这就是求解方程组Ax=b的Doolittle三角分解法。
应用
例1:利用三角分解方法求解线性方程组
⎩⎪⎨⎪⎧x1+2x2−3x3=12x1−x2+3x3=53x1−2x2+2x3=1
解:
(1) 将系数矩阵A书写出来为:
A=⎣⎡1232−1−2−332⎦⎤
(2) 将系数矩阵A分解为LU形式,分解后U的第一行和A的第一行一致,L的第一列和A的第一列一致,我们只需要计算其他位置的元素即可,有:
A=⎣⎡1232−1−2−332⎦⎤⇒⎣⎡1232−558−39−517⎦⎤
所以,我们就可以写出L和U了
A=⎣⎡1232−1−2−332⎦⎤=⎣⎡1231581⎦⎤⎣⎡12−5−39−517⎦⎤=LU
(3) 接下来就是求解两个三角方程组了,先解Ly=b,有:
⎣⎡1231581⎦⎤⎣⎡y1y2y3⎦⎤=⎣⎡151⎦⎤,得⎣⎡y1y2y3⎦⎤=⎣⎡13−534⎦⎤
(4) 再解Ux=y,有:
⎣⎡12−5−39−517⎦⎤⎣⎡x1x2x3⎦⎤=⎣⎡13−534⎦⎤,得⎣⎡x1x2x3⎦⎤=⎣⎡132⎦⎤
解线性方程组Ax=b的Doolittle三角分解法的计算量约为31n3,与Gauss消去法基本相同。其优点在于求一系列同系数的线性方程组Ax=bk(k=1,2,..,m)时,可大大节省运算量。我们做三角分解仅仅是对系数矩阵A进行分解,而bk的变化体现在后面求解两个三角方程组,所以我们说,如果用Doolittle三角分解法在求同系数三角分解时,只需要做一次分解。