计算线性方程组Ax=b,利用A=D-L-U,将线性方程组改写为x=Bx+f,用迭代的方法进行计算
以6阶希尔伯特矩阵为例,如果需计算其他矩阵,改一下A,要计算其他阶数,改一下n的值就好
clc
clear
format rat%也可以用format long
n=6
%定义希尔伯特矩阵
H=zeros(n,n);
for i=1:n
for j=1:n
H(i,j)=1/(i+j-1);
end
end
H
%此处可定义不同的矩阵A,向量b
A=H;
b=A*ones(n,1);
x0=zeros(n,1);%初始向量
D=zeros(n,n);
L=zeros(n,n);
U=zeros(n,n);
for i=1:n
D(i,i)=A(i,i);%定义对角阵
end
D
for i=2:n
for j=1:i-1
L(i,j)=-A(i,j);%定义单位下三角阵
end
end
L
for i=1:n
for j=i+1:n
U(i,j)=-A(i,j);
end
end
U
m=1000;%可根据情况改变m的值
t1=0;
t2=0;
%在计算之前先判断两种迭代方法是否收敛
if max(abs(eig(D^-1*(L+U))))<1
disp('雅可比迭代法收敛,接下来使用此方法进行求解');
x1=x0;
for i=1:m
x1=D^-1*(L+U)*x1+D^-1*b;
if(abs(t1-x1)<10^-5)
sprintf('在经过%d次迭代后,得到收敛解',i)
break
end
t1=x1;
end
disp('雅可比迭代法得到的x:');
disp(x1)
else
disp('雅可比迭代法不收敛,计算停止')
end
if max(abs(eig((D-L)^-1*U)))<1
disp('高斯-塞德尔迭代法收敛,接下来使用此方法进行求解');
x2=x0;
for i=1:m
x2=(D-L)^-1*U*x2+(D-L)^-1*b;
if(abs(t2-x2)<10^-5)
sprintf('在经过%d次迭代后,得到收敛解',i)
break
end
t2=x2;
end
disp('高斯-塞德尔迭代法得到的x:');
disp(x2)
else
disp('高斯-塞德尔迭代法不收敛,计算停止')
end