栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数值分析——超松弛(SOR)迭代法的python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数值分析——超松弛(SOR)迭代法的python实现

逐次超松弛迭代法

对方程组

 进行SOR迭代的步骤如下

1. 分解A

 

=

2. 取松弛因子0" src="https://latex.codecogs.com/gif.latex?w%3E0" />

 

 

3. 取初始向量

4. 迭代

5. 例题

用SOR迭代法求解方程组

 

Python代码:
import numpy as np
import math
import sys
#分解矩阵
def DLU(A):
    D=np.zeros(np.shape(A))
    L=np.zeros(np.shape(A))
    U=np.zeros(np.shape(A))
    for i in range(A.shape[0]):
        D[i,i]=A[i,i]
        for j in range(i):
            L[i,j]=-A[i,j]
        for k in list(range(i+1,A.shape[1])):
            U[i,k]=-A[i,k]
    L=np.mat(L)
    D=np.mat(D)
    U=np.mat(U)
    return D,L,U

#迭代
def SOR(A,b,x0,w,maxN,p):  #x0为初始值,maxN为最大迭代次数,p为允许误差
    D,L,U=DLU(A)
    if len(A)==len(b):
        M=np.linalg.inv(D-w*L)
        M=np.mat(M)
        B=M * ((1-w)*D + w*U)
        B=np.mat(B)
        f=w*M*b
        f=np.mat(f)
    else:
        print('维数不一致')
        sys.exit(0)  # 强制退出
    
    a,b=np.linalg.eig(B) #a为特征值集合,b为特征值向量
    c=np.max(np.abs(a)) #返回谱半径
    if c<1:
        print('迭代收敛')
    else:
        print('迭代不收敛')
        sys.exit(0)  # 强制退出
#以上都是判断迭代能否进行的过程,下面正式迭代
    k=0
    while k 

输出

系数矩阵a:
[[-4  1  1  1]
 [ 1 -4  1  1]
 [ 1  1 -4  1]
 [ 1  1  1 -4]]

原值矩阵b:
[[1]
 [1]
 [1]
 [1]]

迭代收敛
迭代次数
12

数值解
[[-1.00000152]
 [-0.99999922]
 [-1.00000012]
 [-1.00000052]]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号