黄金分割法推导及单变量函数近似最优解

来源:互联网 发布:tensorflow最新版本 编辑:程序博客网 时间:2024/06/10 00:02

“学海无涯”,以下是笔者研究生课程相关笔记及个人见解,欢迎走过路过的大佬们指正~


一.相关术语

1.无约束优化(单变量优化)

无约束优化是在没有约束条件下优化目标函数,这里只涉及基础的单变量函数优化,其模型可表示为:min f(x)。研究无约束优化

有利于后续学习条件优化。

2.精确线搜索

精确线搜索的基本思想是:1.确定包含问题最优解的搜索区间。2.采用插值法或分割技术缩小这个区间,进行搜索求解。

精确线搜索分为两类:1)使用导数的搜索,如插值法,牛顿法以及抛物线法。

2)不用导数的搜索,如黄金分割法,分数法及成功-失败法

本文主要介绍精确线搜索中的黄金分割数值法(0.618法)


二.黄金分割法

想必大家对黄金分割数0.618并不陌生,其基本思想也简单,就是通过试探点函数值的比较,使得包含极小值点的搜索区间[a,b]

不断缩小。这里在确定搜索的时候要注意,需要保证搜索区间近似单峰区间,可以使用“进退法”来确定搜索区间。同时,在缩小

区间[a,b]时,借助p,q两个点,尽可能每次只改变一个端点,会出现“左搜”(高-低-高)和“右搜”(高-低-低)两种情况,且区间

需以一定比例t缩小, 0<t<1。进退法基本思想是从一点出发,按步长,试图确定函数值呈现“高-低-高”趋势

有了以上基础,我们就可以动手推导出黄金分割系数0.618,具体过程可以参考下图(PS,有点乱,大体思路是OK的)

如果觉得不清楚的可以参考《最优化方法及其Matlab程序设计》——马昌凤P15-16



三.黄金分割法的应用(近似最优解)

尽管知道黄金分割法的推导,那么它有什么应用?能解决什么问题呢?下面,我们以0.618法求 min f(x)=x^3 - 2*x + 1的近似最优解,

初始搜索区间为[0,3],区间精度为delta=0.15,函数值容许误差为epsilon=0.01。

该题为参考书《最优化方法及其Matlab程序设计》——马昌凤P27 2-2习题。

python代码

#encoding:utf8import mathdef feval(x):     return x*x*x - 2*x + 1    #return x*x - math.sin(x)t = (math.sqrt(5)-1)/2a = 0b = 3h = a - bdelta = 0.15epsilon = 1e-2p = a + (1-t)*(b-a)q = a + t*(b-a)phip = feval(p)phiq = feval(q)phia = feval(a)phib = feval(b)i = 1while(abs(feval(b)-feval(a) > epsilon) or h > delta):    if feval(p) <= feval(q):        b = q        phib = phiq        q = p        phiq = phip        p = a + (1-t)*(b-a)        phip = feval(p)        h = b - a    else:        a = p        phia = phip        p = q        phip = phiq        q = a + t*(b-a)        phiq = feval(q)        h = b - a    i = i + 1ds = abs(b-a)dphi = abs(phib-phia)if phip <= phiq:    s = p    phis = phipelse:    s = q    phis = phiqprint(i,s,a,p,q,b,abs(b-a),abs(phib-phia))

代码执行结果如下:迭代8次后,得到极小值点0.81153...





————————××××××××××××××××××××××××————————————————————————————

参考文献:《最优化方法及其Matlab程序设计》——马昌凤

阅读全文
0 0
原创粉丝点击