一般而言,因雅可比迭代收敛速度不够快,所以在工程中应用不多。并且在雅可比迭代收敛速
度很慢的情况下,通常高斯-赛德尔方法也不会很快。我们可以对高斯-赛德尔方法做出一定的
修改,来提高收敛速度。本节,我们介绍超松弛迭代法。
下面我们对该算法进行收敛性分析:
这里我们解释一下什么叫严格对角占优矩阵:严格对角占优矩阵就是矩阵主对角线元素的的模
大于与他同行的其他元素的模的总和。
下面我们具体代码实现一下:
%超松弛(SOR)迭代法,计算线性方程组的解
function [x,k] = SOR_iteration(A,b,x0,w,tol)
% tol为输入误差容限,x0为迭代初始值
% 默认最多迭代300次,超出300次会给出警示
max = 300;
if(w<=0||w>=2)
% MATLAB中error语句用于报错跳出,并可以给出相应提示
error('错啦!w的值不符合要求');
% 在MATLAB中遇到return的意思就是结束整个函数的执行,
% break是仅仅跳出循环体
return;
end
% 取出X矩阵的对角元,然后构建一个以X对角元为对角的对角矩阵
D = diag(diag(A));
% 求A的下三角矩阵,对角线元素为0,再每个矩阵元素取负号
L = -tril(A,-1);
% 求A的上三角矩阵,对角线元素为0,再每个矩阵元素取负号
U = -triu(A,1);
% 在MATLAB中inv是求矩阵的逆矩阵的意思,同具有一样的功能
B = inv(D-L*w)*((1-w)*D+w*U);
f = w*inv((D-L*w))*b;
x = B*x0+f;
k = 1;
while norm(x-x0)>=tol
x0 = x;
x = B*x0+f;
k = k+1;
if(k>=max)
disp('迭代次数超过',max1,'次,方程组可能不收敛');
return;
end
[k,x']
end
我们用超松弛迭代法求解一下下面的方程组:
在编辑界面输入如下命令:
A = [4,-2,-1;-2,4,-2;-1,-2,3];
% 注意必须加'表示转置
b = [0,-2,3]';
x0 = [1,1,1]';
[x,k] = SOR_iteration(A,b,x0,1.45,1e-6)
最后计算结果如下: