function [X_reality,n_reality] = SOR(A,b,X_start,w,n_limit,tolerance)

%%
% A为迭代的系数矩阵
% b为方程组右边的常数项(列向量)
% X_start为迭代的初始向量
% w为松弛因子
% n_limit为最大允许迭代的次数
% tolerance为精度上限值
%%
% X_reality为最后结果
% n_reality为最后迭代次数
%%
fprintf('\n逐次超松弛迭代法求解线性方程组\n');
[n,n] = size(A); % A的行数和列数均为n
D = diag(diag(A)); % D的对角线元素根A的对角线元素相同,其余为0
L=-tril(A,-1); % L为A的下三角矩阵的相反数
U=-triu(A,1); % U为A的上三角矩阵的相反数
B = inv(D - w * L) * ((1 - w) * D + w * U); % B为逐次超松弛迭代矩阵,也就是化简后的便于迭代的等价方程组的系数矩阵
f = w * inv(D - w * L) * b; % f为化简后的便于迭代的等价方程组的常数项向量
n_reality = 0;
%%
while 1
if(n_reality > n_limit)
disp('迭代次数超界');
break;
end
X_reality = B * X_start + f; % 逐次超松弛迭代公式
n_reality = n_reality + 1;
if(norm(X_reality - X_start) <= tolerance) % 如果满足条件||X(k+1) - X(k)||的2范数小于等于tolerance
break; % 则退出函数
else
X_start = X_reality; % 循环迭代
end
end
end
%%