黄金分割法推导及单变量函数近似最优解
来源:互联网 发布: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程序设计》——马昌凤
- 黄金分割法推导及单变量函数近似最优解
- 黄金分割最优解
- 数学建模 单变量优化和求解 黄金分割法
- 用共轭梯度法求函数极小值和最优解,其中用进退法求步长区间,用黄金分割法求最佳步长
- 黄金分割法求函数最小值
- 一维搜索的最优方法(黄金分割法)matlab程序
- [黄金分割比] 黄金分割法求单峰函数最值
- C语言之基本算法24—黄金分割法求方程近似根
- 单变量最优值求解问题
- 黄金分割法与单峰函数求极值
- 近似函数
- Swift常量和变量及类型推导
- 二分法与黄金分割法求函数方程最小值
- 使用贪心算法求解多机调度问题的近似最优解。
- 优选法中的黄金分割法
- 黄金分割法-C语言
- 黄金分割
- 黄金分割
- 十月十四号总结
- Android 学习笔记(二):引导界面
- hdu-5980-Find Small A
- Java的三种代理模式
- DeepLearing学习笔记-改善深层神经网络(第一周作业-2-正则化)
- 黄金分割法推导及单变量函数近似最优解
- Spark中的DataFrame的getAs方法如果取到的值是null的处理
- Linux 的处理器负载均值
- 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
- Python比较两个文件(txt,csv等)相同内容合并同一文件/文本时间大小比较大小
- CaptureWizPro(屏幕抓取软件)官方注册版V6.10下载 | CaptureWizPro 注册版
- Ubuntu14.04 ROS indigo 入门参考资料介绍
- 模糊PID控制算法的C++实现
- 堆排序(Heap-Sort)