使用Python实现牛顿法求极值

作者:lxy孙悟空 时间:2021-10-14 15:10:21 

对于一个多元函数 使用Python实现牛顿法求极值 用牛顿法求其极小值的迭代格式为

使用Python实现牛顿法求极值

其中 使用Python实现牛顿法求极值 为函数 使用Python实现牛顿法求极值 的梯度向量, 使用Python实现牛顿法求极值 为函数 使用Python实现牛顿法求极值 的Hesse(Hessian)矩阵。

上述牛顿法不是全局收敛的。为此可以引入阻尼牛顿法(又称带步长的牛顿法)。

我们知道,求极值的一般迭代格式为

使用Python实现牛顿法求极值

其中 使用Python实现牛顿法求极值 为搜索步长,使用Python实现牛顿法求极值 为搜索方向(注意所有的迭代格式都是先计算搜索方向,再计算搜索步长,如同瞎子下山一样,先找到哪个方向可行下降,再决定下几步)。

取下降方向 使用Python实现牛顿法求极值 即得阻尼牛顿法,只不过搜索步长 使用Python实现牛顿法求极值 不确定,需要用线性搜索技术确定一个较优的值,比如精确线性搜索或者Goldstein搜索、Wolfe搜索等。特别地,当 使用Python实现牛顿法求极值 一直取为常数1时,就是普通的牛顿法。

以Rosenbrock函数为例,即有

使用Python实现牛顿法求极值

于是可得函数的梯度

使用Python实现牛顿法求极值

函数使用Python实现牛顿法求极值 的Hesse矩阵为

使用Python实现牛顿法求极值

编写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

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条轮廓线

def newton(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 i<imax and 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实现牛顿法求极值

由于主要使用了Python的Numpy模块来进行计算,可以看出,代码和最终的图与Matlab是很相像的。

来源:https://blog.csdn.net/u012705410/article/details/47209007

标签:Python,牛顿法,极值
0
投稿

猜你喜欢

  • 详解如何用Python登录豆瓣并爬取影评

    2021-09-08 00:10:10
  • Python实现图像尺寸和格式转换处理的示例详解

    2021-02-17 06:33:10
  • python dict remove数组删除(del,pop)

    2022-11-17 05:24:03
  • 跨浏览器让javascript文件携带图片数据

    2011-03-31 17:12:00
  • 全面阐述overflow:hidden属性

    2008-08-18 13:30:00
  • Django框架反向解析操作详解

    2023-12-31 03:06:49
  • python strip()函数 介绍

    2023-06-15 11:59:47
  • Python利用openpyxl库遍历Sheet的实例

    2023-10-20 20:19:01
  • 兼容 IE,Firefox 的图片自动缩放 CSS

    2011-09-27 13:36:58
  • Python使用Appium在移动端抓取微博数据的实现

    2022-11-27 20:30:40
  • php-fpm报502问题的解决办法

    2023-10-12 04:12:23
  • 解决pyshp UnicodeDecodeError的问题

    2021-08-01 10:17:39
  • Pygame实战练习之飞机大战游戏

    2021-01-13 13:11:25
  • 从数据行入手保护SQL Server数据安全

    2009-04-13 10:28:00
  • php中strtotime函数性能分析

    2023-11-22 13:21:05
  • 在子页中隐藏模板页中的div示例代码

    2023-07-23 12:12:28
  • php session 检测和注销

    2023-11-17 22:45:02
  • 部署Django到阿里云服务器教程示例

    2022-03-28 23:46:19
  • 惰性函数定义模式

    2007-09-26 20:56:00
  • pytorch中forwod函数在父类中的调用方式解读

    2023-04-27 11:12:25
  • asp之家 网络编程 m.aspxhome.com