最优化--牛顿法求解多元函数极值例题(python)
Posted jtwty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最优化--牛顿法求解多元函数极值例题(python)相关的知识,希望对你有一定的参考价值。
一.问题
给定一个函数f(x)=60-10x1-4x2+x12+x22-x1x2,利用牛顿法求解该函数的最小值,需给出中间结果。
二.python代码
import numpy as np
import matplotlib.pyplot as plt
#牛顿法求解f = 60-10*x1-4*x2+x1**2+2*x2**2-x1*x2的极值
#原函数
#建立点的列表并关联起来
X1=np.arange(-50,50,0.1)
X2=np.arange(-50,50,0.1)
[x1,x2]=np.meshgrid(X1,X2)
f = 60-10*x1-4*x2+x1**2+2*x2**2-x1*x2
plt.contour(x1,x2,f,20) # 画出函数的20条轮廓线
#求梯度
def jacobian(x):
return np.array([-10+2*x[0]-x[1],-4+2*x[1]-x[0]])
#求海森矩阵
def hessian(x):
return np.array([[2,-1],[-1,2]])
#牛顿法程序
def newton(x0):
W=np.zeros((2,10**2))
i = 1
imax = 100
W[:,0] = x0
x = x0
delta = 1
alpha = 1
#迭代条件,当迭代次数不少于100次并且精度大于0.1时进行循环
while i<imax and delta>0.1:
#将海森矩阵的逆与梯度相乘
p = -np.dot(np.linalg.inv(hessian(x)),jacobian(x))
x0 = x
x = x + alpha*p
W[:,i] = x
delta = sum((x-x0))
print('第',i,'次迭代结果:')
print(x,'\\n')
i=i+1
W=W[:,0:i] # 记录迭代点
return W
#初始点
x0 = np.array([-40,40])
W = newton(x0)
plt.plot(W[0,:],W[1,:],'g*',W[0,:],W[1,:]) # 画出迭代点收敛的轨迹
plt.show()
三.结果
以上是关于最优化--牛顿法求解多元函数极值例题(python)的主要内容,如果未能解决你的问题,请参考以下文章
什么是牛顿法(Newton methods)?什么是拟牛顿法(Quasi Newton methods)?牛顿法和梯度下降法的区别是什么?