用Python實現牛頓法求極值

2021-07-04 06:58:24 字數 2894 閱讀 4445

對於乙個多元函式f(

x)=f

(x1,

x2,⋯

,xn)

,用牛頓法求其極小值的迭代格式為 xk

+1=x

k−g−

1kgk

其中g(

x)=∇

f(x)

為函式f(

x)的梯度向量,g(

x)為函式f(

x)的hesse(hessian)矩陣。

上述牛頓法不是全域性收斂的。為此可以引入阻尼牛頓法(又稱帶步長的牛頓法)。

我們知道,求極值的一般迭代格式為 xk

+1=x

k+αk

pk其中αk

為搜尋步長,pk

為搜尋方向(注意所有的迭代格式都是先計算搜尋方向,再計算搜尋步長,如同瞎子下山一樣,先找到哪個方向可行下降,再決定下幾步)。

取下降方向pk

=−g−

1kgk

即得阻尼牛頓法,只不過搜尋步長αk

不確定,需要用線性搜尋技術確定乙個較優的值,比如精確線性搜尋或者goldstein搜尋、wolfe搜尋等。特別地,當αk

一直取為常數1時,就是普通的牛頓法。

以rosenbrock函式為例,即有 f(

x)=100(x

2−x2

1)2+

(1−x

1)2

於是可得函式的梯度 g(

x)=∇

f(x)

=(−400(x

2−x2

1)x1

−2(1

−x1)

,200(x

2−x2

1))t

函式f(

x)的hesse矩陣為 (−

400(x2

−3x2

1)+2

−400x1

−400x1

200)

編寫python**如下(使用版本為python3.3):

"""

newton法

rosenbrock函式

函式 f(x)=100*(x(2)-x(1).^2).^2+(1-x(1)).^2

梯度 g(x)=(-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)),200*(x(2)-x(1)^2))^(t)

"""import numpy as np

import matplotlib.pyplot as plt

defjacobian

(x):

return np.array([-400*x[0]*(x[1]-x[0]**2)-2*(1-x[0]),200*(x[1]-x[0]**2)])

defhessian

(x):

return np.array([[-400*(x[1]-3*x[0]**2)+2,-400*x[0]],[-400*x[0],200]])

x1=np.arange(-1.5,1.5+0.05,0.05)

x2=np.arange(-3.5,2+0.05,0.05)

[x1,x2]=np.meshgrid(x1,x2)

f=100*(x2-x1**2)**2+(1-x1)**2; # 給定的函式

plt.contour(x1,x2,f,20) # 畫出函式的20條輪廓線

defnewton

(x0):

print('初始點為:')

print(x0,'\n')

w=np.zeros((2,10**3))

i = 1

imax = 1000

w[:,0] = x0

x = x0

delta = 1

alpha = 1

while iand delta>10**(-5):

p = -np.dot(np.linalg.inv(hessian(x)),jacobian(x))

x0 = x

x = x + alpha*p

w[:,i] = x

delta = sum((x-x0)**2)

print('第',i,'次迭代結果:')

print(x,'\n')

i=i+1

w=w[:,0:i] # 記錄迭代點

return w

x0 = np.array([-1.2,1])

w=newton(x0)

plt.plot(w[0,:],w[1,:],'g*',w[0,:],w[1,:]) # 畫出迭代點收斂的軌跡

plt.show()

上述**中jacobian(x)返回函式的梯度,hessian(x)返回函式的hesse矩陣,用w矩陣記錄迭代點的座標,然後畫出點的搜尋軌跡。

可得輸出結果為

初始點為:

[-1.2 1. ]

第 1 次迭代結果:

[-1.1752809 1.38067416]

第 2 次迭代結果:

[ 0.76311487 -3.17503385]

第 3 次迭代結果:

[ 0.76342968 0.58282478]

第 4 次迭代結果:

[ 0.99999531 0.94402732]

第 5 次迭代結果:

[ 0.9999957 0.99999139]

第 6 次迭代結果:

[ 1. 1.]

即迭代了6次得到了最優解,畫出的迭代點的軌跡如下:

由於主要使用了python的numpy模組來進行計算,可以看出,**和最終的圖與matlab是很相像的。

使用Python實現牛頓法求極值

對於乙個多元函式 用牛頓法求其極小值的迭代格式為 其中為函式 的梯度向量,為函式的hesse hessian 矩陣。上述牛頓法不是全域性收斂的。為此可以引入阻尼牛頓法 又稱帶步長的牛頓法 我們知道,求極值的一般迭代格式為 其中為搜尋步長,為搜尋方向 注意所有的迭代格式都是先計nutyrxh算搜尋方向...

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

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

python實現牛頓法 牛頓迭代法Python實現

例1 給定方程 f x x 2 sin x 1 0 判別該方程有幾個實根,並用牛頓法求出方程所有實根,精確到 10 解 利用畫圖法觀察根的所在區間為 2,1 和 0,1 其中藍色為 y f x 的曲線,橘黃色的直線是 y 0 畫圖 import numpy as np import matplotl...