最速下降法(適用於求二階極小值)

2021-10-14 07:29:41 字數 2391 閱讀 5351

最速下降法步驟

給:min,初始點:x0=(a0,b0)t,精度ε。

過程①

求出求出下降方向d,步長α,

下降方向:d = ▽f(x);

下次更新x的最優步長α:φ』(x) = [f(x + αd)]』 = 0;

過程②

更新x:x1 = x0 + αd0

過程③

當||▽f(x)|| < ε,則停,最小值x* = x;

##最速下降法+精確搜尋

import sympy

import numpy as np

import matplotlib.pyplot as plt

plt.rcparams[

'font.sans-serif']=

['simhei'

]#用來正常顯示中文標籤

ax = plt.axes(projection=

'3d'

)x1=sympy.symbol(

'x1'

)x2=sympy.symbol(

'x2'

)mu=sympy.symbol(

'u')

f=(x1-2)

**2+(x1-

2*x2)**2

fx1=sympy.diff(f,x1)

fx2=sympy.diff(f,x2)

x=np.array([0

,3])

.t# xmin=np.array([0,0]).t

epsi=

0.00001

lx1=

lx2=

ly=[

]def

accucy

(x,num)

: dk1=fx1.evalf(subs=

) dk2=fx2.evalf(subs=

) dk=np.array(

[dk1,dk2]).t

length=np.linalg.norm(np.float32(dk)

) fx = f.evalf(subs=)0

])1]

)if length

print

(length,x)

ax.plot3d(lx1, lx2, ly, marker=

"o", color=

"red"

, label=

"最速下降法"

)return x

else

:##下面兩句是精確搜尋

xk=x-mu*dk

dk1=fx1.subs(

) dk2=fx2.subs(

) fmu=np.inner(

[dk1,dk2]

,dk)

muk=sympy.solve(fmu,mu)

xk=x-muk*dk

print

('%d x=(%+.2f,%+.2f) length=%.3f'

%(num,xk[0]

,xk[1]

,length)

) accucy(xk,num+1)

defgraph()

: lx1=

lx2=

ly=for j in np.arange(0,

3,0.3)

:for i in np.arange(0,

3,0.3)

: fx=f.evalf(subs=

) ax.plot3d(lx1, lx2, ly, marker=

"o", color=

"blue"

, label=

"f函式"

) lx1 =

lx2 =

ly =

for i in np.arange(0,

3,0.3)

:for j in np.arange(0,

3,0.3)

: fx=f.evalf(subs=

) ax.plot3d(lx1, lx2, ly, marker=

"o", color=

"blue"

, label=

"f函式"

用Python實現最速下降法求極值

對於乙個多元函式f x f x1,x2,xn 用最速下降法 又稱梯度下降法 求其極小值的迭代格式為 xk 1 x k k dk其中dk gk f xk 為負梯度方向,即最速下降方向,k 為搜尋步長。一般情況下,最優步長 k 的確定要用到線性搜尋技術,比如精確線性搜尋,但是更常用的是不精確線性搜尋,主...

機器學習 最速下降法和牛頓下降法

入門教材常用二分法來求解實數求根的問題。我們現在來用普通迭代法 下降法來求解實數開立方根的問題。設當前實數為n,求根次數為k,根為s,那麼有s k n。所得偏差函式為f s s k n。顯然當代價函式f s 0時,我們便求出了n的k次根。現在我們開立方根,那麼k 3,代價函式為f s s 3 n。普...

最速下降法 and 共軛梯度法

註明 程式中呼叫的函式jintuifa.m golddiv.m我在之前的筆記中已貼出 最速下降法 最速下降法求解f 1 2 x1 x1 9 2 x2 x2的最小值,起始點為x0 9 1 演算法根據最優化方法 天津大學出版社 97頁演算法3.2.1編寫 v1.0 author liuxi bit fo...