用SOR迭代法解法方程①
SOR.m文件为
function [x,n]=SOR(a,b,E,p)
temp1=size(a);temp2=size(b);
if temp1(1)~=temp1(2)|temp1(1)~=temp2(1)|temp2(2)~=1|det(a)==0
error('矩阵或向量的大小不对应或矩阵为奇异矩阵')
return;
end
%%化为三角矩阵过程
leng=temp1(1);N=-tril(a,-1)-triu(a,1);M=a+N;N=-a;
t=1;
for i=1:leng
t=t*M(i,i);
end
if t==0
error('对角元素都为零!')
end
x=zeros(leng,1);
t=0;x1=zeros(leng,1);
for i=1:leng
for j=1:leng
if j<i
x(i)=N(i,j)*x(j)+x(i);
end
if j>=i
x(i)=N(i,j)*x1(j)+x(i);
end
end
x(i)=x1(i)+(x(i)+b(i))/M(i,i)*p;
end
for i=1:leng
t=t+(x1(i)-x(i))^2;
end
e=E^2;
n=1;
while t>e
t=0;
x1=x;
x=zeros(leng,1);
for i=1:leng
temp=0;
for j=1:leng
if j<i
x(i)=N(i,j)*x(j)+x(i);
end
if j>=i
x(i)=N(i,j)*x1(j)+x(i);
end
end
x(i)=x1(i)+(x(i)+b(i))/M(i,i)*p;
t=t+(x1(i)-x(i))^2;
end
n=n+1;
if t>1000
break;
error('不收敛')
end
end
控制命令窗口命令为:
当松弛因子p=1.3时
[x,n]=SOR(a,b,0.001,1.3)
x =
3.0000
2.0000
1.0001
n =
11
当松弛因子p=1时也即是高斯-塞德尔方法
>> [x,n]=SOR(a,b,0.001,1)
x =
2.9998
2.0001
1.0001
n =
5
当松弛因子p=0.9时
[x,n]=SOR(a,b,0.001,0.9)
x =
3.0001
1.9999
0.9999
n =
6
所以当p=1时松弛因子比较好
通过比较发现 高斯-塞德尔迭代法收敛的速度明显比雅各比收敛速度快
**SOR迭代法(Successive Over-Relaxation迭代法)**是求解线性方程组的一种数值方法,尤其适用于大型稀疏矩阵问题。在实际应用中,它通常比简单的迭代方法,如高斯-赛德尔迭代法(Gauss-Seidel method),具有更快的收敛速度。SOR方法结合了松弛因子来调整每次迭代的步长,从而优化收敛性能。
在MATLAB中,`SOR.m`函数用于执行SOR迭代法。该函数接受四个输入参数:`a`(系数矩阵)、`b`(右端项向量)、`E`(误差容忍度)和`p`(松弛因子)。函数检查输入的矩阵和向量是否满足正确尺寸,并判断系数矩阵是否奇异。如果出现错误条件,函数将抛出错误信息并终止运行。
在转换过程中,`a`矩阵被分解为对角部分`M`和非对角部分`N`,即`M = a + N`,其中`N = -tril(a,-1) - triu(a,1)`表示下三角和上三角部分的负值之和。这一步是为了解决系统中的对角主导性质,使得迭代过程更为高效。
接下来,初始化解向量`x`和中间变量`x1`为零向量,然后进入主迭代循环。在每个迭代步骤中,对于每一个未知数,都会利用当前估计值和前一估计值来更新。这里使用了松弛因子`p`,使得迭代过程不再是严格遵循高斯-赛德尔迭代的形式,而是介于当前迭代值和前一次迭代值之间,这有助于加速收敛。
迭代过程中,计算残差平方和`t`来判断是否达到预设的误差容忍度`E^2`。如果`t`小于`e`,则认为已经达到足够精度,迭代结束。迭代次数`n`会随着每一轮迭代增加。若在迭代过程中,残差平方和`t`过大,超过1000,或者迭代次数过多而仍未达到收敛标准,函数会中断并报错。
在示例中,展示了不同松弛因子`p`(1.3、1、0.9)下的结果。观察到,当`p=1`时,即高斯-赛德尔方法,收敛速度相对较慢,需要5次迭代。而`p=1.3`时,收敛速度较快,只需要11次迭代。相反,当`p=0.9`时,虽然也能收敛,但需要6次迭代,这说明选取适当的松弛因子对于优化收敛性能至关重要。
SOR迭代法是一种有效的数值方法,用于求解线性方程组,特别是当矩阵具有稀疏结构时。通过调整松弛因子,可以显著提高算法的收敛速度。在实际应用中,应当根据问题的具体特性来选择合适的松弛因子,以达到最佳的计算效率。