zoukankan      html  css  js  c++  java
  • 线性方程组迭代算法——Gauss-Seidel迭代算法的python实现

    原理:

    请看本人博客:线性方程组的迭代求解算法——原理

    代码:

    import numpy as np
    max=100#迭代次数上限
    Delta=0.01
    m=2#阶数:矩阵为2阶
    n=3#维数:3X3的矩阵
    
    shape=np.full(m, n)
    shape=tuple(shape)
    
    def read_tensor(f,shape):#读取张量
        data=[]
        for i in range(n**(m-1)):
            line = f.readline()
            data.append(list(map(eval, line.split(","))))
        return np.array(data).reshape(shape)
        
    def read_vector(f):#读取向量
        line = f.readline()
        line = line.replace("
    ","")
        line=list(map(eval, line.split(",")))
        return np.array(line)
        
    #读取数据    
    f = open("jacobi_data.txt")
    A=read_tensor(f,shape)#读取矩阵A
    b=read_vector(f)#读取b
    f.close()
    print('A:')
    print(A)
    print('b:',b)
    
    U=np.copy(A)#求U
    DL=np.copy(A)#求D-L
    for i in range(n):
        for j in range(n):
            if j<=i:
                U[i,j]=0
            else:
                DL[i,j]=0
    U=0-U
    
    #迭代求解
    x=np.ones(n)#用于存储迭代过程中x的值
    y=np.ones(n)#用于存储中间结果
    DLU=np.dot(np.linalg.inv(DL),U)#对DL求逆,然后和U相乘
    DLb=np.dot(np.linalg.inv(DL),b)#对DL求逆,然后和b相乘
    print('x:',x)
    for iteration in range(max):
        #迭代计算
        y=np.dot(DLU,x)+DLb
            
        #判断是否达到精度要求    
        if np.max(np.fabs(x-y))<Delta:
            print('iteration:',iteration)
            break
        #将y幅值到x,开始下一轮迭代    
        x=np.copy(y)  
        print('x:',x)
    
    
    
        
        
        
        
        
        

    数据:

    组织形式:前3行是A的数据,最后1行是b的数据。

    结果:

  • 相关阅读:
    <剑指OFFER18> 18_01_DeleteNodeInList在O(1)时间删除链表结点
    哈夫曼树

    快速排序
    冒泡算法
    Java 缓存机制
    JAVA NIO
    string、stringbuilder、stringbuffer区别
    Java内存泄露的问题调查定位
    使用hibernate 框架搭建的helloworld
  • 原文地址:https://www.cnblogs.com/Fengqiao/p/Gauss-Seidel.html
Copyright © 2011-2022 走看看