Python实现二分法和黄金分割法
运筹学课上,首先介绍了非线性规划算法中的无约束规划算法。二分法和黄金分割法是属于无约束规划算法的一维搜索法中的代表。
二分法:$$x_{1}^{(k+1)}=\frac{1}{2}(x_{R}^{(k)}+x_{L}^{(k)}-\Delta)$$$$x_{2}^{(k+1)}=\frac{1}{2}(x_{R}^{(k)}+x_{L}^{(k)}+\Delta)$$
黄金分割法:$$x_{1}^{(k+1)}=x_{R}^{(k)}-(\frac{\sqrt{5}-1}{2})(x_{R}^{(k)}-x_{L}^{(k)})$$$$x_{2}^{(k+1)}=x_{L}^{(k)}+(\frac{\sqrt{5}-1}{2})(x_{R}^{(k)}-x_{L}^{(k)})$$
选择的$x_{1}^{(k+1)}$和$x_{2}^{(k+1)}$一定满足$$x_{L}^{(k)}<x_{1}^{(k+1)}<x_{2}^{(k+1)}<x_{R}^{(k)}$$
下面确定新的不确定空间$I^{(k+1)}$
情况1:若$f(x_{1}^{(k+1)})>f(x_{2}^{(k+1)})$,则$I^{(k+1)}=\left[x_{L}^{(k)},x_{2}^{(k+1)}\right]$
情况2:若$f(x_{1}^{(k+1)})<f(x_{2}^{(k+1)})$,则$I^{(k+1)}=\left[x_{1}^{(k+1)},x_{R}^{(k)}\right]$
情况3:若$f(x_{1}^{(k+1)})=f(x_{2}^{(k+1)})$,则$I^{(k+1)}=\left[x_{1}^{(k+1)},x_{2}^{(k+1)}\right]$
下面记录下用Python实现二分法和黄金分割法的代码。
二分法:
import math
import numpy as np def anyfunction(x): # 在这里我们定义任意一个指定初始区间内的单峰函数,以x*cos(x)为例
return x*math.cos(x) Low = float(input("Please enter the lowbound: "))
High = float(input("Please enter the highbound: "))
High = np.pi # 在这里我们取初始上界为π,如果可以输入则注释掉这一行
echos = int(input("Please enter the echos: ")) # 迭代次数
small = float(input("Please enter the smallvalue: ")) # 公式中的Delta for i in range(1, echos + 1):
Lowvalue = anyfunction(0.5*(Low + High - small))
Highvalue = anyfunction(0.5*(Low + High + small))
print("echos: " + str(i))
print('before ' + "Lowbound: " + str(0.5*(Low + High - small)) + " Highbound: " + str(0.5*(Low + High + small)))
print('Lowvalue: ' + str(Lowvalue) + ' ' + 'Highvalue: ' + str(Highvalue))
if(Lowvalue == Highvalue):
Low = 0.5*(Low + High - small)
High = 0.5*(Low + High + small)
elif(Lowvalue < Highvalue):
Low = 0.5*(Low + High - small)
else:
High = 0.5*(Low + High + small)
print("Lowbound: " + str(Low) + " Highbound: " + str(High))
输出结果如下:
5次循环后极值点被限制在[0.7828981633974482,0.8907604338221292]内。
黄金分割法:
from math import sqrt, cos
import numpy as np def anyfunction(x): # 同上以函数x*cos(x)为例
return x*cos(x) Low = float(input("Please enter the lowbound: "))
High = float(input("Please enter the highbound: "))
High = np.pi # 同上,使用时应该注释掉
echos = int(input("Please enter the echos: ")) # 初始化,第一次运算不存在运算简化
uniquevalue = ((sqrt(5)-1)/2)*(High-Low)
value1 = anyfunction(High - uniquevalue)
value2 = anyfunction(Low + uniquevalue) for i in range(1, echos + 1):
print("echos: " + str(i))
print('before ' + "Lowbound: " + str(High - uniquevalue) + " Highbound: " + str(Low + uniquevalue))
print('value1: ' + str(value1) + ' ' + 'value2: ' + str(value2))
# 利用黄金分割法的性质减少一半的运算量
if(value1 == value2):
Low = High - uniquevalue
High = Low + uniquevalue
uniquevalue = ((sqrt(5)-1)/2)*(High-Low)
value1 = anyfunction(High - uniquevalue)
value2 = anyfunction(Low + uniquevalue)
elif(value1 < value2):
Low = High - uniquevalue
uniquevalue = ((sqrt(5)-1)/2)*(High-Low)
value1 = value2
value2 = anyfunction(Low + uniquevalue)
else:
High = Low + uniquevalue
uniquevalue = ((sqrt(5)-1)/2)*(High-Low)
value2 = value1
value1 = anyfunction(High - uniquevalue)
print("Lowbound: " + str(Low) + " Highbound: " + str(High))
输出结果如下:
5次循环后极值点被限制在[0.7416294238611398,1.0249066567190932]
Python实现二分法和黄金分割法的更多相关文章
- 利用python实现二分法和斐波那契序列
利用python实现二分法:我的实现思路如下 1.判断要查找的值是否大于最大值,如果大于则直接返回False 2.判断要查找的值是否小于最小值,如果小于则直接返回False 3.如果要查找的值在最大值 ...
- 二分法和牛顿迭代实现开根号函数:OC的实现
最近有人贴出BAT的面试题,题目链接. 就是实现系统的开根号的操作,并且要求一定的误差,其实这类题就是两种方法,二分法和牛顿迭代,现在用OC的方法实现如下: 第一:二分法实现 -(double)sqr ...
- 一些Python的惯用法和小技巧:Pythonic
Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ...
- Todd's Matlab讲义第5讲:二分法和找根
二分法和if ... else ... end 语句 先回顾一下二分法.要求方程\(f(x)=0\)的根.假设\(c = f(a) < 0\)和\(d = f(b) > 0\),如果\(f ...
- Python实现二分查找
老生常谈的算法了. #!/usr/bin/python # -*- coding:utf-8 -*- # Filename: demo.py # 用python实现二分查找 def binarySea ...
- python实现二分查找算法
二分查找算法也成为折半算法,对数搜索算法,一会中在有序数组中查找特定一个元素的搜索算法.搜索过程是从数组中间元素开始的 如果中间元素正好是要查找的元素,则搜索过程结束:如果查找的数大于中间数,则在数组 ...
- python关于二分查找
楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...
- Python递归函数,二分查找算法
目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...
- Python 实现二分查找(递归版)
二分查找 为什么使用二分查找: python中的列表,一般取值为遍历这个列表,直到取到你想要的值,但是如果你的列表是一个有着百万元素的列表呢,那样for循环遍历列表就会很慢,可能会循环几十万次,才能找 ...
随机推荐
- Freemarker + iTextRender 实现根据模板网页生成PDF
#0 背景 工作需要实现导出PDF的功能,在进行简单调研后,我决定采用Freemarker + iTextRender进行实现. 基本思路如下: Freemarker实现根据动态数据渲染出需要导出的H ...
- ExtJS动态隐藏Panel中按钮
1.直接隐藏 在bbar的按钮中直接加属性:hidden : true 属性,可隐藏:disabled : true 属性,可禁用 在columns列中直接加属性:hidden : true 属性,可 ...
- 如何在ARM上运行k3s? 窥探k3s启动过程!,内附容器多平台包构建
开始之前 最近在对华为云鲲鹏服务器(一种ARM服务器arm64)运行容器可行性做验证,顺便了解了很多ARM和容器相关的知识.一提到arm运行容器首先想到的是k3s,下面是用k3s快速搭建一个kuber ...
- 第三篇-用Flutter手撸一个抖音国内版,看看有多炫
前言 前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成& 另 ...
- MANIFEST.MF是个什么?
MANIFEST.MF是个什么? 写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot 如何只有Main方法就可以运行的? Springboot项目打包 ...
- 安卓全屏或沉浸式状态栏下输入框(EditText)被键盘遮挡解决方法
沉浸式状态栏用了一段时间了,一直没发现安卓在这方面的坑.最近在集成环信自定义UI的过程中,发现将环信界面设置为沉浸式之后最底部的消息输入框不随键盘弹起而变化了,一直显示在屏幕最下方,体验非常差. 后来 ...
- python通用数据库操作工具 pydbclib
pydbclib是一个通用的python关系型数据库操作工具包,使用统一的接口操作各种关系型数据库(如 oracle.mysql.postgres.hive.impala等)进行增删改查,它是对各个p ...
- seo网站优化收录过少的病因分析-智狐seo顾问
seo网站优化收录过少的病因分析 很多网站优化人员都了解,一个网站收录的重要性,企业网站要想可以在百度中占据一个良好的排名,获取的权重更高,那么网站收录自然就上去了,很多站长们在操作的过程中就会出现不 ...
- Beta冲刺 —— 6.1
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.讨论并解决每个人存在的问 ...
- Rocket - tilelink - AtomicAutomata
https://mp.weixin.qq.com/s/O7VTHqpCFNJQi3EpucXkIw 简单介绍AtomicAutomata的实现.(细节问题太多,恕不完全表述.) 1. ...