一维搜索方法 matlab,优化方法基础系列

编程入门 行业动态 更新时间:2024-10-10 23:21:06

一维搜索<a href=https://www.elefans.com/category/jswz/34/1771314.html style=方法 matlab,优化方法基础系列"/>

一维搜索方法 matlab,优化方法基础系列

在学习各种优化方法之前,我们需要先从简单的一维优化问题开始,即只有单一变量的优化问题,解决这类问题的方法可称为一维搜索技术,亦可称为线性所搜(Line Search)。一维搜索技术既可以独立的应用于求解单变量的优化问题,同时又是求解多变量优化问题的常用手段。

在大多数多变量函数的最优化中,迭代格式为:

其中最为关键的就是往哪走的搜索方向

和走多少的步长因子

,如果确定了搜索方向,那么求解步长因子

的问题就是一维优化问题,不妨设:

这样凡从

出发,沿搜索方向

,确定步长因子

,使得

(该系列文章涉及的优化方法以及步骤均默认为求极小值)的问题就是关于步长因子

的一维搜索问题。其主要结构可作如下概括:首先确定包含问题最优解的搜索区间,然后采用某种分割技术或者插值方法缩小这个区间,进行搜索求解。

一维搜索方法可以分为两大类,即精确搜索和非精确搜索。精确搜索,顾名思义就是求

的极小值,此时得到的

称为最优步长因子。如果选取的

使得

在可接受的范围内,这种情况就称为非精确的搜索。由于实际计算中,一般做不到精确的一维搜索,实际上也没有必要做到这一点,因为精确的一维搜索需要付出较高的代价,对加速收敛作用不大,因此花费计算量较少的不精确的一维搜索技术方法受到更为广泛的重视和欢迎。 但了解精确的一维搜索技术对于非精确的技术有帮助,所以本系列最开始依然先从精确的一维搜索技术展开。

精确的一维搜索技术

通常根据算法中有无使用导数,将精确的一维搜索技术分为两类,即无导数信息的试探法,包括二分法、黄金分割法、Fibonacci法、进退法等;有导数信息的插值法,包含二次插值法、牛顿法等。

高低高(单峰)区间定位(initially bracketing a minmum)

对于求根问题,通过两点相乘为负即可确定一个区间(连续函数)。那么对于求解一维函数

的局部极小值得问题,可以通过三点信息获得(a triplet of points),即如果

,使得

均小于

,且函数连续,那

之间就存在一个局部极小值,如下图所示:

图 1 高低高区间示意图

高低高区间的确定,最为常见的方法是进退法。

进退法的思想是先试探、再判断是进还是退,直到得到

,且

均小于

情况,则可确定区间。

Algorithm 1 进退法

function [a,b,c] = bracketAdvanceBack(func,x0,h0,plotFlag)

if nargin < 4

plotFlag = 0;

end

if nargin <3

h0 = 0.01;

end

if nargin <2

x0 = 0;

end

if plotFlag == 1

figH = figure();

k = 0;

end

x1 = x0;

h = h0;

x2 = x1 + h;

fx1 = func(x1);

fx2 = func(x2);

%试探

if fx2>=fx1 %说明极小点位于x1的左方,后退搜索,即将步长设定 为负,x1和x2交换

h = -h0;

swap(x1,x2);

swap(fx1,fx2);

end

at = x0;

bt = x2;

iterNum = 1000;

while(iterNum)

h = 2*h;

x3 = x2 + h;

fx3 = func(x3);

ct = x3;

if plotFlag == 1

% pause(1);

plot(x0-300*h0:h0:x0+300*h0,func(x0-300*h0:h0:x0+300*h0),'-b',x1...

,func(x1),'or',x2,func(x2),'og',x3,func(x3),'ob');

print(figH,'-dpng',strcat('plotIm_',num2str(k)));

k = k+1;

end

if fx3>fx2

at = x1;

bt = x2;

ct = x3;

break;

else

x1 = x2;

x2 = x3;

fx2 = fx3;

end

iterNum = iterNum - 1;

end

a = min(at,ct);

b = bt;

c = max(at,ct);

end

function [x,y]=swap(x,y)

t = x;

x = y;

y = t;

end

注:本系列相关matlab代码,对输入的部分异常情况没有进行处理

Numerical recipes 10.1节中提供一种利用三点构建的抛物线极小点进行高低高区间的搜索,这种方法相比传统的进退法在同样的初始条件下,能更快的找到高低高区间,算法如下:

Algorithm 2 抛物线法

function [a,b,c] = bracket(func,a,b,plotFlag,step,steplimit)</

更多推荐

一维搜索方法 matlab,优化方法基础系列

本文发布于:2024-02-26 03:24:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701207.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方法   基础   系列   matlab

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!