雅可比迭代法与超松弛迭代法求解线性方程组的代码分析
该代码实现了雅可比迭代法和超松弛迭代法求解线性方程组的功能。其中,雅可比迭代法实现在函数jacob2中,超松弛迭代法实现在函数cscdd中。
函数jacob2中,首先将系数矩阵A分解为对角矩阵D、上三角矩阵U和下三角矩阵L。如果D的行列式为0,则输出'此方程组无解',否则输出'此方程组有解'。然后计算D的逆矩阵iD、矩阵B1和向量f1。进行迭代,每次更新近似解X,并计算两种误差:绝对误差djwcX和相对误差xdwcX。如果两种误差均小于给定误差wucha,则输出'雅可比迭代收敛,此方程组精确解X和近似解X如下',并返回精确解X和近似解X。如果迭代次数超过最大迭代次数max1,则输出'雅可比迭代次数已经超过最大迭代次数max1'。
函数cscdd中,首先将系数矩阵A分解为对角矩阵D、上三角矩阵U和下三角矩阵L。然后计算D-om*L的逆矩阵iD、矩阵B2和向量f2。进行迭代,每次更新近似解X,并计算两种误差:绝对误差djwcX和相对误差xdwcX。如果两种误差均小于给定误差wucha,则输出'谱半径mH,A的分解矩阵D、U、L和方程组的精确解jX,迭代次数i如下',并返回精确解jX和迭代次数i。如果迭代次数超过最大迭代次数max1,则输出'迭代次数已经超过最大迭代次数max1,谱半径mH,方程组的精确解jX,迭代次数i如下'。
需要注意的是,在超松弛迭代法中,谱半径mH的计算使用了矩阵B2的特征值。如果mH不小于1,则输出'因为谱半径不小于1,所以超松弛迭代序列发散,谱半径mH,A的分解矩阵D、U、L和方程组的精确解jX,迭代次数i和迭代序列X如下'。如果mH小于1,则输出'因为谱半径小于1,所以超松弛迭代序列收敛,近似解X如下'。
function X=jacob2(A,b,x0,p,wucha,max1)
D=diag(diag(A));
U=triu(A,1);
L= tril(A, -1);
dD=det(D);
if dD==0
disp('请注意:因为对角矩阵D奇异,所以此方程组无解')
else
disp('请注意:因为对角矩阵D非奇异,所以此方程组有解')
iD=inv(D);B1=iD*(L+U);f1=iD*b;
for k=1:maxl
X=B1*x0+f1;x0=X;djwcX=norm(X-x0,p);
xdwcX=djwcX/(norm(X,p)+eps);X1=A\b;
if (djwcX<wucha)&&(xdwcX <wucha)
disp('请注意:雅可比迭代收敛,此方程组精确解X和近似解X如下:')
X=X;jX=X1';
return
end
end
if (djwcX>wucha)||(xdwcX>wucha)
disp('请注意:雅可比迭代次数已经超过最大迭代次数max1')
end
end
SOR:
function X=cscdd(A,b,X,om,wucha,max1)
%系数矩阵A,b
%初始向量X
%松弛因子om
%近似解X的误差wucha,最大迭代次数max1
D=diag(diag(A));U=-triu(A, 1);
L=-tril(A,-1);jX=A\b;[n m]=size(A);
iD=inv(D-om*L);B2=iD*(om*U+(1-om)*D);
H=eig(B2);mH=norm(H,inf);
for k=1:maxl
iD=in(D-om*L);B2=iD*(om*U+(1-om)*D);
f2=om*iD*b;X1=B2*X+f2;
X=X1;djwcX=norm(X1-jX,inf);xdwcX=djwcX/(norm(X,inf)+eps);
if (diwcX <wucha)||(xdwcX <wucha)
disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i如下:')
mH,D,U,L,jX=jX',i=k-1
return
ifi> max1
disp('迭代次数已经超过最大迭代次数max1,谱半径mH,方程组的精确解jX,迭代次数i如下')
end
end
end
if mH>=1
disp( '请注意 :因为谱半径不小于1,所以超松弛迭代序列发散')
disp( '谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i和迭代序列X如下:')
i=k-1,mH,D,U,L,jX
else
disp('因为谱半径小于1,所以超松弛迭代序列收敛,近似解X如下:')
end
原文地址: https://www.cveoy.top/t/topic/n6gG 著作权归作者所有。请勿转载和采集!