1、课题三 线性方程组的迭代法一、问题提出对课题二所列目的和意义的线性方程组,试分别选用 Jacobi 迭代法,Gauss-Seidol 迭代法和 SOR 方法计算其解。1、设线性方程组=042310208656513394402107028656542511930427102048863 12367891xxx05032x*=(1, -1, 0, 1, 2, 0, 3, 1, -1, 2) T2、设对称正定阵系数阵线方程组=0402401385626024104352039 12345678xx0124x*=(1, -1, 0, 2, 1, -1, 0, 2) T3、三对角形线性方程组=4100
2、01401004 12345678910xxx71245x*=(2, 1, -3, 0, 1, -2, 3, 0, 1, -1) T二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较; 2、分别对不同精度要求,如 =10 -3,10 -4,10 -5 由迭代次数体会该迭代法的收敛快慢; 3、对方程组 2,3 使用 SOR 方法时,选取松弛因子=0.8 ,0.9, 1,1.1,1.2 等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者; 4、给出各种算法的设计程序和计算结果。三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较; 2、运用所学的迭代法
3、算法,解决各类线性方程组,编出算法程序; 3、体会上机计算时,终止步骤x (k+1)- x(k)(予给的迭代次数) ,对迭代法敛散性的意义; 4、体会初始解 x(0),松弛因子的选取,对计算结果的影响。四、迭代计算1、雅可比迭代法在进行雅可比迭代之前,我们应该先判断迭代是否能够收敛,这里我们使用雅可比迭代法收敛的充分必要条件(即,迭代矩阵的谱半径小于等于 1) 。1、判断方程组一使用雅可比迭代法是否收敛在 matlab 软件中编写程序:D=diag(diag(A);L=-tril(A,-1);U=-triu(A,1);B=D(L+U);t=eig(B)r=max(abs(t)可求出方程组一的雅
4、可比迭代矩阵的特征值分别为:1.6604 + 3.8389i;1.6604 - 3.8389i; -3.3952 ;-1.3286 + 1.5704i;-1.3286 - 1.5704i; -0.4754;-0.1912 ;0.9785 ;0.9568;1.4628 显然,其谱半径大于 1,则雅可比迭代法不收敛,故不可用雅可比迭代法进行迭代求解。 可用消去法求解,编写 matlab 高斯列主元消去法的程序如下:function X=Gauss_pivot(A,b)n=length(b);X=zeros(n,1);c=zeros(1,n);d1=0for i=1:n-1max=abs(A(i,i
5、);m=i;for j=i+1:n if max=emgfor i=1:nsum=0;for j=1:nif i=jsum=sum+A(i,j)*x1(j);endendx2(i)=(b(i)-sum)/A(i,i);endt=abs(x2-x1);r=max(t);x1=x2;k=k+1;if kNdisp(迭代失败,返回);return;endkend调用雅克比求解线性方程组的程序,取初值 x0=0;0;0;0;0;0;0;0;0;0,不同精度下求得解为:=10 -3:则 x2 = 2.0000;1.0000;-2.9997;-0.0006;1.0008; -2.0015;3.0010;-
6、0.0016;1.0007;-1.0007,迭代次数 k=10=10 -4:则 x2 =2.0000;1.0000;-2.9999;-0.0002 ;1.0002;-2.0003;3.0002;-0.0003;1.0001;-1.0001,迭代次数 k=12=10 -5 :则 x2 = 2.0000;1.0000 ;-3.0000 ;0.0000;1.0000;-2.0000;3.0000;0.0000;1.0000;-1.0000,迭代次数 k=15由方程组三雅克比的迭代过程可以看出,精度越高,所需迭代次数就越多,迭代速度也就越慢,但是其解也越来越接近与真值。当 =10 -5 时,x2 =
7、2.0000;1.0000;-3.0000;0.0000;1.0000;-2.0000;3.0000;0.0000;1.0000;-1.0000,这与真值基本是相同的。2、高斯-赛德尔迭代法同样,在进行高斯-赛德尔迭代之前,我们应该先判断迭代是否能够收敛,这里我们使用高斯-赛德尔迭代法收敛的充分必要条件(即,迭代矩阵的谱半径小于等于 1) 。1、判断方程组一使用高斯-赛德尔迭代法是否收敛在 matlab 软件中编写程序:D=diag(diag(A);L=-tril(A,-1);U=-triu(A,1);B=(D-L)U;t=eig(B)r=max(abs(t)可求出方程组一的高斯-赛德尔迭代矩
8、阵的特征值分别为: 0;17.1222;-0.8196 + 4.1041i;-0.8196 - 4.1041i ;0.9839;0.8639;-0.0220 + 0.1529i;-0.0220 - 0.1529i;0.4784;0.0000 显然,其谱半径为 r= 17.1222,大于 1,则高斯-赛德尔迭代法不收敛,故不可用高斯-赛德尔迭代法进行迭代求解。2、判断方程组二使用高斯-赛德尔迭代法是否收敛与方程组一相似,求出方程组二的高斯-赛德尔迭代矩阵的特征值为: 0;0.9947;0.5849 + 0.0782i;0.5849 - 0.0782i; 0.3075 + 0.2159i;0.30
9、75 - 0.2159i;0.0291;-0.0000其谱半径 r=0.9947,小于 1,则方程组二使用高斯-赛德尔迭代法仍然收敛,故可用高斯-赛德尔迭代法求解。编写 matlab 高斯-赛德尔迭代法程序如下:function X=gseid(A,b,x0,delta,max1)N = length(b);for k=1:max1for j=1:Nif j=1X(1)=(b(1)-A(1,2:N)*x0(2:N)/A(1,1);elseif j=NX(N)=(b(N)-A(N,1:N-1)*(X(1:N-1)/A(N,N);elseX(j)=(b(j)-A(j,1:j-1)*X(1:j-1)
10、-A(j,j+1:N)*x0(j+1:N)/A(j,j);endendt=abs(X-x0);r=max(t);x0=X;if (rdelta)breakendkend调用高斯-赛德尔求解线性方程组的程序,取初值 x0=0;0;0;0;0;0;0;0;0;0,不同精度下求得解为:=10 -3:则 x2 =1.3126;-1.3619;0.0775;1.8468;1.0320;-1.0685;0.0209;1.9882,迭代次数 k=7=10 -4:则 x2 =1.1604;-1.1886;0.0377;1.9166 ;1.0133;-1.0342;0.0082; 1.9953,迭代次数 k=1
11、32=10 -5 :则 x2 =1.0160;-1.0188;0.0038;1.9917;1.0013;-1.0034;0.0008;1.9995,迭代次数 k=569由方程组二的高斯-赛德尔迭代过程可以看出,精度越高,所需迭代次数就越多,迭代速度也就越慢,但是其解也越来越接近与真值。当 =10 -5 时,x2 = 1.0160; -1.0188;0.0038;1.9917;1.0013;-1.0034;0.0008;1.9995,这与真值 x*=(1, -1, 0, 2, 1, -1, 0, 2) T基本是相同的。3、判断方程组三使用高斯-赛德尔迭代法是否收敛与方程组一、方程组二相似,求出方
12、程组二的高斯-赛德尔迭代矩阵的特征值为:0;0.2302 ; 0.1769;0.1072 ;0.0431;0.0051;-0.0000 + 0.0000i;-0.0000 - 0.0000i;0.0000;-0.0000其谱半径为 0.2302,小于 1,则方程组三使用高斯-赛德尔迭代法收敛,故可用高斯- 赛德尔迭代法求解。调用高斯-赛德尔求解线性方程组的程序,取初值 x0=0;0;0;0;0;0;0;0;0;0,不同精度下求得解为:=10 -3:则 x2 =2.0016;0.999;-3.0021;-0.0028;0.9986;-2.0003;3.0001 0.0001;1.0000;-1.
13、0000,迭代次数 k=4=10 -4:则 x2 =1.9999;0.9998;-3.0002;-0.0001;1.0000;-2.0000;3.0000 0.0000;1.0000;-1.0000,迭代次数 k=6=10 -5 :则 x2 = 2.0000;1.0000;-3.0000;-0.0000;1.0000;-2.0000;3.0000 0.0000;1.0000;-1.0000,迭代次数 k= 8当 =10 -5 时,x2 =2.0000;1.0000;-3.0000 ;-0.0000 ;1.0000;-2.0000;3.0000 0.0000;1.0000;-1.0000,这与真
14、值 x*=(2, 1, -3, 0, 1, -2, 3, 0, 1, -1) T是相同的。3、超松弛迭代法1、判断方程组一使用超松弛迭代法是否收敛在 matlab 软件中编写程序:w=1.3D=diag(diag(A);L=-tril(A,-1);U=-triu(A,1);B=(D-w*L)(1-w)*D+w*U);t=eig(B)r=max(abs(t)可求出方程组一的超松弛迭代矩阵的谱半径为 r=164.0633,大于 1,则超松弛迭代法不收敛,故不可用超松弛迭代法进行迭代求解。2、判断方程组二使用超松弛迭代法是否收敛与方程组一相似,取 w=1.3 求出方程组二的超松弛迭代矩阵的特征值为:
15、0.9902;0.4505 + 0.3101i;0.4505 - 0.3101i;0.1697 + 0.4168i;0.1697 - 0.4168i;0.0452;-0.0972 + 0.1215i;-0.0972 - 0.1215i其谱半径 r=0.9902,小于 1,则方程组二使用超松弛迭代法收敛,故可用超松弛迭代法求解。编写超松弛迭代法的 matlab 程序如下:function x,k=SOR(A,b,w,N,r) x0=zeros(1,length(b); n,n=size(A); k=1; while k=N x(1)=(b(1)-A(1,2:n)*x0(2:n)/A(1,1);
16、for i=2:n x(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n)/A(i,i); end if max(abs(x-x0)=r break; end k=k+1; x0=x; end if k=N+1 disp(超过最大迭代次数,求解失败!); end调用超松弛求解线性方程组的程序,取初值 x0=0;0;0;0;0;0;0;0;0;0,取=10 -5 ,分别取=0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7 ,1.8,1.9,2 时,可得到不同的解:=0.8:则 x =1.0208
17、;-1.0245;0.0049;1.9892;1.0017;-1.0044;0.0011;1.9994,迭代次数 k=10=0.9:则 x =1.0182;-1.0214;0.0043;1.9906;1.0015;-1.0039;0.0009;1.9995迭代次数 k= 604=1: 则 x =1.0160;-1.0188;0.0038;1.9917;1.0013;-1.0034;0.0008;1.9995迭代次数 k= 570=1.1:则 x =1.0144;-1.0169;0.0034;1.9926;1.0012;-1.0031;0.0007;1.9996迭代次数 k= 538=1.2:则 x =1.0129;-1.0151;0.0030;1.9933;1.0011;-1.0027;0.0007;1.9996迭代次数 k= 510=1.3:则 x =1.0116;-1.0136;0.0027;1.9940;1.0010;-1.0025;0.0006;1.9997迭代次数 k= 484