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

news2024/10/6 4:01:49

我们知道,闭区间上的一元连续函数必在区间上取得最大值和最小值。实践中我们需要能数值地确定含有 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初始化为xstar
   ya=f(a)
   c=a+s					#c初始化为a+s
   yc=f(c)
   if yc>ya:				#s为上升方向
      a,c=c,a				#交换a,c
      ya,yc=yc,ya
      s=-s					#调整s为下降方向
   b=c+s					#b置为c+s
   yb=f(b)
   while yb<=yc:			#b同a、c处于同一下降区间
      a,ya=c,yc				#a置为c
      c,yc=b,yb				#c置为b
      s*=lamd				#扩大步长s
      b=c+s					#重置b为c+s
      yb=f(b)
   if a>b:					#若a大b小
      a,b=b,a				#交换a,b
   return 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.coloradmin.cn/o/443723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞桨paddlespeech语音唤醒推理C实现

上篇&#xff08;飞桨paddlespeech 语音唤醒初探&#xff09;初探了paddlespeech下的语音唤醒方案&#xff0c;通过调试也搞清楚了里面的细节。因为是python 下的&#xff0c;不能直接部署&#xff0c;要想在嵌入式上部署需要有C下的推理实现&#xff0c;于是我就在C下把这个方…

Android Stuido中修改项目SDK版本号

通过Android Studio创建项目时&#xff0c;只能选择项目支持的最低SDK版本号&#xff0c;而无法选择当前编译使用的版本号&#xff0c;如图1所示。 图1 选择项目支持的最小版本号 而编译项目的SDK版本号默认是Android Studio安装的最新SDK。如果不想使用最新SDK来编译项目&…

C++入门(3)

C入门 1.auto关键字&#xff08;C11&#xff09;1.1. 类型别名的思考1.2. auto简介1.3. auto使用情景1.4. auto的使用细则1.5. auto不能推导的场景 2.函数内联2.1. 问题提出2.2. 概念&#xff08;关键字——inline&#xff09;2.3. 特性2.4. 面试题 3. 基于范围的for循环(C11)3…

Python 基础(八):流程控制语句

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 一、条件语句1.1、if1.2、if...else...1.3、if...elif...else... 二、匹配语句2.1、ma…

亚马逊、ebay、temu如何提升产品点击率?测评自养号解析

产品点击率对于店铺销售额的影响至关重要&#xff0c;尤其是在竞争越来越激烈的市场环境中&#xff0c;想要有销量和转化&#xff0c;提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时&#xff0c;第一眼看到的就是主图&#xff0c;一张优质的主图更容…

Scala之面向对象

目录 Scala包&#xff1a; 基础语法&#xff1a; Scala包的三大作用&#xff1a; 包名的命名规范&#xff1a; 写包的好处&#xff1a; 包对象&#xff1a; 导包说明&#xff1a; 类和对象&#xff1a; 定义类&#xff1a; 封装&#xff1a; 构造器&#xff1a; 主从…

将项目部署到服务器上,并且使用JMeter测试项目性能

1、前提条件 首先呢&#xff0c;你要有一个有一个项目&#xff0c;并且打包成jar包。然后你要有一台服务器&#xff0c;你可以登录阿里云&#xff08;国内社区&#xff09;然后买按量付费的服务用一下&#xff0c;其实服务器就像虚拟机一样&#xff0c;linux命令执行。但是Cen…

操作系统的结构与功能流程

一、用户态和内核态 用户态可以理解为用户模式&#xff0c;内核态理解为内核模式 二、功能流程举例 假设你是一名顾客在一家餐厅用餐&#xff0c;餐厅有一个厨师负责烹饪食物&#xff0c;而你作为顾客只能在餐厅的就餐区域内进行点餐、享用餐点。这里就可以将就餐区域看作用户…

【基于视觉的分割】语义分割初探索:一些经典和先进的算法

写在前面&#xff1a; 有很长时间没有更新学习了&#xff0c;因为在忙着做试验写毕业论文。但是&#xff0c;学习不能停止&#xff0c;从今天开始&#xff0c;换成语义分割方向进行深入学习&#xff0c;有兴趣的小伙伴可以和我一起讨论&#xff0c;也欢迎才进入这个方向学习的…

【Grafana】連接mssql並圖表顯示

