本文使用 Zhihu On VSCode 创作并发布
逐次超松弛(SOR)迭代法概述
一、方法背景
逐次超松弛迭代法是高斯-塞德尔迭代法的一种变种,是为了解决线性方程组的一种迭代方法。由David M. Young, Jr. 和Stanley P. Frankel于1950年提出,主要为了实现在计算机上求解线性方程组。逐次超松弛迭代法从高斯-塞德尔迭代出发,加入了
高斯-塞德尔迭代:
逐次超松弛迭代:
二、数学推导
1. 基础迭代法
对于
假定A有如下分解
有
建立迭代公式:
若
令
2. 迭代形式
考虑高斯-塞德尔迭代法
令
因此
在改变量r
合并
3. 矩阵形式
由高斯-塞德尔迭代的矩阵形式:
故
记
则SOR迭代为
两边同时左乘D,可得
即
令
则
三、收敛分析与误差分析
1. 收敛条件的判定
- 收敛的充要条件是
- 收敛的必要条件是
- 若系数矩阵A对称正定,则
时SOR迭代收敛
- 若系数矩阵A为严格对角占优矩阵,则
时SOR迭代收敛
2. 收敛速度分析
假设
收敛速度可以如下表示
最佳松弛参数
3. 误差分析
给定初值
四、理论分析
对于线性方程组,可以通过高斯消去、LU分解等直接法进行求解,但是直接法对于系数矩阵要求高,且程序复杂,对于求解大型线性方程组有较多限制。而像SOR迭代法的基础迭代法,只需按照迭代格式进行迭代,便于编程求解,可以迭代到任意精度,节省计算量和空间。
SOR迭代法由高斯-塞德尔迭代法改进而来,通过加入了松弛因子
编程时常使用SOR迭代法的矩阵形式,当对角矩阵D中对角线上元素有0时,下三角矩阵
五、MATLAB实现与实验
function [x,iter] = sor(A,b,x0,omega,tol)
if det(A) == 0
error('无解或无唯一解');
end
%方程组预处理
b=A'*b;
A=A'*A;
D = diag(diag(A));
L = D-tril(A);
U = D-triu(A);
x=x0;
for iter=1:500
B = (D-L*omega)((1-omega)*D+omega*U);
f = (D-L*omega)b*omega;
x = B*x+f;
eerror = norm( b-A*x ) / norm(b);
if ( eerror < tol )
break;
end
end
六、总结
逐次超松弛(SOR)迭代法从高斯-塞德尔迭代法出发,通过加入松弛因子
七、参考资料
[1] https://en.wikipedia.org/wiki/Successive_over-relaxation
[2] https://zhuanlan.zhihu.com/p/31066592
[3] https://www.jianshu.com/p/e14d9e910984