线性方程组的SOR迭代法

写在前面

  • 1 SOR简介
  • 2 SOR算法推导
  • 3 SOR算法收敛性
  • 4 实例分析
  • 5 代码实现
  • 6 参考文献与链接

迭代法收敛定理

定理1(充要条件):
矩阵M\mathbf{M}的谱半径
ρ(M)=maxi{λii=1,2,n}<1(M2<1)  (1) \rho \left( \mathbf{M} \right) =\mathop {\max} \limits_i\left\{ \lambda _i\left| i=1,2,\cdots n \right. \right\} <1\left( \lVert \mathbf{M} \rVert _2<1 \right) \,\, \tag{1}

定理2(充分条件):
矩阵M\mathbf{M}的某个算子范数
M<1(2) \lVert \mathbf{M} \rVert <1 \tag{2}

1 SOR简介

SOR是Successive Over Relaxation(逐次超松弛)的缩写。该方法是求解大型稀疏矩阵方程组的有效方法之一,也可看作为Gauss-Seidel迭代法的加速,Gauss-Seidel是SOR迭代的一种特殊形式。

2 SOR算法推导

将方程组AX=b\mathbf{AX}=b写成
ai1x1+ai2x2++ai,i1xi1+aiixi+ainxn=bi,(i=1,2,,n)(2.1) a_{i 1} x_{1}+a_{i 2} x_{2}+\cdots+a_{i, i-1} x_{i-1}+a_{i i} x_{i} \cdots+a_{i n} x_{n}=b_{i}, \quad(i=1,2, \cdots, n)\tag{2.1}

aiixi=bi(ai1x1+ai2x2++ai,i1xi1)(ai,i+1xi+1++ainxn)aiixi=aiixi+(biai1x1ai2x2ai,i1xi1aiixiai,i+1xi+1ainxn)xi=xi+1aii(biai1x1ai2x2ai,i1xi1aitxiai,i+1xi+1ainxn) \begin{aligned} &\Rightarrow a_{i i} x_{i}=b_{i}-\left(a_{i 1} x_{1}+a_{i 2} x_{2}+\cdots+a_{i, i-1} x_{i-1}\right)-\left(a_{i, i+1} x_{i+1}+\cdots+a_{i n} x_{n}\right)\\ &\Rightarrow a_{i i} x_{i}=a_{i i} x_{i}+\left(b_{i}-a_{i 1} x_{1}-a_{i 2} x_{2}-\cdots-a_{i, i-1} x_{i-1}-a_{i i} x_{i}-a_{i, i+1} x_{i+1}-\cdots-a_{i n} x_{n}\right)\\ &\Rightarrow x_{i}=x_{i}+\frac{1}{a_{i i}}\left(b_{i}-a_{i 1} x_{1}-a_{i 2} x_{2}-\cdots-a_{i, i-1} x_{i-1}-a_{i t} x_{i}-a_{i, i+1} x_{i+1}-\cdots-a_{i n} x_{n}\right) \end{aligned}
于是Gauss-Seidel迭代法可写成(ai,i0a_{i,i}\ne 0
xi(k+1)=xi(k)+1aii(biai1x1(k+1)ai,i1xi1(k+1)ainxi(k)ainxn(k))=xi(k)+1aii(bij=1i1aijxj(k+1)j=inaijxj(k))ri(k)=(bij=1i1aijxj(k+1)j=inaijxj(k)),i=1,2,,n(2.2) \begin{array}{c} x_{i}^{(k+1)}=x_{i}^{(k)}+\frac{1}{a_{i i}}\left(b_{i}-a_{i 1} x_{1}^{(k+1)}-\cdots-a_{i, i-1} x_{i-1}^{(k+1)}-a_{i n} x_{i}^{(k)}-\cdots-a_{i n} x_{n}^{(k)}\right) \\ =x_{i}^{(k)}+\frac{1}{a_{i i}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i}^{n} a_{i j} x_{j}^{(k)}\right) \\ r_{i}^{(k)}=\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i}^{n} a_{i j} x_{j}^{(k)}\right), \quad i=1,2, \cdots, n \end{array}\tag{2.2}

ri(k)=(bij=1i1aijxj(k+1)j=inaijxj(k)),i=1,2,,n r_{i}^{(k)}=\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i}^{n} a_{i j} x_{j}^{(k)}\right), \quad i=1,2, \cdots, n
则(2.2)式可写成
xi(k+1)=xi(k)+1aiiri(k)(2.3) x_{i}^{(k+1)}=x_{i}^{(k)}+\frac{1}{a_{i i}} r_{i}^{(k)}\tag{2.3}
由(2.3)式可看出,Gauss-Seidel迭代法的第k+1k+1步的基础上每个分量上加上1aiiri(k)\frac{1}{a_{i i}} r_{i}^{(k)}。为了获得更快的收敛效果,在修正项的前面乘以一个参数ω\omega,于是得到逐次超松弛算法
xi(k+1)=xi(k)+ωaiiri(k),i=1,2,,n(2.4) x_{i}^{(k+1)}=x_{i}^{(k)}+\frac{\omega}{a_{i i}} r_{i}^{(k)}, \quad i=1,2, \cdots, n\tag{2.4}

