即Ax=b 其中A为非奇异矩阵,当A为低维稠密矩阵时,线性方程组用直接法(如高斯消去法和三角分解法)是有效的,但对于由工程技术中产生的大型稀疏矩阵方程组(A的维数n很大,但零元素较多),利用迭代法求解是适合的。在计算机内存和运算两方面,迭代通常都可利用A中有大量零元素的特点。
此处的解误差(Solution error)是有x的,但是一般情况下高维矩阵的准确解x是很难有的,注意区分后面的残差(residual error)
逐次超松弛迭代(Successive Over-Relaxation, SOR), 简称SOR方法是G-S迭代法的一种加速方法,是解大型稀疏矩阵方程组的有效方法之一,它有着较为广泛的应用。
其中对k用了洛必达法则
谱半径是绝对值最大的特征值的绝对值。
推论如下:
解误差:||x*-x(k)||
解间差:||xk-x(k-1)||
残差:||Axk-b||
||B||<1可以推出收敛,但是收敛时||B||<1不一定成立
函数SOR_iteration;
%超松弛(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的值不符合要求');
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;%迭代次数
xx = [0.5,1,-0.5]';
% norm表示无穷范数
while norm(xx-x)>=tol
x = B*x+f;
k = k+1;
if(k>=max)
disp('迭代次数超过',max1,'次,方程组可能不收敛');
return;
end
if(norm(xx-x)<tol)
[k,x']
end
end
在命令行中输入如下命令:
A = [4,-1,0;-1,4,-1;0,-1,4];
% 注意必须加'表示转置
b = [1,4,-3]';
x0 = [0,0,0]';
[x,k] = SOR_iteration(A,b,x0,1.03,5*1e-6)
A = [4,-1,0;-1,4,-1;0,-1,4];
% 注意必须加'表示转置
b = [1,4,-3]';
x0 = [0,0,0]';
[x,k] = SOR_iteration(A,b,x0,1,5*1e-6)
A = [4,-1,0;-1,4,-1;0,-1,4];
% 注意必须加'表示转置
b = [1,4,-3]';
x0 = [0,0,0]';
[x,k] = SOR_iteration(A,b,x0,1.1,5*1e-6)
MATLAB的安装方法点击链接:MATLAB的安装方法