一、题目
分别用雅可比迭代法与赛德尔迭代法求解线性方程组 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;