python实现黄金分割搜索算法+动态展示

  • 前言
  • 要求
  • 黄金分割搜索算法原理
  • 伪代码
  • 代码编写
  • 动态结果
  • python代码

前言

数值算法是跟数学关系比较密切的一门课程,主要是用计算机程序实现一些数学公式 和数学算法。我觉得计算机处理数据的方式与数学最大的不同就是它是离散化,虽然计算机处理数据具有一定的误差性,但是由于机器的精度远远大于实际工程中应用的误差,所以用计算机计算出的数值大多数是可以利用的数值。
离散化是计算机设计和算法中一种重要的思想。

要求

用黄金分割搜索算法求cos(x),x∈[-π/2,π/2]的最大值,设计出具体的程序,使之能够动态演示搜索过程。

黄金分割搜索算法原理

设一条线段AB的长度为a,C点在靠近B点的黄金分割点上,且AC为b,则a比b就是黄金数。


以上是计算的过程(来自百度)。
二分之根号五减一就是0.618。给我们一个区间乘以0.618就是他的黄金分割点。
那么咋么利用黄金分割点求单峰最大值呢?
求最大值的题目一般会给一个区间,我们这里是[-π/2,π/2]。想求得其中的最大值,需要在这个区间中选择两个点,计算它们的函数值,使其中的一个点替换边界的一个点,根据内部点选定规则再计算新的内部点,然后不断的计算直至两个内部点计算出的函数值的差小于规定的误差,取这两个函数值的平均就是 我们要求的最大值。
黄金分割 就是在此基础之上定义了两个内部点的选定规则。
在搜索范围[a,b]中选择两点,r1=a+0.382(b-a), r2=a+0.618(b-a)。计算f(a),f(r1),f(r2),f(b)的函数值,为了使下一次计算值接近极值,我们选择用r1或者r2替换a或者b,根据所求最大还是最小情况有所不同,如下图中,f(r2)>f(r1),最小值更靠近f(r1),舍弃b的值,使b=r2,在计算新的r2,如此反复计算,直到误差小于要求值。

(图源:网络)

伪代码

