python牛顿法寻找极值_使用Python实现牛顿法求极值
对于一个多元函数
用牛顿法求其极小值的迭代格式为
其中
为函数
的梯度向量,
为函数
的Hesse(Hessian)矩阵。
上述牛顿法不是全局收敛的。为此可以引入阻尼牛顿法(又称带步长的牛顿法)。
我们知道,求极值的一般迭代格式为
其中
为搜索步长,
为搜索方向(注意所有的迭代格式都是先计算搜索方向,再计算搜索步长,如同瞎子下山一样,先找到哪个方向可行下降,再决定下几步)。
取下降方向
即得阻尼牛顿法,只不过搜索步长
不确定,需要用线性搜索技术确定一个较优的值,比如精确线性搜索或者Goldstein搜索、Wolfe搜索等。特别地,当
一直取为常数1时,就是普通的牛顿法。
以Rosenbrock函数为例,即有
于是可得函数的梯度
函数
的Hesse矩阵为
编写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 i10**(-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实现牛顿法求极值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
时间: 2020-02-08
python牛顿法寻找极值_使用Python实现牛顿法求极值相关推荐
- python牛顿法寻找极值_【Python讲优化】S06E10 利用牛顿法求多元函数的极值
这一讲里,我们进入到多元函数求极值的最后一部分,即牛顿法的内容中. 在前面的两讲内容里,我们所介绍的梯度下降法和最速下降法都只用到了目标函数的一阶导数(也就是梯度)来确定每一次迭代的搜索方向,因此也可 ...
- python迭代法求极值_用Python实现最速下降法求极值的方法
对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...
- python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础
本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...
- python程序设计教材浅显易懂_这些python自学技巧,你不会?
python自学,其实很简单. 其实python非常适合初学者入门.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方模块,免去了很多"重复造轮子& ...
- python 客户端应用程序_创建python Web服务和C#客户端应用程序的最佳方法 - c#
我正在寻找一种简单可靠的方法来创建Python Web Service并从.Net(c#)应用程序中使用它. 我发现了很多不同的库,其中一个库比另一个库好,但是似乎没有人提供关于Python Web ...
- python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议
<Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: <Python之禅>中对于Pyt ...
- python画交互式地图_使用Python构建交互式地图-入门指南
python画交互式地图 Welcome to The Beginner's Guide to Building Interactive Maps in Python 欢迎使用Python构建交互式地 ...
- python出现的意义_[转]Python中下划线以及命名空间的意义
Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public 2. __object__ # special, python system ...
- python初学者教程下载_初学者Python教程
python初学者教程下载 Welcome to Python Tutorial for Beginners. You are probably here because you think prog ...
- python语法元素测试_基于python全局设置id 自动化测试元素定位过程解析
背景: 在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位. 一.python准备工作: 功能:用自动化的方式进行批量处理. 比如,你想 ...
最新文章
- 读书笔记——javascript闭包
- 面试程序员总结的通病!
- 两个月计算机考研数学,管综数学考前两个月让你事半功倍的方法
- Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
- MongoDB 自动删除集合中过期的数据——TTL索引
- python2转python3代码_2to3 - 自动将 Python 2 代码转为 Python 3 代码
- strcpy函数的C/C++实现
- 如何在Windows上安装多个MySQL
- C#中winform怎么在线预览PDF,预览网上的PDF控件!不用安装Adobe PDF Reader等等其他,方案记录
- SQL数据库恢复挂起
- 两样本非参数统计常用方法对比 R语言实现
- 软件工程2 需求获取
- 驱动单片机硬件调试器的一些开源库总结(包含stlink调试器)
- ffmepg处理10bit 和8bit yuv总结
- kent beck_肯特·沙基(Kent Sharkey)身着“ heezy fo'sheezy babay”!
- 最受程序员欢迎的深度学习框架出新版啦(文末留言赠书)
- Altium Designer的PCB无法显示Designator
- SVG标准解读-几何图形-图案填充-核心要点
- java怎么清空paint所画图案,[求助]怎么样消除之前画过的轨迹
- Python----------列表操作