本文使用Matlab实现了一些一维搜索方法,作为上一篇文章理论部分的实现。文中最后还实现了在多维搜索方法,在多维搜索方法中调用linesearch_secant方法实现割线法作为一维搜索部分。
案例1——一维搜索方法
函数为:
,log为自然对数。
- 利用MATLAB绘制函数在区间[1,2]上的变化曲线,验证在该区间上是单峰的。
- 利用黄金分割法把区间压缩到长度只有0.23,给出所有中间结果。
- 使用斐波那契法实现,其中
,列出中间结果。
画函数图像f.m:
% f.m
函数图像为:
利用黄金分割法实现:
%Matlab routine for Golden Section Search
黄金分割法中间结果为:
利用斐波那契数列法实现:
%Matlab routine for Fibonacci Search technique
斐波那契数列法中间结果:
案例2——多维搜索方法中的一维搜索方法
利用最速下降法求解下个函数极小值:
。
停止规则为
,初始点为[-4,5,1]。
1.函数设置(g.m)
function
2.一维搜索方法设置(linesearch_secant.m)
function
注意在一维搜索方法中法采用的是割线法,回顾一下割线法使用迭代算法:
将等式右边进行通分化简、再将更新参数设置为alpha之后便可以得到代码中的迭代公式。
3.最速梯度下降法
这个案例采用最速下降法来作为多维搜索算法,最速下降法为梯度下降法的一种具体实现,它的基本理念为:为每次迭代选择合适的步长使得目标函数能够最大程度的减到最小。它的运行方式为:从迭代点出发,沿着负梯度方向开展一维搜索,直到找到步长的最优值,则确定新的迭代点。一个最速下降法的运行方式示例如下图:
再来回顾一下多维搜索方法中的一维搜索方法:
可以看出,当前的迭代点和搜索方向确定之后,迭代点只能想确定方向移动(红色框内的直线),此时一维搜索方法就是找到移动方向上对应多维目标函数(红色框内的红色曲线)的最小值。
function
在命令行使用如下语句运行程序:
options
最终结果为:
欢迎关注公众号:慢慢学算法