1: Input(a,b,e)
2: x1=a+(b-a)0.382
3: x2=a+(b-a)
0.618
4: f1=f(x1)
5: f2=f(x2)
6: while(b-a)>e{
7: if(f2>f1)
8: a=x1;
9: x1=x2;
10: f1=f2;
11: x2=a+0.618(b-a);
12: f2=f(x2);
13:else
14: b=x2;
15: x2=x1;
16: f2=f1;
17: x1=a+0.382(b-a);
18: f1=f(x1);
19: x max=(a+b)/2;
20: output(xmax)

代码编写

要求是要动态展示搜索过程,我觉得python的图形库还是很好用的就用了python的库matplotlib。用matlab也可以实现。但由于对matlab不是很熟就用了python。
要动态实现就要用animation,这也是python提供好的一个动态展示的方法。但是有一些局限性。
numpy库一般用来进行数据处理。也是很强大的一个库。
想要保存动图还要下载ImageMagick Display

动态结果

python代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animationdef f(x):y=np.cos(x)return y
#创建一个画板和画布
fig, ax = plt.subplots()
x = np.linspace(-np.pi/2, np.pi/2, 200)
y = f(x)
#创建坐标轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
l = ax.plot(x, y)
dot, = ax.plot([], [], 'r.')
xdata, ydata =  [], []#初始化函数
def init():ax.set_xlim(-np.pi/2, np.pi/2)ax.set_ylim(-1, 2)return l
#生成节点函数
def gen_dot():tdata,ldata= [], []xdata=[-np.pi/2, np.pi/2]ydata=f(xdata)ydata=ydata.tolist()a=xdata[0]b=xdata[1]x1=a+0.382*(b-a)x2=a+0.618*(b-a)e=0.0005f1=f(x1)f2=f(x2)xdata.append(x1)xdata.append(x2)ydata.append(f1)ydata.append(f2)while(b-a>e):if(f2>f1):a=x1x1=x2f1=f2x2=a+0.382*(b-a)f2=f(x2)xdata.append(x2)ydata.append(f2)else:b=x2x2=x1f2=f1x1=a+0.618*(b-a)f1=f(x1)xdata.append(x1)ydata.append(f1)l=(a+b)/2xdata.append(l)ydata.append(f(l))print(l)print(f(l))for i in range(len(xdata)):tdata.append(xdata[i])ldata.append(ydata[i])newdot=[tdata,ldata]yield newdotxdata, ydata ,tdata,ldata= [], [], [], []
#更新节点函数
def update_dot(newd):dot.set_data(newd[0], newd[1])return dot,
#生成动态图像的节点
ani = animation.FuncAnimation(fig, update_dot, frames = gen_dot, interval = 1000, init_func=init)
ani.save('sin_dot.gif', writer='imagemagick', fps=30)plt.show()

python实现黄金分割搜索算法+动态展示相关推荐

  1. Python 快速生成 web 动态展示机器学习项目!

    来源丨网络 作者丨wedo实验君 1. Streamlit 一句话,Streamlit是一个可以用python编写web app的库,可以方便的动态展示你的机器学习的项目. 优点 你不需要懂html, ...

  2. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件)

    Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件) 导读 动态演示调用python库的tkinter带你进入GUI世界(Button ...

  3. django jsonresponse_利用 Django 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法! Django 模板渲染 1. 新建一个 Django 项目 命令 ...

  4. python 生成html文件浏览器_Handout库:能将python脚本转化为html展示文件

    有的时候我们需要将python代码进行展示讲解,这个时候使用py文件进行讲解效果并不是最好的.如果能转化为html文件,在浏览器中展示,那就完美了.好消息是存在一个名为handout的库可以实现我们的 ...

  5. 利用 Flask 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀- Flask 模板渲染 1. 新建一个项目fla ...

  6. 干货!Flask 动态展示 Pyecharts 图表数据的几种方法!

    本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀- Flask 模板渲染 1. 新建一个项目fla ...

  7. 利用 Django 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法! Django 模板渲染 1. 新建一个 Django 项目 命令 ...

  8. 快速生成 web app 动态展示机器学习项目

    1. Streamlit 一句话,Streamlit是一个可以用python编写web app的库,可以方便的动态展示你的机器学习的项目. 优点 你不需要懂html, css, js等,纯python ...

  9. 用11行Python代码,实现动态二维码制作

    用11行Python代码,实现动态二维码制作 效果展示 Python实现 素材 其他工具 效果展示 Python实现 要预装myqr模块才行. windows键+R 打开cmd,输入pip insta ...

最新文章

  1. android 启动模式_安卓学习笔记之Android中Activity的4种启动模式
  2. CST 使用注意事项【持续更新】
  3. c盘所有的html文件全删,我将C盘文件夹全删了
  4. Downloader Middlewares反反爬虫【学习笔记04】
  5. VS2010问题汇总
  6. gradle对java插件的扩展_Gradle之java插件入门
  7. [ python ] 多态
  8. css列表大全,CSS中li列表样式汇总大全,全实例展示
  9. 利用opencv作透明重叠人群密度热度图
  10. oracle 数字处理函数,ORACLE 数字型函数
  11. 计算机专业c类大学,【计算机应用技术】专业排名A+、A、B+、B、C类院校分数线...
  12. STM32F4之SDIO接口
  13. 运营商5G商业模式研究
  14. 如何让iPad浏览器不再拒绝访问请求
  15. linux如何测试IP和端口是否能访问
  16. 1命名规则 sentinel_sentinel1 GRD数据和SLC数据预处理有什么区别吗?预处理流程是怎样的?...
  17. [开源工具]2022/2023免费临时邮箱(Temp Free Mail)
  18. 联想造超级计算机,联想将造超级计算机 性能10倍于IBM蓝色基因
  19. hpe服务器装linux,HPE ProLiant 系列服务器Redhat Linux系统下安装SSA CLI及基本命令使用...
  20. 2021年中国互联网行业投融资运行现状及未来发展趋势分析[图]

热门文章

  1. Java借助API输出百分数
  2. Java实现大整数乘法
  3. 数字中台遇到2020双11,又翻车了?
  4. PC端和手机端字体显示不一致的解决办法
  5. Java毕业设计_ 校园志愿者服务管理平台
  6. 【Qt象棋游戏】06_象棋游戏法则
  7. 黑马程序员 一步一步往上爬 学习毕老师java视频的第03,04天
  8. 新安装的微信PC版,退出后聊天记录没了,文件接收失败、错误、打不开,怎么办?
  9. 内推 | 【思迈特-BI工程师】成都 8-10K
  10. OpenWrt/PandoraBox/LEDE做打印服务器连接HP1020问题汇总