文章内容摘自UESTC最优化张老师的PPT
黄金分割法(0.618法)适用于任何单峰值函数?(?)求极小点的问题,甚至对函数可以不要求连续。
单峰函数
设? : [?, ?] ⊂ R → R,?⋆是在[?, ?]上的全局极小点,如果对于[?, ?]上的任意两点?1, ?2,且?1 < ?2都有
那么称?(?)是区间[?, ?]上的单峰函数。若?1 < ?⋆ < ?2,称[?1, ?2]为搜索区间。
基本思想
在搜索区间[?, ?]内适当插入两点?1, ?2,将[?, ?]分成三段,通过比较这两点的函数值,然后由单峰函数的性质,就可以删去最左端或者最右端的一段,这算一次迭代。然后在留下来的区间上再插入一点,就可以重复上述过程,如此下去,可将区间无限缩小。
设区间的长为1,如下图,在与?相距分别为?和?的点插入?1, ?2,为确定?和?,规定:
(1)要求插入的两点在搜索区间中是对称的。因此无论删除哪一端,留下的总是长为?的区间。于是? + ? = 1。
(2)保证了每次迭代都以同一个的比率缩短区间。不妨设去掉[?2, ?],在留下的区间[?, ?2]里在插入新的一个点?3,使
得?3, ?1在[?, ?2]中的位置与?1, ?1 在[?, ?]的位置有相同的比例。
算法步骤:
步骤1 确定?(?)的初始搜索区间[?, ?]。
步骤2 计算?2 = ? + ?(? − ?),?2 = ?(?2)。
步骤3 计算?1 = ? + ?(? − ?),?1 = ?(?1),。
步骤4 若?2-?1≤ ?,停机;否则,转步骤5。
步骤5 若?(?1) ≤ ?(?2),则? = ?2, ?2 = ?1, ?(?2) = ?(?1), ?1 = ? + ?(? − ?), ?1 = ?(?1);
否则,? = ?1, ?1 = ?2, ?(?1) = ?(?2), ?2 = ? + ?(? − ?), ?2 = ?(?2).然后转步骤4。