最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)共軛梯度法

 更新時(shí)間:2019年07月03日 14:09:52   作者:Tomator01  
這篇文章主要介紹了python實(shí)現(xiàn)的共軛梯度法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

算法步驟:

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,當(dāng)前迭代點(diǎn)x和當(dāng)前搜索方向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,當(dāng)前迭代點(diǎn)x和當(dāng)前搜索方向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是初始點(diǎn),fun和gfun分別是目標(biāo)函數(shù)和梯度
 # x,val分別是近似最優(yōu)點(diǎn)和最優(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] # 記錄迭代點(diǎn)
 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) # 畫(huà)出函數(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*-') # 畫(huà)出迭代點(diǎn)收斂的軌跡
 plt.show()

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

迭代軌跡:

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

最優(yōu)化方法

最速下降法

共軛梯度法

牛頓法

迭代次數(shù)

1702

240

5

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyQt5+QtChart實(shí)現(xiàn)繪制曲線圖

    PyQt5+QtChart實(shí)現(xiàn)繪制曲線圖

    QChart是一個(gè)QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實(shí)現(xiàn)曲線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • python中mpi4py的所有基礎(chǔ)使用案例詳解

    python中mpi4py的所有基礎(chǔ)使用案例詳解

    這篇文章主要介紹了python中mpi4py的所有基礎(chǔ)使用,本文通過(guò)10個(gè)案例給大家詳細(xì)講解,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • python實(shí)現(xiàn)微信自動(dòng)回復(fù)及批量添加好友功能

    python實(shí)現(xiàn)微信自動(dòng)回復(fù)及批量添加好友功能

    這篇文章主要介紹了python實(shí)現(xiàn)微信自動(dòng)回復(fù)及python 批量生成微信添加好友截圖功能的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python報(bào)錯(cuò):NameError:?name?‘xxx‘?is?not?defined的解決辦法

    Python報(bào)錯(cuò):NameError:?name?‘xxx‘?is?not?defined的解決辦法

    這篇文章主要給大家介紹了關(guān)于Python報(bào)錯(cuò):NameError:?name?‘xxx‘?is?not?defined的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-06-06
  • Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色

    Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色

    這篇文章主要為大家詳細(xì)介紹了如何使用Python3實(shí)現(xiàn)Excel行分級(jí)與單元格填色功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2025-02-02
  • Python使用CMD模塊更優(yōu)雅的運(yùn)行腳本

    Python使用CMD模塊更優(yōu)雅的運(yùn)行腳本

    這篇文章主要介紹了Python使用CMD模塊更優(yōu)雅的運(yùn)行腳本的方法,實(shí)例分析了Python中cmd模塊的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • python opencv之SURF算法示例

    python opencv之SURF算法示例

    這篇文章主要介紹了python opencv之SURF算法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Numpy維度知識(shí)總結(jié)

    Numpy維度知識(shí)總結(jié)

    這篇文章主要介紹了Numpy維度知識(shí)總結(jié),因?yàn)樵趎umpy里一維既可以做行向量也可以做列向量,那對(duì)于任意一個(gè)給定的一維向量,我們就無(wú)法確定他到底是行向量還是列向量,為了防止這種尷尬的境地,習(xí)慣上用二維矩陣而不是一維矩陣來(lái)表示行向量和列向量,需要的朋友可以參考下
    2023-09-09
  • 淺談python 中類屬性共享的問(wèn)題

    淺談python 中類屬性共享的問(wèn)題

    今天小編就為大家分享一篇淺談python 中類屬性共享的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • flask與數(shù)據(jù)庫(kù)的交互操作示例

    flask與數(shù)據(jù)庫(kù)的交互操作示例

    這篇文章主要為大家介紹了flask與數(shù)據(jù)庫(kù)的交互操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

屏南县| 昌邑市| 安陆市| 永靖县| 阜新市| 昆明市| 威海市| 彭泽县| 芷江| 绩溪县| 张北县| 准格尔旗| 东乌珠穆沁旗| 牙克石市| 久治县| 沂源县| 原平市| 徐汇区| 阿尔山市| 贵溪市| 新沂市| 慈溪市| 正镶白旗| 广州市| 白河县| 慈溪市| 遵义市| 青冈县| 威远县| 平度市| 油尖旺区| 齐齐哈尔市| 瓦房店市| 长宁县| 城固县| 昌平区| 法库县| 齐齐哈尔市| 县级市| 龙川县| 新津县|