一篇文章搞懂精确一维搜索方法 - 三点等间隔搜索法

1.算法原理介绍

注意:在所用的单变量函数优化搜索法中,都要假定,在搜索区间内的目标函数必须是凸函数或凹函数,因为只有这样,才能通过比较函数在两个不同点的值来预测极值点所在的区间,从而舍弃那个不包含极值点的子区间。

      等间隔搜索法是指:将不定区间[\begin{matrix}{\alpha_{L}}&{\alpha_{U}}\\\end{matrix}]进行N等分,得到\alpha_1,\alpha_2,...,\alpha_{N-1},加上首尾端点共N+1个点,然后通过比较找到对应函数值最小的那个点,记为\alpha_{M},则子区间\begin{bmatrix}\alpha_{M-1}&\alpha_{M+1}\end{bmatrix}仍是包含极值点的单谷区间,可能会有人问,为什么这个区间就一定包含极值点呢?答案就是文章开头所强调的————目标函数是凸函数或凹函数的缘故,相关概念可自行百度。之后,以此作为新的不定区间再进行N等分,进行下一次搜索,直到区间宽度满足精度要求为止。

为什么要选择三点等间隔呢?  

    可以发现N不同时,不定区间的缩减率和每次迭代所需要计算的函数值估计次数是不同的,观察下表可以发现,当N等于4时,即三点等间隔时,效率最高,因为将区间四等分时,理论上每次都需要计算3个函数估计点,将区间划分为4等分,每次迭代都会消去区间的一半,但是实际迭代过程中可以发现,除了第一次搜索时函数估计次数为3,之后的迭代搜索的函数估计次数为2,这是因为下一次迭代需要计算的其中一点,是上一次计算过的已知点,从而减少了计算量。

 2.算法步骤详述

   上一节已经介绍了算法的原理,以及为啥选择三点等间隔法的原因,下面来详细介绍算法设计的步骤。

步骤1:首先设置选择包含极值点的初始区间为[\begin{matrix}{\alpha_{L}}&{\alpha_{U}}\\\end{matrix}]L_{k}=\alpha_{U}^{k}-\alpha_{L}^{k},目标函数为f,设置精度要求为tol,k=1,表示迭代次数。

步骤2:当k=1时,即第一次迭代时我们需要计算3个估计值,L_{k}=\alpha_{U}^{k}-\alpha_{L}^{k},计算

  

\begin{cases}\alpha_1^k=\alpha_L^k+\dfrac{1}{4}L_k\\\alpha_2^k=\alpha_L^k+\dfrac{1}{2}L_k\\\alpha_3^k=\alpha_L^k+\dfrac{3}{4}L_k\end{cases}的值和对应的函数值。

步骤3:如果L_k<tol,则令\alpha^{*}=\frac{1}{2}\big(\alpha_{L}^{k}+\alpha_{U}^{k}\big),终止迭代,\alpha^{*}为函数取极小值时的函数值;否则转步骤4

步骤4:若\alpha_1^{k}为三点中的最小值,则令\begin{array}{l}{​{\alpha_{L}^{k+1}=\alpha_{L}^{k}}}\\{​{\alpha_{U}^{k+1}=\alpha_{2}^{k}}}\end{array}\alpha_{2}^{k+1}=\alpha_{1}^{k},令k=k+1,转步骤7;否则转步骤5;

步骤5:若\alpha_2^{k}为三点中的最小值,则令\begin{array}{l}{​{\alpha_{L}^{k+1}=\alpha_{1}^{k}}}\\{​{\alpha_{U}^{k+1}=\alpha_{2}^{k}}}\end{array}\alpha_{2}^{k+1}=\alpha_{2}^{k},令k=k+1,转步骤7;否则转步骤6;

步骤6:若\alpha_3^{k}为三点中的最小值,则令\begin{array}{l}{​{\alpha_{L}^{k+1}=\alpha_{2}^{k}}}\\{​{\alpha_{U}^{k+1}=\alpha_{u}^{k}}}\end{array}\alpha_{2}^{k+1}=\alpha_{3}^{k},令k=k+1,转步骤7

步骤7:重新计算\begin{cases}\alpha_1^k=\alpha_L^k+\dfrac{1}{4}L_k\\\alpha_2^k=\alpha_L^k+\dfrac{1}{2}L_k\\\alpha_3^k=\alpha_L^k+\dfrac{3}{4}L_k\end{cases}的值,和对应的函数值,转步骤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);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一维搜索方法是一种优化算,旨在通过在一维空间中搜索最佳解决方案来最小化或最大化目标函数。Matlab提供了几种一维搜索方法的实现。以下是一些示例程序。 1. 黄金分割 ``` function [xopt, fopt, iter] = golden_section(f, a, b, tol) % f: 目标函数 % a, b: 搜索区间 % tol: 容差 % xopt: 最优解 % fopt: 最优值 % iter: 迭代次数 tau = (sqrt(5) - 1) / 2; % 黄金分割比例 c = b - tau * (b - a); d = a + tau * (b - a); f_c = f(c); f_d = f(d); iter = 0; while abs(b - a) > tol iter = iter + 1; if f_c < f_d b = d; d = c; c = b - tau * (b - a); f_d = f_c; f_c = f(c); else a = c; c = d; d = a + tau * (b - a); f_c = f_d; f_d = f(d); end end xopt = (a + b) / 2; fopt = f(xopt); end ``` 2. 斐波那契搜索 ``` function [xopt, fopt, iter] = fibonacci_search(f, a, b, tol) % f: 目标函数 % a, b: 搜索区间 % tol: 容差 % xopt: 最优解 % fopt: 最优值 % iter: 迭代次数 N = 100; % 斐波那契数列长度 fib = [1, 1]; for i = 3:N fib(i) = fib(i-1) + fib(i-2); end k = find(fib <= (b-a)/tol, 1, 'last'); x1 = a + fib(k-2) / fib(k) * (b - a); x2 = a + fib(k-1) / fib(k) * (b - a); f1 = f(x1); f2 = f(x2); iter = 0; while abs(b - a) > tol && iter < N iter = iter + 1; if f1 < f2 b = x2; x2 = x1; f2 = f1; x1 = a + fib(k-iter-2) / fib(k-iter) * (b - a); f1 = f(x1); else a = x1; x1 = x2; f1 = f2; x2 = a + fib(k-iter-1) / fib(k-iter) * (b - a); f2 = f(x2); end end xopt = (a + b) / 2; fopt = f(xopt); end ``` 3. 坐标下降 ``` function [xopt, fopt, iter] = coordinate_descent(f, x0, tol) % f: 目标函数 % x0: 初始解 % tol: 容差 % xopt: 最优解 % fopt: 最优值 % iter: 迭代次数 n = length(x0); x = x0; iter = 0; while true iter = iter + 1; for i = 1:n xold = x(i); x(i) = fminbnd(@(t) f(replace(x, i, t)), -100, 100, optimset('TolX', tol)); if abs(x(i) - xold) < tol break end end if i == n break end end xopt = x; fopt = f(xopt); end function y = replace(x, i, xi) % 替换x中的第i个元素为xi,返回新的向量 y = x; y(i) = xi; end ``` 以上是几个简单的一维搜索示例程序,可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值