最优化方法Python计算:连续函数的单峰区间计算

news/2024/11/24 11:09:34/

我们知道,闭区间上的一元连续函数必在区间上取得最大值和最小值。实践中我们需要能数值地确定含有 f ( x ) f(x) f(x)的唯一最优解 x 0 x_0 x0的区间 [ a , b ] [a,b] [a,b]。这里介绍寻求连续函数 f ( x ) f(x) f(x)在一点 x ∗ x^* x附近单峰区间的包围算法及其Python实现。
算法的思想是从 x ∗ x^* x开始沿着 f ( x ) f(x) f(x)下降的方向逐步探索,直至第一次遇到上升:
(1)设定初始步长 s s s和缩放系数 λ \lambda λ
(2)设定 a , c a,c a,c x ∗ x^* x x ∗ + s x^*+s x+s,并确保 f ( a ) > f ( c ) f(a)>f(c) f(a)>f(c)。必要时需调整搜索方向;
(3)取 b b b c + s c+s c+s。比较 f ( c ) f(c) f(c) f ( b ) f(b) f(b),若 f ( c ) < f ( b ) f(c)<f(b) f(c)<f(b),意味着 f ( a ) > f ( c ) < f ( b ) f(a)>f(c)<f(b) f(a)>f(c)<f(b),即可断定 x 0 ∈ ( a , b ) x_0\in(a,b) x0(a,b) ( a , b ) (a,b) (a,b)即为所求;
(4)否则,令 a a a c c c c c c b b b,并调整步长 s s s λ × s \lambda\times s λ×s,转(3)。
在这里插入图片描述
通常,将步长 s s s初始化为 ∣ s ∣ = 0.01 |s|=0.01 s=0.01 λ \lambda λ初始化为2。当 s s s初始化为正数时,首次探索自左向右。反之, s s s取负数初始值则首次探索自右向左。上图给出了一个按此思想探寻包围函数 f ( x ) f(x) f(x)极小值点的区间 ( a , b ) (a,b) (a,b)的实例。初始时,步长 s < 0 s<0 s<0,以起始点 x ∗ x^* x a a a c = a + s < a c=a+s<a c=a+s<a位于 a a a的左边。如图中(a)所示。由于 x ∗ x^* x位于 f ( x ) f(x) f(x)的下降区间,故 f ( c ) > f ( a ) f(c)>f(a) f(c)>f(a)。交换 a a a c c c,如图中(b)所示。令 s = − s s=-s s=s为下降方向,则此后 s > 0 s>0 s>0。取 b = c + s b=c+s b=c+s,如图中(c )所示。由于 f ( b ) < f ( c ) f(b)<f(c) f(b)<f(c),故将 a a a置为 c c c c c c置为 b b b,如图中(d)所示。将步长扩大 s = λ s s=\lambda s s=λs,并置 b = c + s b=c+s b=c+s,由于 f ( b ) f(b) f(b)仍然小于 f ( c ) f(c) f(c)(见图中(e)),故再次将 a a a c c c移至 c c c b b b,扩大步长 s s s λ s \lambda s λs并置 b = c + s b=c+s b=c+s。此时, f ( a ) > f ( c ) < f ( b ) f(a)>f(c)<f(b) f(a)>f(c)<f(b),见图中(f)。可见 f ( x ) f(x) f(x)的极小值点被区间 ( a , b ) (a,b) (a,b)所包围,即 f ( x ) f(x) f(x) ( a , b ) (a,b) (a,b)为一单峰函数。故 ( a , b ) (a,b) (a,b)即为所求。
下列代码实现算法。

def myBracket(f,xstar,s=1e-2,lamd=2):a=xstar					#a初始化为xstarya=f(a)c=a+s					#c初始化为a+syc=f(c)if yc>ya:				#s为上升方向a,c=c,a				#交换a,cya,yc=yc,yas=-s					#调整s为下降方向b=c+s					#b置为c+syb=f(b)while yb<=yc:			#b同a、c处于同一下降区间a,ya=c,yc				#a置为cc,yc=b,yb				#c置为bs*=lamd				#扩大步长sb=c+s					#重置b为c+syb=f(b)if a>b:					#若a大b小a,b=b,a				#交换a,breturn a,b

