logo资料库

分别用雅可比迭代法与赛德尔迭代法求解线性方程组Ax=b.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
一、题目 分别用雅可比迭代法与赛德尔迭代法求解线性方程组 Ax=b,其中 A=[-8 1 1;1 -5 1;1 1 -4],b=[1 16 7], 取初始量 x(0)=(0,0,0)',精确到 0.001。 二、基本思想 设 n 阶线性方程组 Ax=b 的系数矩阵 A 非奇异,写出它的一个等价形式 x=Mx+g 任给 x 的一个值 x(0)称为初始向量,代入的右边,算出的结果记为 x(1),如此依次代 入可得到一个向量序列 x(1)x(2)x(3)x(4)....... 显然,如果这个向量序列收敛的话,它的极限就是方程组的解。  三、程序 雅可比迭代法 function[x,k]=Fjacobi(A,b,x0,tol) maxl=300;%默认最多迭代300 D=diag(diag(A));%求A的对角矩阵 L=-tril(A,-1);%求A的下三角矩阵 U=-triu(A,1);%求A的上三角矩阵 B=D\(L+U);%用左除比求矩阵的逆 f=D\b; x=B*x0+f; k=1; %迭代次数 while norm(x-x0)>=tol x0=x; x=B*x0+f; k=k+1; if(k>=maxl) disp('迭代超过300次,方程组可能不收敛'); return; end end a=[-8 1 1;1 -5 1;1 1 -4]; b=[1 16 7]'; x0=[0 0 0]';%迭代处置 [x,k]=Fjacobi(a,b,x0,1e-3)
运行结果: 赛德尔迭代法 function [x,k]=Fgseid(A,b,x0,tol) %高斯-赛德尔迭代法 %tol为误差容限 maxl=300; D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); G=(D-L)\U; f=(D-L)\b; x=G*x0+f; k=1; while norm(x-x0)>=tol x0=x; x=G*x0+f; k=k+1; if(k>=maxl) disp('迭代次数太多,可能不收敛'); return; end end a=[-8 1 1;1 -5 1;1 1 -4]; b=[1 16 7]'; x0=[0 0 0]';%迭代初值 [x,k]=Fgseid(a,b,x0,1e-3)
运行结果:
一、题目 设矩阵 A=[4 1 1 1;1 3 -1 1;1 -1 2 0;1 1 0 2] (1)用幂法和反幂法求 A 的全部特征值和特征向量。 (2)用雅可比方法求 A 的全部特征值和特征向量。 二、基本思想 幂法是一种计算矩阵主特征值(矩阵按模最大的特征值)及对应特征向量的迭代方法, 特别是 用于大型稀疏矩阵。 反幂法用来计算矩阵按模最小的特征值及其特征向量,也可用来计算对应与一个给定近似特 征值的特征向量。 三、程序 幂法 function[vec,val]=powereig(A,epsilon) if nargin==1 disp('请输入精度要求epsilon') return end end row=size(A,1); col=size(A,2); if ndims(A)~=2|col~=row disp('请输入一个2维的方阵') return error=epsilon*2; start=ones(row,1); xknext=start; while error>epsilon xk=xknext; xknext=A*xk; maxabs=max(abs(xknext)); xknext=xknext/maxabs; if min(xknext)==-1 xknext=xknext*(-1); maxabs=maxabs*(-1); end error=norm(xk-xknext); end vec=xknext; val=maxabs; 运行结果:
反幂法: function [vec,val]=invpowereig(A,epsilon,p) if nargin==1 disp('请输入精度要求epsilon') return end if nargin==2 p=0 end row=size(A,1); col=size(A,2); if ndims(A)~=2|col~=row disp('请输入一个2维的方阵') return end n=row; if abs(det(A)-eye(n)*p)epsilon xk=xknext; xknext=B*xk;
maxabs=max(abs(xknext)); xknext=xknext/maxabs; if min(xknext)==-1 xknext=xknext*(-1); maxabs=maxabs*(-1); end error=norm(xk-xknext); end val=1/maxabs+p; vec=xknext; 雅可比: function [dia,P]=Jacobieig(A,epsilon) if nargin==1 disp('请输入精度要求epsilon') return end row=size(A,1); col=size(A,2); if ndims(A)~=2|col-row~=0 disp('矩阵大小有误,无法求特征值与特征向量.') return end if A~=A' end disp('矩阵不是实对称的') return
U=triu(A,1); B=A; PP=eye(row); while max(max(abs(U)))>epsilon MAX=max(max(abs(U))); [ro,co]=find(abs(U)==MAX); i=ro(1); j=co(1); d=(B(i,i)-B(j,j))/2/MAX; if d>=0 sd=1; else sd=-1; end t=sd/(abs(d)+sqrt(d*d+1)); c=1/sqrt(1+t*t); s=c*t; P0=[c,s;-s,c]; P=eye(row); P(i,i)=c; P(j,j)=c; P(i,j)=s; P(j,i)=-s; B=P*B*P'; PP=P*PP; U=triu(B,1); end P=PP'; dia=diag(B); function [x,k]=Fjacobi(A,b,x0,tol) maxl=300; D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); B=D\(L+U); f=D\b; x=B*x0+f; k=1; while norm(x-x0)>=tol x0=x; x=B*x0+f;
k=k+1; if(k>=maxl) end end disp('迭代次数超过300,方程组可能不收敛.') return; function [x,k]=Fgseid(A,b,x0,tol) maxl=300; D=diag(diag(A)); L=-tril(A,-1); U=triu(A,1); G=(D-L)\U; f=(D-L)\b; x=G*x0+f; k=1; while norm(x-x0)>=tol x0=x; x=G*x0+f; k=k+1; if(k>=maxl) end end disp('迭代次数超过300,方程组可能不收敛.') return;
分享到:
收藏