基于Python实现的SOR法(逐次超松弛迭代法)


Jacobi迭代法与Gauss-Seidel迭代法回顾

上一篇博客介绍了J迭代法和G-S迭代法的原理,现在复习一下,J迭代法的迭代公式为
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯   , n , k = 0 , 1 , ⋯ x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\i=1,2,\cdots,n,k=0,1,\cdots xi(k+1)=aii1(bij=1i1aijxj(k)j=i+1naijxj(k))i=1,2,,n,k=0,1,矩阵形式为
x ( k + 1 ) = D − 1 ( L + U ) x ( k ) + D − 1 b x^{(k+1)}=D^{-1}(L+U)x^{(k)}+D^{-1}b x(k+1)=D1(L+U)x(k)+D1b(这里将系数矩阵A分裂为A = D - L - U)

G-S迭代法的迭代公式为
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i + 1 n a i j x j ( k ) ) i = 1 , 2 , ⋯   , n , k = 0 , 1 , ⋯ x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\i=1,2,\cdots,n,k=0,1,\cdots xi(k+1)=aii1(bij=1i1aijxj(k+1)j=i+1naijxj(k))i=1,2,,n,k=0,1,矩阵形式为
x ( k + 1 ) = ( D − L ) − 1 U x ( k ) + ( D − L ) − 1 b x^{(k+1)}= (D - L)^{-1}Ux^{(k)}+(D-L)^{-1}b x(k+1)=(DL)1Ux(k)+(DL)1b(仍将系数矩阵A分裂为A = D - L - U)


SOR法(逐次超松弛迭代法)

超松弛迭代法可视为J迭代法或G-S迭代法的改进版,我们可以把J迭代法的迭代公式做如下变换
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i + 1 n a i j x j ( k ) ) = x i ( k ) + 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i n a i j x j ( k ) ) x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\ =x_i^{(k)} + \frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k)}-\sum_{j=i}^na_{ij}x_j^{(k)}) xi(k+1)=aii1(bij=1i1aijxj(k)j=i+1naijxj(k))=xi(k)+aii1(bij=1i1aijxj(k)j=inaijxj(k))然后,在 1 a i i \frac1{a_{ii}} aii1 处加一个参数 ω \omega ω
x i ( k + 1 ) = x i ( k ) + ω a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k ) − ∑ j = i n a i j x j ( k ) ) x_i^{(k+1)}=x_i^{(k)} + \frac\omega{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k)}-\sum_{j=i}^na_{ij}x_j^{(k)}) xi(k+1)=xi(k)+aiiω(bij=1i1aijxj(k)j=inaijxj(k))这样就得到的SOR法的迭代公式了,其矩阵格式为
x ( k + 1 ) = x ( k ) + ω D − 1 ( b + ( L + U − D ) x ( k ) ) = D − 1 ( ω ( L + U ) + ( 1 − ω ) D ) x ( k ) + ω D − 1 b x^{(k+1)}=x^{(k)}+\omega D^{-1}(b+(L+U-D)x^{(k)})\\ =D^{-1}(\omega (L+U)+(1-\omega )D)x^{(k)}+\omega D^{-1}b x(k+1)=x(k)+ωD1(b+(L+UD)x(k))=D1(ω(L+U)+(1ω)D)x(k)+ωD1b(依然将系数矩阵A分裂为A = D - L - U)