函数myBracket有4个参数:f表示函数 f ( x ) f(x) f(x)。xstar表示初始点 x ∗ x^* x。s表示步长 s s s,缺省值为0.01。lamd表示放大系数 λ \lambda λ,缺省值为2。函数体中第2~5行分别初始化点 a a a c c c以及对应的函数值 y a y_a ya y c y_c yc。第6~9行的if语句矫正a,c保证ya>yc,及步长方向与函数值的下降方向一致。第10~11行初始化点 b b b及对应的函数值 y c y_c yc。第10~15行的while循环执行区间 ( a , b ) (a,b) (a,b)的迭代,直至 y c < y b y_c<y_b yc<yb。第16~17行的if语句确保 a < b a<b a<b
例1 设函数 f ( x ) = sin ⁡ x f(x)=\sin{x} f(x)=sinx,用myBracket分别对 x ∗ = 0 x^*=0 x=0 x ∗ = 4 π 3 x^*=\frac{4\pi}{3} x=34π,计算单峰区间。
:下列代码完成本例计算。

import numpy as np					#导入numpy
xstar=0								#设置xstar为0
print(myBracket(np.sin, xstar))		#计算附近的单峰区间
xstar=4*np.pi/3						#设置xstar为4pi/3
print(myBracket(np.sin, xstar))		#计算附近的单峰区间

利用行内注释信息,不难理解本程序。运行程序,输出

(-2.55, -0.6300000000000001)
(4.50879020478639, 5.46879020478639)

第1行输出包含距 x ∗ = 0 x^*=0 x=0最近的局部最小值点 x 0 = − π 2 x_0=-\frac{\pi}{2} x0=2π的区间 ( − 2.55 , − 0.63 ) (-2.55,-0.63) (2.55,0.63),如下图(a)所示。第2行输出包含距 x ∗ = 4 π 3 x^*=\frac{4\pi}{3} x=34π最近的局部最小值点 x 0 = 3 π 2 x_0=\frac{3\pi}{2} x0=23π的区间 ( 4.51 , 5.47 ) (4.51,5.47) (4.51,5.47),如下图(b)所示。
在这里插入图片描述


http://www.ppmy.cn/news/47247.html

相关文章

学习小程序基础内容之逻辑交互

我们先来看一下实现的效果。 然后再来分享结构。 结构分为左右3:7 分配&#xff0c; 左侧是类别&#xff0c;右侧是该类别对应的品牌。 后台会在onload的请求把左侧的类别返回来&#xff0c;然后我们通过循环把数据展示出来。然后通过点击事件&#xff0c;把对应的品牌请求回来…

学习同步异步的概念,并了解MQ消息队列

文章目录 一、 同步和异步1.1 同步调用1.2 异步调用 二、MQ1.1 介绍1.2 MQ的优点和使用场景 一、 同步和异步 1.1 同步调用 同步调用是一种程序调用方式&#xff0c;在该调用方式中&#xff0c;调用者发起一个请求&#xff0c;然后一直等待被调用者返回响应结果后再继续执行。…

《Android性能优化》一次失败的启动速度优化

正文 在优化APP启动之前&#xff0c;我们首先需要知道&#xff0c;APP启动时究竟发生了什么&#xff0c;才能有的放矢的优化。 APP的启动过程 APP的启动过程就是指&#xff0c;在手机屏幕上点击某个APP的图标&#xff0c;到APP的首页显示在用户面前的过程。 一般APP的启动过…

【数据分析之道-NumPy(三)】numpy切片与索引

文章目录 专栏导读1、前言2、NumPy数组切片2.1一维数组切片2.2多维数组切片 3、NumPy数组索引3.1一维数组索引3.2多维数组索引 4、NumPy数组高级索引4.1整数数组索引4.2布尔数组索引4.3数组索引 总结 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作…

【一】MATLAB基础知识

【一】MATLAB基础知识 1 数值数据类型的分类 整型 无符号整数&#xff1a;无符号8位整数、无符号16位整数、无符号32位整数、 无符号64位整数。 带符号整数&#xff1a;带符号8位整数、带符号16位整数、带符号32位整数、 带符号64位整数。 无符号8位整数数据范围&#xff…

耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些程序员了。 这不&#xf…

软件生存周期

软件生存周期 同任何事物一样&#xff0c;一个软件产品或软件系统也要经历孕育、诞生、成长、成熟、衰亡的许 多阶段&#xff0c;一般称为软件生存周期。把整个软件生存周期划分为若干阶段&#xff0c;每个阶段的任务相对 独立&#xff0c;而且比较简单&#xff0c;便于不同人员…

嵌入式Linux(7):字符设备驱动--申请设备号

文章目录 1、字符设备和杂项设备的区别2、注册字符类设备号的两个办法第一种&#xff1a;静态分配一个设备号第二种&#xff1a;动态分配注销设备号 写代码不带参数测试&#xff08;动态分配&#xff09;&#xff1a;带参数测试&#xff08;静态设置&#xff09;&#xff1a; 建…