1、Gauss-Seidel 迭代矩阵求法的思考在迭代法收敛性的判别中,我们有充分条件:若迭代矩阵 的某种范数B,则迭代法 对任意的初始向量 都收1qB ,10,)()1( kdBxkk )0(x敛于方程组 的精确解 。从这个条件中我们可以看出,想要知道迭代法bAx*是否收敛,就要知道迭代矩阵(当然如果系数矩阵是正定的或严格对角占优的,那就不用知道其迭代矩阵,因为这时它的 Jacobi 迭代和 Gauss-Seidel 迭代一定收敛) ,Jacobi 迭代矩阵为 ,Gauss-Seidel 迭代ADIULBJ 11)(矩阵 这两个矩阵中都涉及到了矩阵的逆。,ULDBG1)(从上高等代数时学到矩阵的
2、逆开始,就一直惧怕有关矩阵逆的题目,因为求矩阵 A 的逆 ,这就必须求出 A 的行列式 与 A 的伴随矩阵 ,对于*1A *求矩阵 A 的行列式,就是一个繁琐的过程,计算量大且易出错,而这儿还不仅如此,这儿还要求出矩阵 A 的伴随矩阵 。如果矩阵 ,* nnnaaA 212112则 ,而其中的 ,nnnAA 212121* njnjnn ijijii njj aaaA 1,1,1 ,1, 111 1,ij 因此求 的计算量比求 A 的行列式的计算量还要大的多,所以 很难求。因* A此数学家便开始寻找求 的相对容易的方法,其中有一种初等变换的方法,即1对 进行初等行变换,当把 A 变成 E 时,
3、E 便变成了 ,此方法要简单的EA 1多,但在变换过程中要消耗大量空间。在用迭代法解线性方程组的方法中,都涉及到了一个矩阵的逆,而且其涉及到的还不仅仅是一个矩阵的逆那么简单,其涉及到的是用一个矩阵的逆去乘另一个矩阵,如果一步一步算,想要算出矩阵的逆,再算两个矩阵相乘,没有一步是简单的,两步计算过程都很繁琐,极易出错。仔细观察后,我发现正是因为矩阵的逆与另一矩阵相乘,从而在整体上出现了相对简单的计算,其过程是略去矩阵逆的计算,从而简化计算。对于 n 介线性方程组 ,即 ,其系数矩阵nnbxaxa211bAx非奇异且 ,对 ,则可建立nijaAii ,3,0,20kJacobi 迭代格式: 1).
4、(1,)(1)(1,)(2)(1)( 2)(2)(32)(12)(2 1(1)()()( nknknknkn knkkk bxaxax bxaxax我们知道 Jacobi 迭代矩阵为 ,其中2)(1ADIULBJ , ,naaD21 001,21321nnaa 。300,122311naU 由式可看出,计算 ,首先需求出 ,然后再作矩阵乘法。当然这儿由JB1D于 的特殊性, 很好求, = ,D11 nnaaa112-2 00-B321 3321 232 11121J nn nnaaaaADI如果我们抛开式,直接看,就会发现,其实 可以直接写出来,无需JB计算,由可得 ,其直接从线00-B321
5、 3321 232 1112J nn nnaaaa性方程组中得来,显然快于一步步的计算,而且第二中算法不仅简单还不容易出错,提高了求迭代矩阵的效率。当然,第一种算法的 可以直接写出很好1D求,从而效率也没提高多少,但对于 Gauss-Seidel 迭代,就不然了。Gauss-Seidel 迭代格式: 4).(1 ,)(11(,)1(2)1()( 2)(2)(32)1(2)(2 1(1)()()( nknknknkn knkkk bxaxaax bxaxax我们知道 Gauss-Seidel 迭代矩阵 ,其中矩阵 D,L,U 与5)(1ULDBG上述中一样。但此处 就不是太好求了,即使它是个下三
6、角矩阵。然1)LD(而求出 后,还要进行矩阵的乘法,因为 即:1)L( G1)( 00)( ,12231113213211 nnnnnG aaaaaULDB 计算有点繁琐,然而,我产生一种想法,其是否也可与 Jacobi 迭代矩阵那样,直接写出来了?通过一番计算,再加上实例的体会,我找出了一种相对简洁的关系。把式写成 421)(1)1(,)1(2)1()1( (2)(3)2)(2 (1)(1)()( nbxaxaxaxxx knknknkn kkkk n把 1)代入 2)并整理得(由于我们的目的是得到矩阵,所以在此就不考虑了)nb,22))(212)(32132)(212)1(2 knnkkk
7、 xaxaxaxa 令 ,则 1)变为11312,bbn 。此时 2 )式变为)()(3)(2)(1 knkkk xxx )(212)(32312)(21)(2 /)(/)/ knnk xabaxababa 2)。令 ,则 2)式变为21223232 ,- bnn。把、式代入 3)式整理得)()(32)(2)1(2 knkkk xbxbx3))(3231)(4324314)(3)(21)(3 knnnk xaaxaa 令 3321333421434321332132, ,abb abbaannn 则 3)式变为 )(3)(43)(3)(2)1( knkkkk xbxx 如此一直在前一步的基础上
8、求后一步矩阵中的元素的值,一直进行下去,则 n-1)式变为 则第 n 个式子变为)(,1)(13,)(12,)1( knknknkn xbxbx )(,1,2,1 )(3,1,23,13,)(2,)(-Knnnn Knkn xaba xbaba 即 )(,)(4,)(3,)(2,)( kkkkkn bbxx 从而得到 Gauss-Seidel 迭代矩阵 nnn nnnnnnG bbaababB 32 2123112221n12221120-0-0 321 3231321321300 nnn nnbbb aaa bbb ninin ininiiiiiiii ii bbb aaa bbb ,1,
9、,1,1, 1,1,1,1,1 ,0 -0 nnnnnnn nabbabbab bbb ,11,3,113,2,112, 33 2232 111 -00 (*)接下来我用书上一个例子来展现上述方法求迭代矩阵的优越性:例 设方程组为 试分别写出 Jacobi 迭代和 Gauss-,72025193,831xxSeidel 迭代格式以及相应的迭代矩阵。解:原方程的 Jacobi 迭代格式和 Gauss-Seidel 迭代格式分别为 和),725(201193),(8)()(3(3)(1)( ()2)1( kkkkkkxx ),725(201193),(8)()1)(3(3)( ()2)1( kkk
10、 kkkxx由可直接得 Jacobi 迭代矩阵为01.438JB而相应的 Gauss-Seidel 迭代矩阵可由(*)式得: 045.27.013 20175520)37.()15.(001043183032bbBG与书上用公式算所得结果相同,但这种计算显然很简洁。对于 3 阶以上的迭代矩阵的计算,我的方法将会节约大量时间,而且还不容易出错。以上我们讨论的是方阵,但从(*)式可以看出,我们也可以求出不是方阵的 ,这便给人一种想法,是否不是方阵时也可用迭代法求其解,但有一点是GB肯定的,当方程个数少于未知数个数时,线性方程组有无穷多解,因此这个问题有可能是否定的,即无法用迭代法求系数矩阵不是方阵
11、的解,此问题还有待研究。以下是我写的有关我的新方法的 matlab 代码,其中也包含书上的方法求迭代矩阵的代码,我输入一个四阶的系数矩阵,由两种方法所得出的 Gauss-Seidel 迭代矩阵完全相同。Matlab 代码:%求 Gauss-Seidel 矩阵function G_SB(A)m,n=size(A);if m=ndisp(系数矩阵不是方阵)returnend% 用矩阵运算求 Gauss-Seidel 迭代矩阵D=diag(diag(A);U=-triu(A,1);L=tril(A,-1);disp(矩阵运算求出的迭代矩阵)B1=inv(D+L)*U,%B=zeros(m,n);fo
12、r j=2:nB(1,j)=-A(1,j)/A(1,1);endfor i=2:mfor j=2:nk=1:i-1;if i=jB(i,j)=sum(-A(i,k)*B(k,j)/A(i,i);continueendB(i,j)=(sum(-A(i,k)*B(k,j)-A(i,j)/A(i,i);endenddisp(直接法求出的迭代矩阵)B,end给定系数矩阵,并得结果: A=5 1 -1 -2;2 8 1 3;1 -2 -4 1;-1 3 2 7;G_SB(A)矩阵运算求出的迭代矩阵B1 =0 -0.2000 0.2000 0.40000 0.0500 -0.1750 -0.47500 -0.0750 0.1375 0.58750 -0.0286 0.0643 0.0929直接法求出的迭代矩阵B =0 -0.2000 0.2000 0.40000 0.0500 -0.1750 -0.47500 -0.0750 0.1375 0.58750 -0.0286 0.0643 0.0929B 与 B1 是两种方法得出的,但其结果完全相同。