對於乙個多元函式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...