共轭梯度法python实现
生活随笔
收集整理的這篇文章主要介紹了
共轭梯度法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实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为手机怎么强制关机_华为忘记锁屏密码怎
- 下一篇: 鸿蒙还是不是安卓,华为捐赠鸿蒙核心架构!