1.算法原理介绍
注意:在所用的单变量函数优化搜索法中,都要假定,在搜索区间内的目标函数必须是凸函数或凹函数,因为只有这样,才能通过比较函数在两个不同点的值来预测极值点所在的区间,从而舍弃那个不包含极值点的子区间。
等间隔搜索法是指:将不定区间进行N等分,得到,加上首尾端点共N+1个点,然后通过比较找到对应函数值最小的那个点,记为,则子区间仍是包含极值点的单谷区间,可能会有人问,为什么这个区间就一定包含极值点呢?答案就是文章开头所强调的————目标函数是凸函数或凹函数的缘故,相关概念可自行百度。之后,以此作为新的不定区间再进行N等分,进行下一次搜索,直到区间宽度满足精度要求为止。
为什么要选择三点等间隔呢?
可以发现N不同时,不定区间的缩减率和每次迭代所需要计算的函数值估计次数是不同的,观察下表可以发现,当N等于4时,即三点等间隔时,效率最高,因为将区间四等分时,理论上每次都需要计算3个函数估计点,将区间划分为4等分,每次迭代都会消去区间的一半,但是实际迭代过程中可以发现,除了第一次搜索时函数估计次数为3,之后的迭代搜索的函数估计次数为2,这是因为下一次迭代需要计算的其中一点,是上一次计算过的已知点,从而减少了计算量。
2.算法步骤详述
上一节已经介绍了算法的原理,以及为啥选择三点等间隔法的原因,下面来详细介绍算法设计的步骤。
步骤1:首先设置选择包含极值点的初始区间为,,目标函数为f,设置精度要求为tol,k=1,表示迭代次数。
步骤2:当k=1时,即第一次迭代时我们需要计算3个估计值,,计算
的值和对应的函数值。
步骤3:如果,则令,终止迭代,为函数取极小值时的函数值;否则转步骤4
步骤4:若为三点中的最小值,则令,,令k=k+1,转步骤7;否则转步骤5;
步骤5:若为三点中的最小值,则令,,令k=k+1,转步骤7;否则转步骤6;
步骤6:若为三点中的最小值,则令,,令k=k+1,转步骤7
步骤7:重新计算的值,和对应的函数值,转步骤3
3.参考程序
matlab参考程序如下:
%%三点等间隔搜索法
function [x,minf] = Equal_IntervalSearch(f,a,b,tol)
%目标函数:f
%极值区间左端点:a;
%极值区间右端点;b;
%精度;esp
%返回值x为函数最小值时自变量值
%目标函数最小值;minf
%format long;%%提高输出参数的精度
k = 0;
L = b-a;
Xl = a + L/4;
Xm = a + L/2;
Xu = b - L/4;
f_Xl = subs(f,symvar(f),Xl);
f_Xm = subs(f,symvar(f),Xm);
f_Xu = subs(f,symvar(f),Xu);
while abs(b-a)>tol
k = k+1;
if (f_Xl<=f_Xm) && (f_Xl<=f_Xu)
b = Xm;
Xm = Xl;
f_Xm = f_Xl;
L = b-a;
Xl = a + L/4;
Xu = b - L/4;
f_Xl = subs(f,symvar(f),Xl);
f_Xu = subs(f,symvar(f),Xu);
elseif (f_Xm<=f_Xl) && (f_Xm<=f_Xu)
a = Xl ;
b = Xu;
L = b-a;
Xl = a + L/4;
Xu = b - L/4;
f_Xl = subs(f,symvar(f),Xl);
f_Xu = subs(f,symvar(f),Xu);
else
a = Xm;
Xm = Xu;
f_Xm = f_Xu;
L = b-a;
Xl = a + L/4;
Xu = b - L/4;
f_Xl = subs(f,symvar(f),Xl);
f_Xu = subs(f,symvar(f),Xu);
end
end
x = (a+b)/2;
minf = subs(f,symvar(f),x);
end
运行上述自定义函数,这里以函数f=2t^2-t-1;为例子,得到t=0.25时,得到极小值-1.125
syms t;
a = -10;
b = 10;
tol = 1.0e-6;
f=2*t^2-t-1;
[x,minf] = Equal_IntervalSearch(f,a,b,tol);
minf = double(minf);