一维搜索方法 matlab,优化方法基础系列-精确的一维搜索技术

本文详细介绍了优化问题中的一维搜索技术,包括精确搜索和非精确搜索。精确搜索如二分法、Fibonacci法、黄金分割法和二次插值法,而非精确搜索侧重于实际应用中的高效算法。文章通过MATLAB代码展示了这些方法的实现,并分析了各自的优势和适用场景。
摘要由CSDN通过智能技术生成

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

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

math?formula=%5Cboldsymbol%7Bx%7D_%7Bk%2B1%7D%3D%5Cboldsymbol%7Bx%7D_%7Bk%7D%2B%5Calpha_%7Bk%7D%5Cboldsymbol%7Bd%7D_%7Bk%7D

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

math?formula=%5Cboldsymbol%7Bd%7D_k和走多少的步长因子

math?formula=%5Calpha_k,如果确定了搜索方向,那么求解步长因子

math?formula=%5Calpha_k的问题就是一维优化问题,不妨设:

math?formula=%5Cvarphi(%5Calpha%20)%20%3D%20f(%5Cboldsymbol%7Bx%7D_%7Bk%7D%2B%5Calpha%5Cboldsymbol%7Bd%7D_k)

这样凡从

math?formula=%5Cboldsymbol%7Bx%7D_k出发,沿搜索方向

math?formula=%5Cboldsymbol%7Bd%7D_k,确定步长因子

math?formula=%5Calpha_k,使得

math?formula=%5Cvarphi(%5Calpha)%3C%5Cvarphi(0)(该系列文章涉及的优化方法以及步骤均默认为求极小值)的问题就是关于步长因子

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

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

math?formula=%5Cvarphi(%5Calpha)的极小值,此时得到的

math?formula=%5Calpha_k称为最优步长因子。如果选取的

math?formula=%5Calpha_k使得

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

精确的一维搜索技术

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

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

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

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

math?formula=a%3Cx_1%3Cb,使得

math?formula=f(x_1)均小于

math?formula=f(a)

math?formula=f(b),且函数连续,那

math?formula=%5Ba%2Cb%5D之间就存在一个局部极小值,如下图所示:

c99d032913c7

图 1 高低高区间示意图

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

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

math?formula=a%3Cx_1%3Cb,且

math?formula=f(x_1)均小于

math?formula=f(a)

math?formula=f(b)情况,则可确定区间。

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)

if nargi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值