原理什么的就不说了,只有代码。。。

十元二次目标函数,求极小值点。

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博客_最速下降法python​blog.csdn.net

python拟牛顿法迭代点绘制_最速下降法、牛顿法、拟牛顿法,Python实现高维二次目标函数优化...相关推荐

  1. python拟牛顿法迭代点绘制_拟牛顿法python

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. python科学计算教程视频_【P14】Python科学计算与图形渲染库视频课程视频教程 it教程...

    Python视频教程名称: Python科学计算与图形渲染库视频课程视频教程 Python视频教程 [IT视频教程网-www.itspjc.com] it教程 6 T6 ^9 L+ E4 C, }0 ...

  3. 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?

    学软件开发的都知道实战项目对于学好一门语言是很重要的.在这里可以向大家推荐几个Python实战项目 项目1.Python 图片转字符画 本课程用 50 行 Python 代码完成图片转字符画小工具.通 ...

  4. python制作一个教学网站_小白如何入门Python? 制作一个网站为例

    首先最重要的问题是为什么要学习python?这个问题这个将指导你如何学习Python和学习的方式. 以你最终想制作一个网站为例.从一个通用的学习资源列表开始不仅会消磨你的激情,而且你获得的知识很难应用 ...

  5. python金融工程的工具包_金融工程及其Python应用

    目 录 第1章 金融工程导论 1 1.1 金融工程的概念 2 1.2 国外现代主流金融理论发展历程 2 1.3 国内金融的发展 3 1.4 现代主流金融理论简介 4 1.4.1 投资组合理论 4 1. ...

  6. python编程思维导图_用来梳理 Python 编程核心知识15张思维导图

    原标题:用来梳理 Python 编程核心知识15张思维导图 小编这次在逛论坛的时候,无意中发现了一份python的武功秘籍,也就是一份思维导图,堪称业界经典! 思维导图可以有力地激发你的联想,通过一个 ...

  7. python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  8. python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程

    本发明涉及EDA开发的技术领域,尤其是指一种基于Python语言的EDA开发平台及其使用方法. 背景技术: 目前,主流的EDA设计语言Verilog HDL能实现完整的芯片硬件逻辑电路开发,但是其代码 ...

  9. python能开发什么产品_三周学 Python ?不,三周做个产品

    我的同事在看到毫无开发经验的我用三周时间,不但从零基础用上了 Python,还做出了一个客户关系管理系统,强烈邀请我分享经验.惶恐,因为我并没有出色的智商,也没有觉得三周学 Python 是一个体现自 ...

最新文章

  1. 【camera】基于YOLO的车辆多维特征识别系统(车色,车品牌,车标,车型)与PYQT实现(课程设计)
  2. cuda cudnn pytorch版本对应关系
  3. Java学习总结:53(单对象保存父接口:Collection)
  4. ICLR2020 NLP优秀论文分享(附源码)
  5. ffmpeg文件拼接
  6. C++ dll 动态链接库的创建与调用
  7. 3ds Max制作客厅场景实例教程
  8. 【机器学习基础】一文归纳AI调参炼丹之法
  9. Android Studio 约束布局[ConstraintLayout]
  10. vue上传文件php,php文件上传 – 前端开发,JQUERY特效,全栈开发,vue开发
  11. C# WPF MVVM模式Prism框架下事件发布与订阅
  12. 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN
  13. 通过printf从目标板到调试器的输出
  14. 【python零基础入门学习】Python入门,带你快速学习,Python 环境搭建
  15. 来啊,一起造作啊!10月仍然还有十多场新品发布会...
  16. PHP+MySQL实现读写分离
  17. 【优化求解】基于matlab NSGA2算法多技能员工调度优化模型【含Matlab源码 1775期】
  18. 黑客(一):黑客守则
  19. android升级mcu升级,车载mcu需要升级吗_车载mcu升级有什么用
  20. 微信开发者工具整个是个浏览器

热门文章

  1. 逆向工程核心原理学习笔记(七):总结
  2. 【网络编程】之二、socket API学习
  3. python实现栈,实现push(),pop(),top(),getMin()方法
  4. 经典面试|为何Kafka这么快?
  5. 【线上分享】安防视频上云趋势、痛点,华为云视频接入服务探索及实践
  6. 音视频技术开发周刊 | 174
  7. 移动端视频缓存保障与CDN调度优化
  8. 设计模式C++实现(5)——原型模式
  9. zookeeper常见问题总结
  10. ffmpeg源码学习之time_base