假设
,从迭代点
出发,按照迭代公式
来求得点
,使得
。
假设
已确定,如何求最好的步长
呢?
假设无约束最优化问题:
我们已经设定好了初始点
和搜索方向
,那么我们该找到一个步长
,使得
。那也就是说,把
看作参数,引入辅助函数
,要在区间
上选取
,使得
。
定理:若从
出发,沿
方向进行一维搜索得极小点
,则
。
即该点的梯度方向与搜索方向正交。
1.搜索区间
设一维最优化问题为
我们定义搜索区间为:设
,
,并且:
若存在闭区间
,使得
,则称
是
的一个搜索区间。
我们设初始点
,初始步长
,则我们要探测:
和
之间的大小关系,并不断迭代,直到函数值不再下降。
若函数值一开始就下降,就反向搜索。
加步探索法的算法流程图如下:
加步探索法的C++代码:
// 程序名称:加步探索法搜索代码
2.单谷区间与单谷函数
我们希望最优解既落在某一个区间,该区间又没有别的局部最小点。我们定义这样的区间为单谷区间,即:
定义:设
,闭区间
,若存在点
,使得
在
上严格递减,
上严格递增,则称
是函数
的单谷区间,
在
上是单谷函数。
3.对分法
设
在搜索区间
内具有连续的一阶导数,因为
在
上可微,故
在
上连续,由此知
在
上有最小值。
那么,我们只需要解方程
,就可以求出最小值。
对分法就是观察
的符号,并且计算
,根据其符号缩小搜索区间,直到逼近
的零点。
对分法的代码略。
4.Newton切线法
该法要求
具有连续的二阶导数
。
假设在区间
中经过
次迭代已求得方程
的一个近似根
。可由直线切线拟合得下一个近似根
。直线的方程为:
令直线与x轴相交,即
,则:
但这种方法只适用于Hesse矩阵较容易求的情况(多元函数求最优化),并且对初始点的选取要求非常高。
5.黄金分割法
对于
来说,怎么在搜索区间
上选取两点
使得迭代次数最小而区间搜索最快?这个问题有一个比较好的解,即将
进行黄金分割,得点
满足:
计算
和
,有三种可能:
(1)若
,置新区间为
,此时新区间内有保留点
。
(2)若
,置新区间为
,此时新区间内有保留点
。
(3)若
,一般可置新区间为
。
// 程序名称:黄金分割法搜索代码
6.抛物线插值法
此法繁琐且复杂,说了原理基本也没人会去记,给出流程图,可以供大家需要时编码:
// 程序名称:抛物线插值法搜索代码