使用Python实现牛顿法求极值


Posted in Python onFebruary 10, 2020

对于一个多元函数 使用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是很相像的。

以上这篇使用Python实现牛顿法求极值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用tornado实现登录和登出
Jul 28 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
浅谈python新式类和旧式类区别
Apr 26 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
python新式类和经典类的区别实例分析
Mar 23 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
python两种注释用法的示例
Oct 09 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 #Python
TensorFlow 多元函数的极值实例
Feb 10 #Python
给 TensorFlow 变量进行赋值的方式
Feb 10 #Python
Python 中的pygame安装与配置教程详解
Feb 10 #Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 #Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 #Python
Python的pygame安装教程详解
Feb 10 #Python
You might like
德生PL550的电路分析
2021/03/02 无线电
文件上传的实现
2006/10/09 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
Python 数据结构之队列的实现
2017/01/22 Python
python中OrderedDict的使用方法详解
2017/05/05 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
Django框架反向解析操作详解
2019/11/28 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
数据库方面面试题
2012/04/22 面试题
介绍一下grep命令的使用
2015/06/12 面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
公务员转正鉴定材料
2014/02/11 职场文书
制作部班长职位说明书
2014/02/26 职场文书
诉前财产保全担保书
2014/05/20 职场文书
机关保密承诺书
2014/06/03 职场文书
体操比赛口号
2014/06/10 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
Django+Celery实现定时任务的示例
2021/06/23 Python
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js