最速下降法步驟
給: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...