Python中實現(xiàn)共軛梯度法的案例-創(chuàng)新互聯(lián)

小編給大家分享一下Python中實現(xiàn)共軛梯度法的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)建站專注于奇臺網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供奇臺營銷型網(wǎng)站建設(shè),奇臺網(wǎng)站制作、奇臺網(wǎng)頁設(shè)計、奇臺網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造奇臺網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供奇臺網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

共軛梯度法是介于最速下降法與牛頓法之間的一個方法,它僅需利用一階導(dǎo)數(shù)信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣并求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優(yōu)化最有效的算法之一。 在各種優(yōu)化算法中,共軛梯度法是非常重要的一種。其優(yōu)點是所需存儲量小,具有步收斂性,穩(wěn)定性高,而且不需要任何外來參數(shù)。

算法步驟:

Python中實現(xiàn)共軛梯度法的案例

import random import numpy as np import matplotlib.pyplot as plt def goldsteinsearch(f,df,d,x,alpham,rho,t): ''' 線性搜索子函數(shù) 數(shù)f,導(dǎo)數(shù)df,當前迭代點x和當前搜索方向d,t試探系數(shù)>1, ''' flag = 0 a = 0 b = alpham fk = f(x) gk = df(x) phi0 = fk dphi0 = np.dot(gk, d) alpha=b*random.uniform(0,1) while(flag==0):  newfk = f(x + alpha * d)  phi = newfk  # print(phi,phi0,rho,alpha ,dphi0)  if (phi - phi0 )<= (rho * alpha * dphi0):   if (phi - phi0) >= ((1 - rho) * alpha * dphi0):    flag = 1   else:    a = alpha    b = b    if (b < alpham):     alpha = (a + b) / 2    else:     alpha = t * alpha  else:   a = a   b = alpha   alpha = (a + b) / 2 return alpha def Wolfesearch(f,df,d,x,alpham,rho,t): ''' 線性搜索子函數(shù) 數(shù)f,導(dǎo)數(shù)df,當前迭代點x和當前搜索方向d σ∈(ρ,1)=0.75 ''' sigma=0.75 flag = 0 a = 0 b = alpham fk = f(x) gk = df(x) phi0 = fk dphi0 = np.dot(gk, d) alpha=b*random.uniform(0,1) while(flag==0):  newfk = f(x + alpha * d)  phi = newfk  # print(phi,phi0,rho,alpha ,dphi0)  if (phi - phi0 )<= (rho * alpha * dphi0):   # if abs(np.dot(df(x + alpha * d),d))<=-sigma*dphi0:   if (phi - phi0) >= ((1 - rho) * alpha * dphi0):    flag = 1   else:    a = alpha    b = b    if (b < alpham):     alpha = (a + b) / 2    else:     alpha = t * alpha  else:   a = a   b = alpha   alpha = (a + b) / 2 return alpha def frcg(fun,gfun,x0): # x0是初始點,fun和gfun分別是目標函數(shù)和梯度 # x,val分別是近似最優(yōu)點和最優(yōu)值,k是迭代次數(shù) # dk是搜索方向,gk是梯度方向 # epsilon是預(yù)設(shè)精度,np.linalg.norm(gk)求取向量的二范數(shù) maxk = 5000 rho = 0.6 sigma = 0.4 k = 0 epsilon = 1e-5 n = np.shape(x0)[0] itern = 0 W = np.zeros((2, 20000)) f = open("共軛.txt", 'w') while k < maxk:   W[:, k] = x0   gk = gfun(x0)   itern += 1   itern %= n   if itern == 1:    dk = -gk   else:    beta = 1.0 * np.dot(gk, gk) / np.dot(g0, g0)    dk = -gk + beta * d0    gd = np.dot(gk, dk)    if gd >= 0.0:     dk = -gk   if np.linalg.norm(gk) < epsilon:    break   alpha=goldsteinsearch(fun,gfun,dk,x0,1,0.1,2)   # alpha=Wolfesearch(fun,gfun,dk,x0,1,0.1,2)   x0+=alpha*dk   f.write(str(k)+' '+str(np.linalg.norm(gk))+"\n")   print(k,alpha)   g0 = gk   d0 = dk   k += 1 W = W[:, 0:k+1] # 記錄迭代點 return [x0, fun(x0), k,W] def fun(x): return 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2 def gfun(x): return np.array([-400 * x[0] * (x[1] - x[0] ** 2) - 2 * (1 - x[0]), 200 * (x[1] - x[0] ** 2)]) if __name__=="__main__": X1 = np.arange(-1.5, 1.5 + 0.05, 0.05) X2 = np.arange(-3.5, 4 + 0.05, 0.05) [x1, x2] = np.meshgrid(X1, X2) f = 100 * (x2 - x1 ** 2) ** 2 + (1 - x1) ** 2 # 給定的函數(shù) plt.contour(x1, x2, f, 20) # 畫出函數(shù)的20條輪廓線 x0 = np.array([-1.2, 1]) x=frcg(fun,gfun,x0) print(x[0],x[2]) # [1.00318532 1.00639618] W=x[3] # print(W[:, :]) plt.plot(W[0, :], W[1, :], 'g*-') # 畫出迭代點收斂的軌跡 plt.show()


代碼中求最優(yōu)步長用得是goldsteinsearch方法,另外的Wolfesearch是試驗的部分,在本段程序中不起作用。

迭代軌跡:

Python中實現(xiàn)共軛梯度法的案例

Python中實現(xiàn)共軛梯度法的案例

三種最優(yōu)化方法的迭代次數(shù)對比:

Python中實現(xiàn)共軛梯度法的案例

以上是Python中實現(xiàn)共軛梯度法的案例的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁題目:Python中實現(xiàn)共軛梯度法的案例-創(chuàng)新互聯(lián)
文章起源:http://muchs.cn/article40/dcheeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁設(shè)計公司網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)