xi(k+1)=(1ω)xi(k)+ωaii(bij=1i1aijxj(k+1)j=i+1naijxj(k)),i=1,2,,n(2.5) x_{i}^{(k+1)}=(1-\omega) x_{i}^{(k)}+\frac{\omega}{a_{i i}}\left(b_{i}-\sum_{j=1}^{i-1} a_{i j} x_{j}^{(k+1)}-\sum_{j=i+1}^{n} a_{i j} x_{j}^{(k)}\right), \quad i=1,2, \cdots, n\tag{2.5}
其矩阵形式为
X(k+1)=(1ω)X(k)+ωD1(b+LX(k)+UX(k))(2.6) \mathbf{X}^{(k+1)}=(1-\omega) \mathbf{X}^{(k)}+\omega \mathbf{D}^{-1}\left(b+\mathbf{L} \mathbf{X}^{(k)}+\mathbf{U} \mathbf{X}^{(k)}\right)\tag{2.6}
其中,A=DLU\mathbf{A=D-L-U}
D=(a11a22ann),L=(0a210an1an20),U=(0a12a1n0a2n0) \mathbf{D}=\left( \begin{matrix} a_{11}& & & \\ & a_{22}& & \\ & & \ddots& \\ & & & a_{nn}\\ \end{matrix} \right), \mathbf{L}=\left( \begin{matrix} 0& & & \\ a_{21}& 0& & \\ \vdots& \ddots& \ddots& \\ a_{n1}& a_{n2}& \cdots& 0\\ \end{matrix} \right) , \mathbf{U}=\left( \begin{matrix} 0& a_{12}& \cdots& a_{1n}\\ & 0& \ddots& a_{2n}\\ & & \ddots& \vdots\\ & & & 0\\ \end{matrix} \right)

3 SOR算法收敛性

由(2.6)式有
DX(k+1)=(1ω)DX(k)+ω(b+LX(k+1)+UX(k)) \mathbf{DX}^{\left( k+1 \right)}=\left( 1-\omega \right) \mathbf{DX}^{\left( k \right)}+\omega \left( b+\mathbf{LX}^{\left( k+1 \right)}+\mathbf{UX}^{\left( k \right)} \right)

DX(k+1)ωLX(k+1)=(1ω)DX(k)+ωUX(k)+ωb \mathbf{D} \mathbf{X}^{(k+1)}-\omega \mathbf{L} \mathbf{X}^{(k+1)}=(1-\omega) \mathbf{D} \mathbf{X}^{(k)}+\omega \mathbf{U} \mathbf{X}^{(k)}+\omega b
于是有
(DωL)X(k+1)=[(1ω)D+ωU]X(k)+ωbX(k+1)=(DωL)1[(1ω)D+ωU]X(k)+ω(DωL)1b \begin{array}{l} (\mathbf{D}-\omega \mathbf{L}) \mathbf{X}^{(k+1)}=[(1-\omega) \mathbf{D}+\omega \mathbf{U}] \mathbf{X}^{(k)}+\omega b \\ \Rightarrow \mathbf{X}^{(k+1)}=(\mathbf{D}-\omega \mathbf{L})^{-1}[(1-\omega) \mathbf{D}+\omega \mathbf{U}] \mathbf{X}^{(k)}+\omega(\mathbf{D}-\omega \mathbf{L})^{-1} b \end{array}