【Grafana】連接mssql並圖表顯示 1. 函數2. Demo2.1 Query2.2 Query 3. Awakening1.1 Big Data -- Postgres 1. 函數 Macro exampleReplaced by$__time(dateColumn)An expression to rename the column to time. For example, dateColumn as time$__timeEpoch(dateColumn)An e…

改变思想,拥抱毒瘤,让公司走的更远

牛B的人物&#xff0c;早已经厌倦了中英文混杂&#xff0c;他们更进一步&#xff0c;使用中英文缩写&#xff0c;对普通人进行降维打击。更厉害的&#xff0c;造就新的名词&#xff0c;并科普出去。 有几项技术&#xff0c;我从心底里鄙视和厌恶&#xff0c;但每次在技术方案中…

Cursor IDE一个GPT4人工智能自动程序编辑器

让我们来了解一下Cursor IDE是什么。Cursor IDE是一个新型的编程工具&#xff0c;可以通过它生成、编辑以及与人工智能进行交互分析代码。官方网站上的三个单词“Build Software. Fast.”&#xff08;快速构建软件&#xff09;以及“Write, edit, and chat about your code wit…

Spark 实现重新分区 partitionBy、coalesce、repartition(附代码演示)

文章目录 1、partitionBy 源码中的定义&#xff08;部分&#xff09; 调用方式 2、coalesce 源码中的定义 调用方式 3、repartition 源码中的定义 调用方式 repartition和coalesce的区别 代码演示 &#xff08;跳转代码&#xff09; 实现重新分区&#xff0c;本质上…

如何轻松进行接口测试?试试这款神器Apifox,亲测好用!

Apifox学习教程地址&#xff1a;https://www.bilibili.com/video/BV1mb411o7Go/? 目录&#xff1a;导读 ​引言 一、接口调试 二、Mock功能 三、自动化测试 引言 如果你曾经为手工编写和维护测试用例而感到疲惫&#xff0c;那么你需要试试这款神器——Apifox&#xff01; …

【云原生】Kubernetes(k8s)之Pod概念和使用

k8s之Pod概念和使用 一、Pod简介1.1、Pod的阶段&#xff08;状态&#xff09;1.2、容器状态 二、Pod的定义2.1、restartPolicy2.2、imagePullPolicy2.3、command2.4、args2.5、resources 三、Pod的使用3.1、创建并访问Pod3.2、多个应用容器3.3、Init容器3.3.1、Init容器与普通容…

劝人写码,千刀万剐——“前端已死”难道要成真了?

移动互联网的兴起&#xff0c;传统行业的数字化转型&#xff0c;大前端技术的普及&#xff0c;随之而来的就是Vue为代表的前端框架和工具的兴起&#xff0c;前端开发的门槛降低。但发展&#xff0c;稳定&#xff0c;衰落是亘古不变的事物发展规律。 一些有趣的迹象 最近逛社区…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题203.707.206翻转链表) 2023.4.21

目录 前言算法题&#xff08;LeetCode刷题203移除链表元素&#xff09;—&#xff08;保姆级别讲解&#xff09;算法题&#xff08;LeetCode刷题707.设计链表&#xff09;—&#xff08;保姆级别讲解&#xff09;代码参考&#xff1a; 算法题&#xff08;LeetCode刷题206.反转链…

DC:5靶机通关详解

信息收集 漏洞发现 扫个目录 发现存在footer.php 查看,发现好像没什么用 参考他人wp得知thankyou.php会包含footer.php 可以通过传参来包含别的文件 但是我们不知道参数,这里用fuzz来跑参数 这里用wfuzz的时候报错了 解决方法如下 卸载 sudo apt --purge remove python3-pycu…

最强省钱攻略——IC设计公司老板必读

2023年&#xff0c;国内半导体产业发展面临着很大的不确定性&#xff0c;这应该是共识。 IC芯片设计公司&#xff0c;重度研发创新导向。 站在企业角度&#xff0c;怎么在不确定性下&#xff0c;组织人、财、物&#xff0c;面向未来&#xff0c;应对市场竞争&#xff1f; 算…

vCener 配置 vSan 网络

文章目录 1. 准备2. 创建vsan网络2.1 创建 vSphere Distributed Switch &#xff08;vds&#xff09;2.2 添加管理主机2.3 添加 networking 3. 删除3.1 删除 vmkernel adapter3.2 删除 hosts3.3 删除 DSwitch 1. 准备 三台物理机搭建 exsi一台部署 vcenter 管理三台 exsi每台物…