美文网首页
10-07:Python线性方程组J、GS和超松弛迭代

10-07:Python线性方程组J、GS和超松弛迭代

作者: zengw20 | 来源:发表于2020-10-07 18:55 被阅读0次

为什么今天会这么冷。

今天上了数学的两节理论课,第一节课先是推导迭代法的通式,然后从迭代误差推导出收敛条件。第二节课介绍雅克比迭代和高斯-赛德尔迭代。
下面是我的雅克比迭代、高斯赛德尔迭代和超松弛迭代的代码,主要运行numpy的矩阵运算。

def Jocobi(A,b,initial,delta):
    '''
    输入:A是系数矩阵,N阶方阵
          b是N*1列向量
          initial是解的初始值,N*1大小

    输出:迭代后的解析解
    '''
    D = np.diag(np.diag(A)) # 获得D矩阵
    L = -np.tril(A,-1)      # 获得L矩阵
    U = -np.triu(A,1)       # 获得U矩阵
    d = np.linalg.inv(D)    # 对D矩阵求逆
    
    BJ = np.dot(d,L+U)      # 迭代矩阵BJ
    lamda,_ = np.linalg.eig(BJ)
    if np.max(lamda)<1:     # 谱半径小于1
        f = np.dot(d,b)
        X = np.dot(BJ,initial)+f    # 初次的解
        times = 0
        while np.linalg.norm(X - initial) > delta:
            initial = X
            X = np.dot(BJ,initial) + f
            times = times +1
        return X,times
    else:
        print('Sorry,不可收敛。')
def Seidel(A,b,initial,delta):
    '''
    输入:A是系数矩阵,N阶方阵
          b是N*1列向量
          initial是解的初始值,N*1大小
    输出:迭代后的解析解
    '''
    D = np.diag(np.diag(A)) 
    L = -np.tril(A,-1)
    U = -np.triu(A,1)
    d = np.linalg.inv( D - L )   # 这里是和雅克比不同的地方
    
    BG = np.dot(d,U)             # 迭代矩阵BG
    lamda,_ = np.linalg.eig(BG)
    if np.max(lamda)<1:          # 谱半径小于1
        f = np.dot(d,b)
        X = np.dot( BG ,initial ) + f
        times = 0
        while np.linalg.norm( X - initial ) > delta:
            initial = X
            X = np.dot( BG,initial )+f  
            times = times +1
        return X,times
    else:
        print('Sorry,不可收敛。')
def SOR(A,b,initial,delta,w,maxTimes):
    '''
    升级版高斯赛德尔迭代
    输入:A是系数矩阵,N阶方阵
          b是N*1列向量
          initial是解的初始值,N*1大小
    输出:迭代后的解析解
    '''
    D = np.diag(np.diag(A)) 
    L = -np.tril(A,-1)
    U = -np.triu(A,1)
    d = np.linalg.inv(D - w*L) 
    
    Bw = np.dot(d,(1-w)*D+w*U)         # 迭代矩阵Bw
    f = np.dot(d,w*b)
    X = np.dot( Bw ,initial ) + f
    for i in np.arange(maxTimes):
        if np.linalg.norm( X - initial ) > delta:
            initial = X
            X = np.dot( Bw,initial )+f  
    return X

今天课余时间很少,写的很粗糙,之后再自我迭代改进。

相关文章

  • 10-07:Python线性方程组J、GS和超松弛迭代

    为什么今天会这么冷。 今天上了数学的两节理论课,第一节课先是推导迭代法的通式,然后从迭代误差推导出收敛条件。第二节...

  • SQR逐次超松弛迭代法

    SQR迭代法是对GS迭代法的又一改进,在每一解向量分量处取其先前分量与GS迭代法算出的分量值的加权平均。其中w松弛...

  • 理解迭代器/生成器

    完全理解Python 迭代对象、迭代器、生成器 迭代和生成操作总结 Python迭代器 http://www.ji...

  • python笔记

    Python format格式化输出 浅谈 Python 的 with 语句 Python中迭代原理生成器和迭代原...

  • Python :生成器、迭代器、装饰器、递归函数与正则表达式

    Python 第四篇:生成器、迭代器、装饰器、递归函数与正则表达式 Python迭代器和生成器 Python 迭代...

  • Python中的迭代器和生成器

    今天我们来学习下Python中的迭代器和生成器。 迭代和可迭代对象 在学习迭代器之前,我们需要了解下迭代和可迭代对...

  • Python 中的迭代器

    Python 中的迭代器 Python 3中的迭代器 容器与迭代器 在Python 3中,支持迭代器的容器,只要支...

  • 数值计算day5-特征值与特征向量

    上节课主要介绍了线性方程组的两种迭代求解算法,一个是Jacobi迭代(同步更新),一个是高斯塞德尔迭代(异步更新)...

  • 不同的大脑

    晚上做下周数值课要用的ppt,是超松弛迭代法这里。 在跑步机上走路下来的徐老师过来瞅到了,跟我说:“这里又不考,讲...

  • Python3入门(六)迭代器和生成器

    本文介绍如何在python中使用迭代器和生成器 一、迭代器 迭代是Python最强大的功能之一,是访问集合元素的一...

网友评论

      本文标题:10-07:Python线性方程组J、GS和超松弛迭代

      本文链接:https://www.haomeiwen.com/subject/cjazuktx.html