使用Python實現牛頓法求極值

2022-09-29 06:06:08 字數 2259 閱讀 2851

對於乙個多元函式

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

其中為函式

的梯度向量,

為函式的hesse(hessian)矩陣。

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

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

其中為搜尋步長,

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

取下降方向

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

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

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

以rosenbrock函式為例,即有

於是可得函式的梯度

函式的hesse矩陣為

編寫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

"""import numpy as np

import matplotlib.pyplot as plt

def jacobian(x):

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

def hessian(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條輪廓線nutyrxh

def newton(x0):

print('初始點為:')

print(x0,'\n')

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

i = 1

imax = 1000

w[:,0] =www.cppcns.com x0

x = x0

delta = 1

alpha = 1

while i10**(-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實現牛頓法求極值

本文位址:

用Python實現牛頓法求極值

對於乙個多元函式f x f x1,x2,xn 用牛頓法求其極小值的迭代格式為 xk 1 x k g 1kgk 其中g x f x 為函式f x 的梯度向量,g x 為函式f x 的hesse hessian 矩陣。上述牛頓法不是全域性收斂的。為此可以引入阻尼牛頓法 又稱帶步長的牛頓法 我們知道,求極...

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...

牛頓法 三維 Python實現

from mpl toolkits.mplot3d import axes3d from matplotlib import pyplot as plt import matplotlib as mpl from numpy import from sympy import symbols,diff...