最近在做计算方法实验,需要JOR迭代法的Matlab代码,本来想到网上随便找找看一下,找了半天没找到,最后只好自力更生了。现在分享给大家。
JOR迭代法是在Jacobi迭代法的基础上增加松弛因子来意图实现快速收敛,不过松弛因子的话选取不当反而会增加迭代次数。下面代码给出了最佳松弛因子的求法,如果其不存在则赋为1/2.
function x = JOR(A,b,N,tol)%%A为系数矩阵
%%b为对应的列向量,N为最大迭代次数,tol为计算精度
format long;%%增加了显示位数,可以去掉
count=0;%%count记录实际迭代次数
n = length(A);
x0=zeros(n,1);%%x0为初始向量,这里取为0向量
x =zeros(n,1);
D = diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
Bj=D\(L+U);%%Bj为Jacobi迭代法的迭代系数
[~,p]=eig(Bj);%%p对角线上的值为Bj的特征值
q=diag(p);%%q为Bj特征值组成的向量
%%判断是否有最佳omega:如果有则Omega为最佳omega的值,否则为1/2
if isreal(q)&&(max(q)<1)%%判断是否有最佳omega
omega=2/(2-max(q)-min(q));%求最佳omega的值
else omega=1/2;
end
omega
I=eye(n);
F=omega*(D\b);
B=I-omega*(D\A);%%B为JOR的迭代系数
for i=1:N
x = B*x0+F;
if norm(x-x0)<tol
break;
end
x0=x;
count=count+1;
end
count
end