运筹学课上,首先介绍了非线性规划算法中的无约束规划算法。二分法和黄金分割法是属于无约束规划算法的一维搜索法中的代表。

  二分法:$$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实现二分法和黄金分割法的更多相关文章

  1. 利用python实现二分法和斐波那契序列

    利用python实现二分法:我的实现思路如下 1.判断要查找的值是否大于最大值,如果大于则直接返回False 2.判断要查找的值是否小于最小值,如果小于则直接返回False 3.如果要查找的值在最大值 ...

  2. 二分法和牛顿迭代实现开根号函数:OC的实现

    最近有人贴出BAT的面试题,题目链接. 就是实现系统的开根号的操作,并且要求一定的误差,其实这类题就是两种方法,二分法和牛顿迭代,现在用OC的方法实现如下: 第一:二分法实现 -(double)sqr ...

  3. 一些Python的惯用法和小技巧:Pythonic

    Pythonic其实是个模糊的含义,没有确定的解释.网上也没有过多关于Pythonic的说明,我个人的理解是更加Python,更符合Python的行为习惯.本文主要是说明一些Python的惯用法和小技 ...

  4. Todd's Matlab讲义第5讲:二分法和找根

    二分法和if ... else ... end 语句 先回顾一下二分法.要求方程\(f(x)=0\)的根.假设\(c = f(a) < 0\)和\(d = f(b) > 0\),如果\(f ...

  5. Python实现二分查找

    老生常谈的算法了. #!/usr/bin/python # -*- coding:utf-8 -*- # Filename: demo.py # 用python实现二分查找 def binarySea ...

  6. python实现二分查找算法

    二分查找算法也成为折半算法,对数搜索算法,一会中在有序数组中查找特定一个元素的搜索算法.搜索过程是从数组中间元素开始的 如果中间元素正好是要查找的元素,则搜索过程结束:如果查找的数大于中间数,则在数组 ...

  7. python关于二分查找

    楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...

  8. Python递归函数,二分查找算法

    目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...

  9. Python 实现二分查找(递归版)

    二分查找 为什么使用二分查找: python中的列表,一般取值为遍历这个列表,直到取到你想要的值,但是如果你的列表是一个有着百万元素的列表呢,那样for循环遍历列表就会很慢,可能会循环几十万次,才能找 ...

随机推荐

  1. scipy.sparse的一些整理

    一.scipy.sparse中七种稀疏矩阵类型 1.bsr_matrix:分块压缩稀疏行格式 介绍 BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引, ...

  2. 【Java】几种典型的内存溢出案例,都在这儿了!

    写在前面 作为程序员,多多少少都会遇到一些内存溢出的场景,如果你还没遇到,说明你工作的年限可能比较短,或者你根本就是个假程序员!哈哈,开个玩笑.今天,我们就以Java代码的方式来列举几个典型的内存溢出 ...

  3. 手机端页面访问PC页面自动跳手机端代码

    <script> var mobileAgent = new Array("iphone", "ipod", "ipad", & ...

  4. var、let、const三者的区别

    var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问. const用来定义常量,使用时必须初始化(即必须赋值),只能 ...

  5. 0521Day03命名规范 Data函数 可变长参数 枚举类型

    [重点] 命名规范 枚举类型 Date函数 可变长参数 pirnt,println 命名规范 1. 驼峰命名法:main,username,setUsername 用于变量.方法的命名 2. Pasc ...

  6. [256个管理学理论]006.刺猬效应(Hedgehog Effect)

    刺猬效应(Hedgehog Effect) 来自于大洋彼岸的让你看不懂的解释: 刺猬效应(刺猬法则)就是人际交往中的“心理距离效应”.人与人之间都应该保持这条底线,过犹不及. 刺猬效应强调的就是人际交 ...

  7. [Objective-C] 017_UI篇_UIView(中)

    在上篇我们简单讲了UIView的坐标与几何结构,这篇我们来实战UIView一下.UIView在App中有着绝对重要的地位,因为可视化控件几乎都是UIView的子类.在App负责渲染区域的内容,并且响应 ...

  8. 搭建SpringCloud微服务框架:一、结构和各个组件

    搭建微服务框架(结构和各个组件) 简介 SQuid是基于Spring,SpringBoot,使用了SpringCloud下的组件进行构建,目的是想搭建一套可以快速开发部署,并且很好上手的一套微服务框架 ...

  9. 【Storm】核心组件nimbus、supervisor、worker、executor、task

    nimbus 是整个集群的控管核心,负责topology的提交.运行状态监控.任务重新分配等工作. zk就是一个管理者,监控者. 总体描述:nimbus下命令(分配任务),zk监督执行(心跳监控wor ...

  10. css定位和css3的基本

    定位方式:position需要搭配left|right |top |bottom 1.相对定位:相对于自身的位置进行偏移position: relative; 2.绝对定位:相对于有position属 ...