python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...
原理什么的就不说了,只有代码。。。
十元二次目标函数,求极小值点。
1.最速下降法
import random
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
def goldsteinsearch(f, df, d, x, alpham, rho, t):
flag = 0
a = 0
b = alpham
fk = f(x)
gk = df(x)
phi0 = fk
dphi0 = np.dot(gk, d)
alpha = b * random.uniform(0, 1)
while (flag == 0):
newfk = f(x + alpha * d)
phi = newfk
# print(phi,phi0,rho,alpha ,dphi0)
if (phi - phi0) <= (rho * alpha * dphi0):
if (phi - phi0) >= ((1 - rho) * alpha * dphi0):
flag = 1
else:
a = alpha
b = b
if (b < alpham):
alpha = (a + b) / 2
else:
alpha = t * alpha
else:
a = a
b = alpha
alpha = (a + b) / 2
return alpha
def steepest(fun, gfun,x0):
c = 0.00001
imax = 100
i = 1
x = x0
grad = gfun(x)
delta = sum(grad**2)
while i < imax and delta > c:
p = -gfun(x)
alpha = goldsteinsearch(fun, gfun, p, x, 1, 0.1, 2)
x = x + alpha * p
print(i, np.array((i, delta)))
grad = gfun(x)
delta = sum(grad**2)
i = i + 1
return x, fun(x), i, delta
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导数
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
steepest(fun, gfun,x0)
output = steepest(fun, gfun,x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
2.牛顿法
import random
import numpy as np
import matplotlib.pyplot as plt
def dampnm(fun, gfun, hess, x0):
maxk = 500
rho = 0.55
sigma = 0.4
k = 0
delta = 1e-5
_delta=delta
while k < maxk:
gk = gfun(x0)
Gk = hess(x0)
dk = -1.0 * np.linalg.solve(Gk, gk)
print(k, np.linalg.norm(dk))
if np.linalg.norm(dk) < delta:
_delta = np.linalg.norm(dk)
break
x0 += dk
k += 1
return x0, fun(x0), k,_delta
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导数
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
#二阶导数,也就是海森矩阵,幂次只有二次,所有二阶导是常数
hess = lambda x: np.array([[2, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 2, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 2]])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
output=dampnm(fun, gfun, hess, x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
3.拟牛顿法
import numpy as np
def bfgs(fun,gfun,x0):#这里只写出了bfgs的实现
maxk = 1e5
rho = 0.55
sigma = 0.4
epsilon = 1e-5
k = 0
n = np.shape(x0)[0]
Bk = np.eye(n)#np.linalg.inv(hess(x0))
_epsilon=epsilon
while k < maxk:
gk = gfun(x0)
print(k,np.linalg.norm(gk))
if np.linalg.norm(gk) < epsilon:
_epsilon=np.linalg.norm(gk)
break
dk = -1.0*np.linalg.solve(Bk,gk)
m = 0
mk = 0
while m < 20:
if fun(x0+rho**m*dk) < fun(x0)+sigma*rho**m*np.dot(gk,dk):
mk = m
break
m += 1
#BFGS
x = x0 + rho**mk*dk
sk = x - x0
yk = gfun(x) - gk
if np.dot(sk,yk) > 0:
Bs = np.dot(Bk,sk)
ys = np.dot(yk,sk)
sBs = np.dot(np.dot(sk,Bk),sk)
Bk = Bk - 1.0*Bs.reshape((n,1))*Bs/sBs + 1.0*yk.reshape((n,1))*yk/ys
k += 1
x0 = x
return x0,fun(x0),k,_epsilon#
#目标函数
fun = lambda x: (x[0]-1)**2+(x[1]-1)**2+(x[2]-2)**2+(x[3]-3)**2+(x[4]-4)**2+(x[5]-5)**2+(x[6]-6)**2+(x[7]-7)**2+(x[8]-8)**2+(x[9]-9)**2+x[0]*x[1]+x[2]*x[3]+x[4]*x[5]+x[6]*x[7]+x[8]*x[9]
#一阶导
gfun = lambda x: np.array([2*x[0] + x[1] - 2, x[0] + 2*x[1] - 2, 2*x[2] + x[3] - 4, x[2] + 2*x[3] - 6, 2*x[4] + x[5] - 8, x[4] + 2*x[5] - 10, 2*x[6] + x[7] - 12, x[6] + 2*x[7] - 14, 2*x[8] + x[9] - 16, x[8] + 2*x[9] - 18])
if __name__ == "__main__":
x0 = np.array([1.0,1.0,1.0,3.0,1.0,3.0,1.0,1.0,2.0,3.0])
output=bfgs(fun, gfun, x0)
print ("迭代次数:" output [2])
print ("近似最优解:" output [0])
print ("函数极小值点:" output [1])
print ("最终迭代误差:" output [3])
这里是同一个目标函数在三种方法下的结果:近似最优解极小值迭代次数最终误差
最速下降法[0.66665596 0.66665596 0.66665596 2.66665596 2.00003211 4.00003211 3.33440243 5.33247832 4.66724938 6.66628733]92.666 66 7892774127.0733410524
04242e-06
牛顿法[0.66666667 0.66666667 0.66666667 2.66666667 2. 4. 3.33333333 5.33333333 4.66666667 6.66666667]92.6666666666666710
拟牛顿法[0.66666652 0.66666652 0.66666652 2.66666652 2.00000043 4.00000043 3.33333781 5.33333172 4.66666955 6.6666665 ]92.6666666666905739.86253776
2278836e-06
如果不考虑计算二阶导的支出,牛顿法还是比较生猛的。
完了-´•ᴥ•`。
如有兴趣,可参考博客:最速下降法(梯度下降法)python实现_Big_Pai的博客-CSDN博客_最速下降法pythonblog.csdn.net
python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...相关推荐
- python拟牛顿法迭代点绘制_拟牛顿法python
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python科学计算教程视频_【P14】Python科学计算与图形渲染库视频课程视频教程 it教程...
Python视频教程名称: Python科学计算与图形渲染库视频课程视频教程 Python视频教程 [IT视频教程网-www.itspjc.com] it教程 6 T6 ^9 L+ E4 C, }0 ...
- 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
学软件开发的都知道实战项目对于学好一门语言是很重要的.在这里可以向大家推荐几个Python实战项目 项目1.Python 图片转字符画 本课程用 50 行 Python 代码完成图片转字符画小工具.通 ...
- python制作一个教学网站_小白如何入门Python? 制作一个网站为例
首先最重要的问题是为什么要学习python?这个问题这个将指导你如何学习Python和学习的方式. 以你最终想制作一个网站为例.从一个通用的学习资源列表开始不仅会消磨你的激情,而且你获得的知识很难应用 ...
- python金融工程的工具包_金融工程及其Python应用
目 录 第1章 金融工程导论 1 1.1 金融工程的概念 2 1.2 国外现代主流金融理论发展历程 2 1.3 国内金融的发展 3 1.4 现代主流金融理论简介 4 1.4.1 投资组合理论 4 1. ...
- python编程思维导图_用来梳理 Python 编程核心知识15张思维导图
原标题:用来梳理 Python 编程核心知识15张思维导图 小编这次在逛论坛的时候,无意中发现了一份python的武功秘籍,也就是一份思维导图,堪称业界经典! 思维导图可以有力地激发你的联想,通过一个 ...
- python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程
本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...
- python能开发什么产品_三周学 Python ?不,三周做个产品
我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验.惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自 ...
最新文章
- python好吗-Python现在就业前景好吗?
- Oracle起步——Oracle 11g安装配置
- 构建通用类型- 继承 VS 聚合
- 需要gmail的朋友请留下你们的email,还有86个
- 计算机游戏攻略67,保卫萝卜2 67攻略水晶萝卜详解
- 口译务实——unit10 II
- Ubuntu 问题合集
- Android Bitmap缓存池使用详解
- List 与 Map的常用方法
- 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像
- Linux上的oracle11g安装(提供安装包链接)以及其他问题注解
- doe五步法_DOE系列--试验设计(DOE)五部曲
- php 检测是否有jmail,asp空间判断jmail组件是否安装或支持的代码
- centos安装宝塔跳过绑定手机号
- 第三方登陆--狸菇凉_
- 软件项目管理期末复习整理
- 电瓶车.换电瓶(20181122)
- java获取钉钉登录信息,JAVA maven项目使用钉钉SDK获取token、用户
- 2023年2月京东手机品牌销量数据查询(京东电商数据平台)
- python用户输入错误重新输入_Python输错4次用户名密码需要输入验证码