最优化方法Python计算:一元函数搜索算法——二次插值法

news2024/11/24 17:44:09

已知连续函数 f ( x ) f(x) f(x) x ∗ x^* x近旁存在最优解 x 0 x_0 x0。对博文《最优化方法Python计算:连续函数的单峰区间计算》讨论的 f ( x ) f(x) f(x)单峰区间的包围算法稍加修改,可算得 f ( x ) f(x) f(x)包含 x 0 x_0 x0的单峰区间 [ a , c ] [a,c] [a,c]及含于 ( a , c ) (a,c) (a,c)内的满足 f ( a ) > f ( b ) < f ( c ) f(a)>f(b)<f(c) f(a)>f(b)<f(c)的点 b b b,如下图所示。
在这里插入图片描述
相应地修改实现该算法的myBracket函数如下:

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

y a = f ( a ) y_a=f(a) ya=f(a) y b = f ( b ) y_b=f(b) yb=f(b) y c = f ( c ) y_c=f(c) yc=f(c)。构造通过点 ( a , y a ) (a,y_a) (a,ya) ( b , y b ) (b,y_b) (b,yb) ( c , y c ) (c,y_c) (c,yc)的二次函数 q ( x ) = p 0 + p 1 x + p 2 x 2 q(x)=p_0+p_1x+p_2x^2 q(x)=p0+p1x+p2x2,即
{ y a = p 0 + p 1 a + p 2 a 2 y b = p 0 + p 1 b + p 2 b 2 y c = p 0 + p 1 c + p 2 c 2 . \begin{cases} y_a=p_0+p_1a+p_2a^2\\ y_b=p_0+p_1b+p_2b^2\\ y_c=p_0+p_1c+p_2c^2 \end{cases}. ya=p0+p1a+p2a2yb=p0+p1b+p2b2yc=p0+p1c+p2c2.
解出 p 0 p_0 p0 p 1 p_1 p1 p 2 p_2 p2:
{ p 0 = b c y a ( b − a ) ( c − a ) − a c y b ( b − a ) ( c − b ) + a b y c ( c − a ) ( c − b ) p 1 = − ( b + c ) y a ( b − a ) ( c − a ) + ( a + c ) y c ( b − a ) ( c − b ) − ( a + b ) y c ( c − a ) ( c − b ) p 2 = y a ( b − a ) ( c − a ) − y b ( b − a ) ( c − b ) + y c ( c − a ) ( c − b ) . \begin{cases} p_0=\frac{bcy_a}{(b-a)(c-a)}-\frac{acy_b}{(b-a)(c-b)}+\frac{aby_c}{(c-a)(c-b)}\\ p_1=-\frac{(b+c)y_a}{(b-a)(c-a)}+\frac{(a+c)y_c}{(b-a)(c-b)}-\frac{(a+b)y_c}{(c-a)(c-b)}\\ p_2=\frac{y_a}{(b-a)(c-a)}-\frac{y_b}{(b-a)(c-b)}+\frac{y_c}{(c-a)(c-b)}\end{cases}. p0=(ba)(ca)bcya(ba)(cb)acyb+(ca)(cb)abycp1=(ba)(ca)(b+c)ya+(ba)(cb)(a+c)yc(ca)(cb)(a+b)ycp2=(ba)(ca)ya(ba)(cb)yb+(ca)(cb)yc.
二次式
q ( x ) = p 0 + p 1 x + p 2 x 2 q(x)=p_0+p_1x+p_2x^2 q(x)=p0+p1x+p2x2
称为 f ( x ) f(x) f(x) a , b , c a,b,c a,b,c处的二次插值多项式。由于 q ( a ) = f ( a ) q(a)=f(a) q(a)=f(a),, q ( b ) = f ( b ) q(b)=f(b) q(b)=f(b) q ( c ) = f ( c ) q(c)=f(c) q(c)=f(c),故 q ( a ) > q ( b ) < q ( c ) q(a)>q(b)<q(c) q(a)>q(b)<q(c)。即 ( a , b ) (a,b) (a,b) q ( x ) q(x) q(x)的一个单峰区间。而二次函数仅有一个最小值,故 q ( x ) q(x) q(x)的最优解 x 0 ′ ∈ ( a , c ) x_0^{'}\in(a,c) x0(a,c),且为其驻点。即
x 0 ′ = − 1 2 ⋅ p 1 p 2 = 1 2 [ ( b + c ) y a ( b − a ) ( c − a ) − ( a + c ) y c ( b − a ) ( c − b ) + ( a + b ) y c ( c − a ) ( c − b ) y a ( b − a ) ( c − a ) − y b ( b − a ) ( c − b ) + y c ( c − a ) ( c − b ) ] . x_0^{'}=-\frac{1}{2}\cdot\frac{p_1}{p_2}=\frac{1}{2}\left[\frac{\frac{(b+c)y_a}{(b-a)(c-a)}-\frac{(a+c)y_c}{(b-a)(c-b)}+\frac{(a+b)y_c}{(c-a)(c-b)}}{\frac{y_a}{(b-a)(c-a)}-\frac{y_b}{(b-a)(c-b)}+\frac{y_c}{(c-a)(c-b)}}\right]. x0=21p2p1=21 (ba)(ca)ya(ba)(cb)yb+(ca)(cb)yc(ba)(ca)(b+c)ya(ba)(cb)(a+c)yc+(ca)(cb)(a+b)yc .
直观地看,从 f ( x ) f(x) f(x)的极小值点 x 0 x_0 x0的近旁 x ∗ x^* x出发,运用包围算法计算 f ( x ) f(x) f(x)的单峰区间 ( a , c ) (a,c) (a,c),及 b ∈ ( a , c ) b\in(a,c) b(a,c),满足 f ( x ) > f ( b ) < f ( c ) f(x)>f(b)<f(c) f(x)>f(b)<f(c),过三点 ( a , f ( a ) ) (a,f(a)) (a,f(a)) ( b , f ( b ) ) (b,f(b)) (b,f(b)) ( c , f ( c ) ) (c,f(c)) (c,f(c))的插值二次函数 q ( x ) q(x) q(x)的极小值点 x 0 ′ ∈ ( a , c ) x_0^{'}\in(a,c) x0(a,c)与出发点 x ∗ x^* x相比,离 x 0 x_0 x0更近,如下图所示。
在这里插入图片描述
于是,对给定的容错误差 ε \varepsilon ε,从邻近 f ( x ) f(x) f(x)的极小值点 x 0 x_0 x0的点 x ∗ x^* x出发,用包围算法算得含点 x 0 x_0 x0 f ( x ) f(x) f(x)的单峰区间 ( a , c ) (a,c) (a,c) b ∈ ( a , c ) b\in(a,c) b(a,c),若其长度 ∣ c − a ∣ < ε |c-a|<\varepsilon ca<ε,则即以二次插函数 q ( x ) q(x) q(x)的极小值点 x 0 ′ x_0^{'} x0作为 x 0 x_0 x0的近似值。否则,以 x 0 ′ x_0^{'} x0作为包围算法新的出发点 x ∗ x^* x计算 f ( x ) f(x) f(x)的单峰区间 ( a , c ) (a,c) (a,c)及含于其内的点 b b b,重复上述计算二次插值函数 q ( x ) q(x) q(x)的最小值点 x 0 ′ x_0^{'} x0。循环往复,直至 ∣ c − a ∣ < ε |c-a|<\varepsilon ca<ε。此时, x 0 ′ x_0^{'} x0即为 x 0 x_0 x0的近似值。这一方法称为二次插值法。实现为如下的Python函数

from scipy.optimize import OptimizeResult
def interpolation(fun,xstar,eps=0.0002,**options):
    k=1
    a,b,c=myBracket(fun,xstar)
    ya,yb,yc=fun(a),fun(b),fun(c)
    p1=-ya*(b+c)/((b-a)*(c-a))+yb*(a+c)/((b-a)*(c-b))-yc*(a+b)/((c-a)*(c-b))
    p2=ya/((b-a)*(c-a))-yb/((b-a)*(c-b))+yc/((c-a)*(c-b))
    x01=-0.5*p1/p2
    while c-a>eps:
        xstar=x01
        a,b,c=myBracket(fun,xstar)
        ya,yb,yc=fun(a),fun(b),fun(c)
        p1=-ya*(b+c)/((b-a)*(c-a))+yb*(a+c)/((b-a)*(c-b))-yc*(a+b)/((c-a)*(c-b))
        p2=ya/((b-a)*(c-a))-yb/((b-a)*(c-b))+yc/((c-a)*(c-b))
        x01=-0.5*p1/p2
        k+=1
    bestx=x01
    besty=fun(bestx)
    return OptimizeResult(fun=besty, x=bestx, nit=k)

程序的第2~19行定义函数interpolation,实现二次插值算法。参数fun、xstar和eps分别表示目标函数 f ( x ) f(x) f(x),起点 x ∗ x^* x和容错误差 ε \varepsilon ε。options用来实现minimize_scalar向interpolation传递xstar和eps等实际参数的机制。
第3行将迭代次数k初始化为1。
第4~8行执行第一次迭代:第4行调用myBracket函数,从 x ∗ x^* x起计算 f ( x ) f(x) f(x)的单峰区间 ( a , c ) (a,c) (a,c) b ∈ ( a , c ) b\in(a,c) b(a,c),满足 f ( a ) > f ( b ) < f ( c ) f(a)>f(b)<f(c) f(a)>f(b)<f(c)。第5行计算 f ( x ) f(x) f(x) a , b , c a,b,c a,b,c处的函数值为ya,yb,yc。第6、7行分别计算二次插值函数 q ( x ) q(x) q(x)的一次项系数和二次项系数p1,p2。第8行计算 q ( x ) q(x) q(x)的驻点 x 0 ′ = − 1 2 p 1 p 2 x_0^{'}=-\frac{1}{2}\frac{p_1}{p_2} x0=21p2p1赋予x01。
第9~16行的while循环执行余下的迭代操作:第10行将x01赋予xstar,以更新起点 x ∗ x^* x。第11~15行执行与第4~8行相同的操作。第16行将迭代次数k自增1。循环往复,直至区间 ( a , c ) (a,c) (a,c)的长度 c − a c-a ca不超过 ε \varepsilon ε
需要注意的是,之所以要对表示容错误差 ε \varepsilon ε的参数eps设置缺省值0.0002,是因为myBracket中我们将步长s的缺省值设置为0.0001,使得所计算的单峰区间 ( a , b ) (a,b) (a,b)的长度最小为0.0002。这样,才不至于使得此处的{\bf{while}}语句陷入死循环。读者在使用interpolation时需注意eps参数值不要小于myBracket的s参数的初始值。
例1 用上述程序定义的interpolation函数,计算函数 f ( x ) = x 2 + 4 cos ⁡ x f(x)=x^2+4\cos{x} f(x)=x2+4cosx x 1 = 1.5 x_1=1.5 x1=1.5近旁的极小值点。
:下列代码完成计算。

from scipy.optimize import minimize_scalar
f=lambda x:x**2+4*np.cos(x)
xstar=1.5
res=minimize_scalar(f, method=interpolation, options={'xstar':1.5,'eps':0.001})
print(res)

程序的第2行设置目标函数 f ( x ) = x 2 + 4 cos ⁡ x f(x)=x^2+4\cos{x} f(x)=x2+4cosx赋予f,第3行设置起始点 x ∗ x^{*} x赋予xstar,第4行调用minimize_scalar函数(第1行导入),传递f给参数fun、interpolation给method并通过options向interpolation传递参数1.5给xstar,0.001给eps。运行程序,输出

 fun: 2.316808419788213
 nit: 3
   x: 1.895494265404134

与博文《最优化方法Python计算:一元函数搜索算法——牛顿法》中例1的计算结果相比较,对同一函数 f ( x ) f(x) f(x),相同起点 x ∗ = 1.5 x^*=1.5 x=1.5,牛顿方法在容错误差 ε = 1.4 ⋅ 1 0 − 8 \varepsilon=1.4\cdot10^{-8} ε=1.4108下迭代7次的结果( x 0 x_0 x0的近似值为1.8954942711282465),用二次插值法在容错误差 ε = 0.001 \varepsilon=0.001 ε=0.001下仅迭代3次就可算得与前者直至千万分位( x 0 x_0 x0的近似值为1.895494265404134)均一致的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650388.html

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

相关文章

pandas---删除重复行、映射、异常值检测与过滤、抽样

1. 删除重复行 使用duplicated()函数检测重复的行。 返回布尔类型的Series对象&#xff0c;每个元素对应一行&#xff0c;如果该行不是第一次出现&#xff0c;则元素为True。 def make_df(indexs, columns): data [[str(j)str(i) for j in columns] for i in indexs]df …

中国人民大学与加拿大女王大学金融硕士——用更长远的眼光,展望未来

职场中遇到瓶颈&#xff0c;大家都迫切希望改变自己所处的环境&#xff0c;但却不愿意改变自己&#xff0c;所以他们自己仍然是被束缚的。如果一个人不能够从自我拷问的状态中解脱出来&#xff0c;他就永远也不可能实现自己心中的目标。我们要用更长远的眼光去展望未来&#xf…

NAVIGATE 领航者峰会:记忆科技携手新华三,以存储创新释放数据价值

近日&#xff0c;由紫光集团和新华三集团主办的2023 NAVIGATE 领航者峰会在杭州举行。本届峰会的主题为“精耕务实&#xff0c;为时代赋智慧”&#xff0c;围绕该主题&#xff0c;国内外数千名技术领导者汇聚一堂&#xff0c;探讨数字经济的创新未来。作为IT硬件领域的重要厂商…

vue + g6 实现树级结构(compactBox 紧凑树)

G6文档 自定义节点 G6.registerNode("dom-node",{draw: (cfg, group) > {let str <div classitem-box catalog-node ${cfg.isSelected ? "is-selected" : ""} ${cfg.status}-box οnclickhandleDetail("${cfg.id}") id&quo…

JMeter压测如何分配业务比例?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…

5G是如何提升通行能力的?5G毫米波到底有多快?

高速公路&#xff0c;可以通过多层交通、多条车道、车道方向、车辆容量、货物包装、驾驶司机等多个因素&#xff0c;提升通行能力。 我们把5G比作高速公路&#xff0c;那么&#xff0c;5G是如何提升自身通行能力的呢&#xff1f;5G毫米波&#xff0c;到底能有多快呢&#xff1f…

跨越时空的教育:在线培训系统的全球化

随着全球化的发展&#xff0c;跨越时空的教育已经成为现实。在线培训系统可以打破地域限制&#xff0c;让学生能够接受来自世界各地的教育资源。这种新型教育模式具有巨大的潜力和优势。 在线培训系统是指通过互联网提供的远程教育服务。它可以通过网络平台、视频教育、虚拟课…

如何优雅地使用Low Code提高开发效率

2023年&#xff0c;低代码热度有&#xff0c;但是在企业内部核心场景的落地比例不高&#xff0c;推进进展也没有想象中快。就算是这样&#xff0c;低代码赛道也在“暗流涌动”。 数字化趋势下&#xff0c;很多企业想要以数字化的手段进行降本增效。很多企业希望以低代码的模式…

【Turfjs的java版本JTS】前面讲了Turfjs可以实现几何计算,空间计算的功能,如果后端要做这项功能也有类似的类库,JTS

JTS Java Topology Suite 几何计算&#xff1a; 1. 前端js就用这个 Turfjs的类库。参考网站&#xff1a; 计算两线段相交点 | Turf.js中文网 2. 后端java语言就可以用 JTS这个类库&#xff0c;参考网站&#xff1a; JTS参考网站&#xff1a; 1. https://github.com/locatio…

【机器学习】神经网络代价函数和反向传播算法

神经网络的代价函数 接下来我会再规定若干符号代表的含义&#xff1a; L L L表示神经网络的总层数 s i s_i si​表示的是第i层的神经元数量 如果神经网络处理的是一个二元分类问题&#xff0c;那么他的第L层就只会有一个节点&#xff1b;如果处理的是一个多元分类问题&…

不知不觉创作一年了,谈谈我的创作经历

前言 大家好&#xff0c;我是小刘在C站&#xff0c;不知不觉创作1年啦&#xff0c;本次文章呢分享一下我这一路走来的经历吧 目录 前言 1.为什么写博客 2.第一篇文章 3.怎么坚持创作的&#xff1f; 4.自我介绍 5.收获 6.认识了哪些大佬呢&#xff1f; 7.未来规划 8.分…

【C++】STL的string容器介绍

目录 1、string容器 1.1声明一个c字符串 1.2string和c字符数组的比较 1.3string类操作函数介绍 1.3.1赋值操作 1.3.2字符串拼接 1.3.3字符串查找 1.3.4字符串替换 1.3.5字符串比较 1.3.6字符存取 1.3.7字符串插入 1.3.8字符串删除 1.3.9子串获取 1、string容器 在…

测试4年外包已上岸 , 我只能说这类公司能不去尽量别去···

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

从零开始Vue项目中使用MapboxGL开发三维地图教程(五)实现框选要素功能、可拖动点展示坐标以及地图上实时更新要素

文章目录 1、实现框选要素功能1.1、添加点数据的图层&#xff1a;1.2、增加绘图插件&#xff08;mapbox-draw&#xff09;1.3、实现框选并让选择的目标数据高亮 2、实现地图上可拖动点2.1、实现功能&#xff1a;2.2、实现思路&#xff1a;2.3、代码示例&#xff1a; 3、实时更新…

已安装过PageOfiice,谷歌浏览器反复提示PageOffice安装

原因&#xff1a;Chrome开发团队以网络安全为由&#xff0c;强推ssl证书&#xff0c;希望所有部署在公网的网站&#xff0c;全部改用https访问&#xff0c;所以最新的谷歌和edge升级到94版本后对公网上的http请求下的非同域的http请求进行了拦截&#xff0c;于是就出现了目前遇…

火灾发生时如何实时地选择逃生路线

安科瑞虞佳豪 南京大学无菌动物房改造项目&#xff0c;位于位于南京江北新区学府路 12 号。改造面积约为 1100m2&#xff0c;均在原有建筑底层。其中&#xff0c;动物房区域含饲养室 6 间&#xff0c;层高 4.9m。功能实验区域含实验室 4间、手术室 1 间、暂养室 2 间、内外准备…

Linux进程信号 | 信号产生

前面的文章中我们讲述了进程间通信的部分内容&#xff0c;在本文中我们继续来学习进程信号相关的知识点。 信号入门 生活角度的信号 在我们的日常生活中&#xff0c;就有着各种各样的信号&#xff0c;它会给我们传递各种各样的信息&#xff0c;可以知道的是一个信号例如&…

webpack提升开发体验SourceMap

一、开发场景介绍 开发中我们不可避免的会写一些bug出来&#xff0c;这时候要调试&#xff0c;快速定位到bug到底出现在哪尤为关键。 例如我故意在sum函数中写一个错误代码如下&#xff1a; 这时我们用前面章节已经写好的开发模式的webpack.dev.js运行&#xff0c;控制台会出…

【Spring】— MyBatis与Spring的整合

目录 1.整合环境1.1准备所需的JAR包1&#xff0e;所需Spring框架的JAR包2&#xff0e;所需MyBatis框架的JAR包3&#xff0e;MyBatis与Spring整合所需的中间JAR包4&#xff0e;数据库驱动JAR包5&#xff0e;数据源所需JAR包 1.2 编写配置文件 2.整合2.1 传统DAO方式的开发整合1&…

龙蜥社区第 17 次运营委员会会议顺利召开

5 月 26 日&#xff0c;龙蜥社区走进 Arm 北京办公室召开了第 17 次运营委员会会议。本次会议由龙蜥社区运营委员会副主席金美琴主持。来自 Arm、阿里云、电信、红旗软件、飞腾、海光、Intel、浪潮信息、联通软研院、龙芯、凝思软件、麒麟软件、普华基础软件、申泰、统信软件、…