日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

共轭梯度法python实现

發布時間:2023/12/20 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 共轭梯度法python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python代碼

? ? ? ? 先上代碼,如果代碼有不懂的地方,可以繼續看后面的數學理論依據,算法參考西安交大數值分析教材(李乃成,梅立泉著)

import numpy as np import matplotlib.pyplot as pltclass conjugate_gradient_method():"""共軛梯度法:A是n階對稱正定矩陣輸入:A:系數矩陣b:b就是bn:矩陣階數x0:初始向量precision:精度輸出:求解結果"""def __init__(self,A,b,x0,n,precision):self.A=np.array(A)self.n=nself.precision=precisionself.b=bself.x0=np.array(x0)self.x=[]self.x.append(list(x0))self.iter=0#計算向量范數def Norm2(self,p): #p為輸入向量sum_of_p=sum([i**2 for i in p])return sum_of_p**0.5#共軛梯度法求解def calculate(self):r0=self.b-np.dot(self.A,self.x0)d0=r0r_pre=r0d_pre=d0for k in range(self.n):temp=np.dot(d_pre.T,self.A)alpha=np.dot(r_pre.T,r_pre)/np.dot(temp,d_pre)x=np.array(self.x[-1])+np.dot(alpha,d_pre)r=self.b-np.dot(self.A,x)self.x.append(list(x))if self.Norm2(r)<=self.precision:self.iter=k+1breakelse:beta=(self.Norm2(r)**2)/(self.Norm2(r_pre)**2)d=r+beta*d_prer_pre = rd_pre = dprint("計算結果為:",self.x[-1])#各個分量的差的絕對值求和def c_error(self,a,b):result=[]for j,k in zip(a,b):temp=np.array(j)-np.array(k)temp_new=sum([abs(i) for i in temp])result.append(np.log10(temp_new)) #計算log10return(np.array(result))def picture_show(self):horizontal=np.linspace(0,self.iter-1,len(self.x)-1)#print(horizontal)vertical_1=self.x[0:len(self.x)-1]vertical_2=[self.x[-1]]*(len(self.x)-1)vertical=self.c_error(vertical_1,vertical_2)#print(vertical)plt.plot(horizontal,vertical)plt.title("error")plt.xlabel("iter")plt.ylabel("log10-error")plt.show()#############測試################ if __name__ == "__main__":n=200#構造向量bb=[0]*nb[-1]=-1b[0]=-1#構造矩陣AA=np.zeros((n,n))for i in range(n):for j in range(n):if i==0:A[i][0]=-2A[i][1]=1elif i==n-1:A[i][n-1]=-2A[i][n-2]=1elif i==j:A[i][j]=-2A[i][j-1]=1A[i][j+1]=1print(A)print(b)x0=[0]*n #初始值向量precision=0.001my_cgm=conjugate_gradient_method(A,b,x0,n,precision) #初始化my_cgm.calculate() #使用共軛梯度法求解print("迭代次數:", my_cgm.iter)my_cgm.picture_show() #顯示收斂速度

共軛梯度法原理

共軛梯度法是把求解線性方程組的問題轉化為求解一個與之等價的二次函數極小化的問題,從任意給定的初始點出發,沿一組關于矩陣A的共軛方向進行線性搜索,在無舍入誤差的假定下,最多迭代n次(n為矩陣的階數),就可以求得二次函數的極小點,也就求得了線性方程組Ax=b的解。

共軛梯度法在形式上具有迭代法的特征,給定初始向量x(0),由迭代格式

?產生的迭代序列x(1),x(2),x(3),… 在無舍入誤差的假定下,最多經過n次迭代就可求得f(x)的最小點。

?

算法偽代碼

?

總結

以上是生活随笔為你收集整理的共轭梯度法python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。