同理,如果把G-S迭代公式做相同的变换,有
x i ( k + 1 ) = 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i + 1 n a i j x j ( k ) ) = x i ( k ) + 1 a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i n a i j x j ( k ) ) x_i^{(k+1)}=\frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i+1}^na_{ij}x_j^{(k)})\\ =x_i^{(k)} + \frac1{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i}^na_{ij}x_j^{(k)}) xi(k+1)=aii1(bij=1i1aijxj(k+1)j=i+1naijxj(k))=xi(k)+aii1(bij=1i1aijxj(k+1)j=inaijxj(k))类似地,在 1 a i i \frac1{a_{ii}} aii1 处加一个参数 ω \omega ω
x i ( k + 1 ) = x i ( k ) + ω a i i ( b i − ∑ j = 1 i − 1 a i j x j ( k + 1 ) − ∑ j = i n a i j x j ( k ) ) x_i^{(k+1)}=x_i^{(k)} + \frac\omega{a_{ii}}(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i}^na_{ij}x_j^{(k)}) xi(k+1)=xi(k)+aiiω(bij=1i1aijxj(k+1)j=inaijxj(k))这样就得到的SOR法的迭代公式了,其矩阵格式为
x ( k + 1 ) = x ( k ) + ω D − 1 ( b + L x ( k + 1 ) + ( U − D ) x ( k ) )    D x ( k + 1 ) = D x ( k ) + ω ( b + L x ( k + 1 ) + ( U − D ) x ( k ) )    ( D − ω L ) x ( k + 1 ) = D x ( k ) + ω ( U − D ) x ( k ) + ω b    x ( k + 1 ) = ( D − ω L ) − 1 ( ω U + ( 1 − ω ) D ) x ( k ) + ω ( D − ω L ) − 1 b x^{(k+1)}=x^{(k)}+\omega D^{-1}(b+Lx^{(k+1)}+(U-D)x^{(k)})\\ \;\\ Dx^{(k+1)}=Dx^{(k)}+\omega(b+Lx^{(k+1)}+(U-D)x^{(k)})\\ \;\\ (D-\omega L)x^{(k+1)}=Dx^{(k)}+\omega (U-D)x^{(k)}+ \omega b\\ \;\\ x^{(k+1)}=(D-\omega L)^{-1}(\omega U+(1-\omega)D)x^{(k)} + \omega(D-\omega L)^{-1} b x(k+1)=x(k)+ωD1(b+Lx(k+1)+(UD)x(k))Dx(k+1)=Dx(k)+ω(b+Lx(k+1)+(UD)x(k))(DωL)x(k+1)=Dx(k)+ω(UD)x(k)+ωbx(k+1)=(DωL)1(ωU+(1ω)D)x(k)+ω(DωL)1b
至此SOR方法的公式推导完毕。

值得注意的是同J迭代法和G-S迭代法一样,SOR方法有一些用来判断是否收敛的条件,这里就不介绍了,有兴趣的同学请查阅相关书籍。


基于Python实现SOR法

下面基于公式
x ( k + 1 ) = ( D − ω L ) − 1 ( ω U + ( 1 − ω ) D ) x ( k ) + ω ( D − ω L ) − 1 b x^{(k+1)}=(D-\omega L)^{-1}(\omega U+(1-\omega)D)x^{(k)} + \omega(D-\omega L)^{-1} b x(k+1)=(DωL)1(ωU+(1ω)D)x(k)+ω(DωL)1b实现算法

算法代码

import numpy as np
def SORfunction(A,b,w,k):
    n = A.shape[1]#系数矩阵的列数
    D = np.eye(n)
    D[np.arange(n),np.arange(n)] = A[np.arange(n),np.arange(n)]
    LU = D - A
    L = np.tril(LU)
    U = np.triu(LU)
    D_wL = D - w*L
    X = np.zeros(n)
    print("第",0,"次迭代的结果:",X)
    for i in range(k):
        D_wL_inv = np.linalg.inv(D_wL)
        X =  np.dot(np.dot(D_wL_inv,w * U + (1-w) * D),X) + w * np.dot(D_wL_inv,b)
        print("第",i+1,"次迭代的结果:",X)
    return X

实验
在这里插入图片描述

A = np.array([
    [4,-2,-4],
    [-2,17,10],
    [-4,10,9]
])
b = np.array([10,3,-7])
w = 1.46
k=20
SORfunction(A,b,w,k)

实验结果
在这里插入图片描述

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值