用python计算黄金分割,黄金分割法Python
黄金分割法搜索局部极小值的原理是基于单峰函数的特性。
1.单峰函数的定义:设f是定义在闭区间[a,b]上的一元函数,x是f在[a,b]上的极小点,对任意x1,x2属于[a,b],x1x2
如果x2=x,f(x1)f(x2),如果x*=x1,f(x2)f(x1)称为闭区间[a,b]内的单峰函数。
图像描述如图所示:
图中的f(x)和g(x)都是单峰函数,即在一个区间内存在一个极值点,可以清楚地将函数分成单调曲线的两半。如你所见,单峰只是一个图像标题,还有单谷函数(区间)的标题。
2.黄金分割法黄金分割法是一种在单峰(谷)区间搜索最优解的算法。具体算法步骤如下:
3.解释黄金分割理论。顾名思义,黄金分割就是借用。在详细解释黄金分割法之前,我们需要先解释一下启发式方法。
对于单峰(谷)区间,最好的搜索方式可以从压缩区间考虑。如果搜索到的区间足够小,那么这个区间内的每一个点都可以看作是极小点。
基于这个想法,我们开始测试。
在[a,b]中,选择两个试验点x1,x2。计算两点的函数值,f(x1),f(x2)
比较f(x1)和f(x2):如果f(x1)f(x2)有两种情况
情况(1)
情况(2)
当f(x1)f(x2)时,上述两种情况都存在,即x1和x2在极小点的左侧,或者x1在左侧,x2在右侧。有一点是肯定的:x1肯定不会在极小点的右边。此时,最小点的范围可以从[a,b]缩小到[x1,b]。
同理,当f(x1)f(x2)时,极小点的范围可以从[a,b]缩小到[a,x2]。
以上是启发式方法的基本原理。我们在选择启发点的时候,当然可以随意选择。我们可以在[a,b]的范围内取两个启发式点作为随机数,这样也可以达到不断缩小搜索范围的目的。但是作为一个算法,有很大的随机性,它的算法的效率是随机的。所以我们需要一个稳定的算法,最好每次都以已知的比例压缩区间。
此时,我们可以线性地设置前一个搜索区间的试点,即两个试点分别是区间左侧的L分位数(L0.5)和右侧的L分位数(L0.5)。这样每次搜索都能把区间压缩到原来区间的L倍。最终可以得到一个足够小的搜索区间。
回到黄金分割0.618。
这时候我们的问题就变成了为什么需要把l设置成1-0.618,也就是为什么每次都要把区间压缩0.618倍。毕竟每次l都可以小到0.5。从而在迭代中更快地压缩空间。
算法上主要有节省资源的考虑。当1-L为黄金分割数时,选择下一个试点时,可以从前一个点中取其中一个试点,节省资源。推导过程如下:
4.python实现和验证。初学者练习python,用黄金分割法求解f=exp(-x) x**2在单谷区间(0,1)的最小值。最后调用scipy库中的fminbound来验证程序的有效性。
从scipy导入数学。优化导入fmin,fminbound #一维黄金搜索def f(x):L=math。exp(-x)x * * 2 return Ldef golden(f,* args):if not( a in dir()):a=[]b=[]a . append(args[0])b . append(args[1])L=1e-16 # reference for convergence n=80 #迭代的最大步数# a,b是包含选择点1=a[0]0.382 *。
这里调用的科学计算库中的fminboud函数。
#使用嵌入函数min_global=fminbound(f,0,1)print(min_global=,min_global)验证程序结果:
最佳点是:0.357328473885934min _ global=0.357353538036861207程序结果:.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。