{Bω=(DωL)1[(1ω)D+ωU]Fω=ω(DωL)1b(3.1) \left\{\begin{array}{c} \mathbf{B}_{\omega}=(\mathbf{D}-\omega \mathbf{L})^{-1}[(1-\omega) \mathbf{D}+\omega \mathbf{U}] \\ \mathbf{F}_{\omega}=\omega(\mathbf{D}-\omega \mathbf{L})^{-1} b \end{array}\right. \tag{3.1}
则有
X(k+1)=Bω(X)(k)+Fω(3.2) \mathbf{X}^{(k+1)}=\mathbf{B_{\omega}} \mathbf(X)^{(k)}+\mathbf{F_{\omega}} \tag{3.2}
其中,Bω\mathbf{B_{ \omega}}为SOR迭代矩阵。
由收敛定理的定理1定理2可知,SOR收敛的充要条件是ρ(Bω)<1\rho{(\mathbf{B_{\omega}})}<1或者Bω2<1\lVert \mathbf{B}_{\omega} \rVert _2 <1,可以看出SOR迭代法收敛与否或收敛的快慢都与松弛因子ω\omega有关,因此SOR迭代算法存在如下定理.
定理3: SOR迭代法收敛的充要条件是松弛因子0<ω<20<\omega<2 .
证:由于SOR收敛,则ρ(Bω)<1\rho{(\mathbf{B_{\omega}})}<1。记Bω\mathbf{B_{\omega}}的特征值为λ1,λ2,,λn\lambda _1,\lambda _2,\cdots ,\lambda _n,而nn阶矩阵的nn个特征值之积等于其行列式之值,即
detBω=λ1λ2λn \left|\operatorname{det} \mathbf{B}_{\omega}\right|=\left|\lambda_{1} \lambda_{2} \cdots \lambda_{n}\right|

λiρ(Bω) \left|\lambda_{i}\right| \leq\left|\rho\left(\mathbf{B}_{\omega}\right)\right|

detBω=λ1λ2λn[ρ(Bω)]n<1 \left|\operatorname{det} \mathbf{B}_{\omega}\right|=\left|\lambda_{1} \lambda_{2} \cdots \lambda_{n}\right| \leq\left[\rho\left(\mathbf{B}_{\omega}\right)\right]^{n}<1
另一方面,由
Bω=(DωL)1[(1ω)D+ωU] \mathbf{B}_{\omega}=(\mathbf{D}-\omega \mathbf{L})^{-1}[(1-\omega) \mathbf{D}+\omega \mathbf{U}]

detBω=det(DωL)1det[(1ω)D+ωU] \left|\operatorname{det} \mathbf{B}_{\omega}\right|=\left|\operatorname{det}(\mathbf{D}-\omega \mathbf{L})^{-1}\right| \cdot | \operatorname{det}[(1-\omega) \mathbf{D}+\omega \mathbf{U}]

detBω=det[(1ω)D+ωU]det(DωL)=1ωn \left|\operatorname{det} \mathbf{B}_{\omega}\right|=\frac{|\operatorname{det}[(1-\omega) \mathbf{D}+\omega \mathbf{U}]|}{|\operatorname{det}(\mathbf{D}-\omega \mathbf{L})|}=|1-\omega|^{n}
因此有1ωn<1|1-\omega|^{n}<1或者1ω<1|1-\omega|<1,也即0<ω<20<\omega<2.           \square

定理4:如果矩阵A\mathbf{A}是对称正定的,则SOR法对于0<ω<20<\omega<2是收敛的。

4 实例分析

用逐次超松弛(SOR)迭代法求解方程组AX=b\mathbf{AX}=b,其中矩阵A\mathbf{A}
A=[122121221121221121221121221212][x1x2x3x18x19x20]=[555555](4.1) \mathbf{A}=\left[\begin{array}{ccccccc} 12 & -2 & 1 & & & & \\ -2 & 12 & -2 & 1 & & & \\ 1 & -2 & 12 & -2 & 1 & & \\ & \ddots & \ddots & \ddots & \ddots & \ddots & \\ & & 1 & -2 & 12 & -2 & 1 \\ & & & 1 & -2 & 12 & -2 \\ & & & & 1 & -2 & 12 \end{array}\right]\left[\begin{array}{c} x_{1} \\ x_{2} \\ x_{3} \\ \vdots \\ x_{18} \\ x_{19} \\ x_{20} \end{array}\right]=\left[\begin{array}{c} 5 \\ 5 \\ 5 \\ \vdots \\ 5 \\ 5 \\ 5 \end{array}\right]\tag{4.1}
利用Matlab2016a软件求解(4.1)式(具体程序见第五节),讨论不同的松弛因子ω\omega对迭代速度的影响。其中参数设置为:最大迭代值为500。

由于(4.1)式是一个对称正定阵,且本文规定松弛因子0<ω<20<\omega<2,因此由定理4可知,式(4.1)一定收敛,也即有解。求解的结果如下表。

表1 不同ω\omega值对方程收敛速度的影响

w
迭代次数
0.3
120
0.6
50
0.9
25
1.2
30
1.5
50
1.8
150

图1 不同ω\omega值时的SOR迭代曲线值
线性方程组的SOR迭代法

由表1或图1可知,(1)当SOR迭代法松弛因子ω>1\omega>1时,ω\omega值越大,迭代的次数就越多,收敛速度就越慢,ω\omega越接近1时,迭代的次数越少,收敛速度越快;(2)当SOR迭代法松弛因子ω<1\omega<1时,ω\omega越小,迭代的次数就越多,收敛速度就越慢,ω\omega越接近1时,迭代的次数越少,收敛速度越快;(3)SOR迭代法松弛因子不在范围内时,系数矩阵的谱半径大于1,不收敛。

小结

  1. 在SOR迭代算法中,松弛因子ω\omega越接近1时,迭代的次数越小,收敛速度越快,故ω\omega最优值应选择ω=1\omega=1
  2. 在SOR迭代算法中,松弛因子ω\omega距离1越远时,迭代次数越多,收敛速度越慢。
  3. 在SOR迭代算法中,松弛因子应选择0<ω<20<\omega<2,当ω\omega超过这个范围时,不满足收敛定理,即谱半径不小于1,此时方程无解。

5 代码实现

数据下载地址
提取码:wmy0

6 参考文献与链接

[1] 数值分析 曾繁慧
[2] 科学计算与应用软件讲义_迭代思想 胡行华
[3] https://mdnice.com/
[4] Markdown Nice插件下载
[5] Markdown三线表制作方法
为了能够敲公式,第一次使用Markdown写文章,有很多不足之处请谅解
Markdown真香,更多内容请关注公众号获取

线性方程组的SOR迭代法