線性方程組迭代算法——Jacobi迭代算法的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("\n","")
    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)

#求LU=L+U
LU=np.copy(A)
for i in range(n):
    LU[i,i]=0
LU=0-LU

#求D:系數矩陣的對角線元素
D=np.copy(A)
D=D+LU

#迭代求解
x=np.ones(n)#用於存儲迭代過程中x的值
y=np.ones(n)#用於存儲中間結果
DLU=np.dot(np.linalg.inv(D),LU)#對D求逆,然后和LU相乘
Db=np.dot(np.linalg.inv(D),b)
print('x:',x)
for iteration in range(max):
    #迭代計算
    y=np.dot(DLU,x)+Db
        
    #判斷是否達到精度要求    
    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的數據。

 

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM