<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 如何使用python實現(xiàn)共軛梯度法-創(chuàng)新互聯(lián)

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

            目前成都創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、渝中網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

            共軛梯度法是介于最速下降法與牛頓法之間的一個方法,它僅需利用一階導(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ù)對比:

            最優(yōu)化方法

            最速下降法

            共軛梯度法

            牛頓法

            迭代次數(shù)

            1702

            240

            5

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

            當前名稱:如何使用python實現(xiàn)共軛梯度法-創(chuàng)新互聯(lián)
            文章URL:http://www.jbt999.com/article4/ddssoe.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作建站公司、移動網(wǎng)站建設(shè)用戶體驗、商城網(wǎng)站

            廣告

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

            外貿(mào)網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 加勒比在线精品视频 | 久久久久久成人电影 | 午夜传媒国产 | 蜜桃秘 av无码一区二区三区 | www.人人撸 |