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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scipy实现的共轭梯度法以及相关原理图解

發(fā)布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scipy实现的共轭梯度法以及相关原理图解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先整理下兩個概念:

Definition:given that u,v∈Rnu,v∈R^nu,vRn,then uuu and vvv are said to be mutually orthogonal if(u,v)=uTv=0(u,v)=u^Tv=0(u,v)=uTv=0(where (u,vu,vu,v)is our notation for the scalar product)

Definition:given that u,v∈Rnu,v∈R^nu,vRn,then uuu and vvv are said to be mutually conjugate with respect to a symmetric positive definite matrix AAA if uuu and AvAvAv are mutually orthogonal,i.e. uTAv=(u,Av)=0u^TAv=(u,Av)=0uTAv=(u,Av)=0
所以根據(jù)定義來看很容易理解共軛梯度下降,其實(shí)就是兩個向量之間插入了一個正定矩陣,然后依然以乘積為0作為判斷依據(jù).

------------------------------------所謂的共軛梯度體現(xiàn)在βk\beta_kβk?上面---------------------------------------------------------------------
關(guān)于βk\beta_kβk?的證明來自[5],證明過程中體現(xiàn)了共軛的概念.

---------------共軛梯度法在論文中的表述形式------------------


-------------------------------------------------------------
上面的1964年版本的αk\alpha_kαk?(也就是本文的βk\beta_kβk?)的推導(dǎo)過程[5]:

算法偽代碼比較見[4]

---------------------------------------------------------------接下來是代碼------------------------------------------------------------------------------
接下來是代碼:
[2]中給出了具體代碼,但是呢…既然scipy里面已經(jīng)有這個共軛梯度算法了,我們就不要自己手寫搗騰了吧,嘻嘻~
它們分別是:
scipy.optimize.fmin_cg函數(shù)
以及
scipy.sparse.linalg.cg函數(shù)
但是后者沒有給出具體的example,
我們還是使用前者吧,代碼如下:

import numpy as np args = (2, 3, 7, 8, 9, 10) #原函數(shù)的參數(shù) def f(x, *args):#原函數(shù)u, v = xa, b, c, d, e, f = argsreturn a*u**2 + b*u*v + c*v**2 + d*u + e*v + f def gradf(x, *args):u, v = xa, b, c, d, e, f = argsgu = 2*a*u + b*v + d # u-component of the gradientgv = b*u + 2*c*v + e # v-component of the gradientreturn np.asarray((gu, gv)) x0 = np.asarray((0, 0)) # Initial guess.#下面開始調(diào)包計(jì)算~! from scipy import optimize res1 = optimize.fmin_cg(f, x0, fprime=gradf, args=args) print("最小值所在的向量是:",res1)

-----------------------------------------------------------------------------------------

二次終結(jié)法 (quadratic temination)并不是說迭代兩次就結(jié)束,千萬不要弄錯.
另外有個很重要的資料[6],我最后沒看,但是寫得真的很詳細(xì),以后有時間并且有需要的情況下,可以看下.

[1]Conjugate Directions
[2]共軛梯度法的python實(shí)現(xiàn)
[3]官方案例
[4]Fletcher-Reevers Conjugate Descent和Steepest Descent兩種算法偽代碼的區(qū)別
[5]最優(yōu)化共軛梯度法
[6]《An Introduction to the Conjugate Gradient Method Without the Agonizing Pain》-Jonathan Richard Shewchuk

總結(jié)

以上是生活随笔為你收集整理的scipy实现的共轭梯度法以及相关原理图解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。