使用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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Python过滤函数filter()使用自定义函数过滤序列实例
Aug 26 Python
python解决网站的反爬虫策略总结
Oct 26 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
Python编写一个优美的下载器
Apr 15 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 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
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
关于Intype一些小问题的解决办法
2008/03/28 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
jQuery 无刷新分页实例代码
2013/11/12 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
Python实现的RSS阅读器实例
2015/07/25 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
Python装饰器用法实例分析
2019/01/14 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
C#基础面试题
2016/10/17 面试题
业务员简历自我评价
2014/03/06 职场文书
Python 键盘事件详解
2021/11/11 Python