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

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

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. python好吗-Python现在就业前景好吗?
  2. Oracle起步——Oracle 11g安装配置
  3. 构建通用类型- 继承 VS 聚合
  4. 需要gmail的朋友请留下你们的email,还有86个
  5. 计算机游戏攻略67,保卫萝卜2 67攻略水晶萝卜详解
  6. 口译务实——unit10 II
  7. Ubuntu 问题合集
  8. Android Bitmap缓存池使用详解
  9. List 与 Map的常用方法
  10. 怎样用计算机绘制幂函数图像,几何画板如何画幂函数的图像
  11. Linux上的oracle11g安装(提供安装包链接)以及其他问题注解
  12. doe五步法_DOE系列--试验设计(DOE)五部曲
  13. php 检测是否有jmail,asp空间判断jmail组件是否安装或支持的代码
  14. centos安装宝塔跳过绑定手机号
  15. 第三方登陆--狸菇凉_
  16. 软件项目管理期末复习整理
  17. 电瓶车.换电瓶(20181122)
  18. java获取钉钉登录信息,JAVA maven项目使用钉钉SDK获取token、用户
  19. 2023年2月京东手机品牌销量数据查询(京东电商数据平台)
  20. python用户输入错误重新输入_Python输错4次用户名密码需要输入验证码

热门文章

  1. 用特征码秒杀各程序语言按钮事件
  2. gh0st源码分析与远控的编写(三)
  3. 今年你参与开源了吗?
  4. 极客精神|自制机械臂!被任正非表扬的华为天才少年
  5. 【今晚9点】:对话袁荣喜——一名C程序员的打怪之路
  6. 火山引擎视频云:坚持基础技术创新,打造极致用户体验
  7. SVT-AV1:开源编解码最新进展
  8. LiveVideoStackCon深圳-发掘移动客户端更多可能
  9. AVS3关键技术、性能和复杂度分析
  10. IPv6下CDN和网络的最佳实践