fminbnd 没有给出最小值

fminbnd doesn't give the minimum value

我正在尝试 MATLAB 中的一些内置函数。我声明了这样一个函数:

function y = myFunction(x)
    y = cos(4*x) .* sin(10*x) .* exp(-abs(x));
end

然后我用fminbnd求最小值:

fminbnd(@myFunction,-pi,pi)

这给了我结果:

ans =

0.7768

然而,当我在 [-pi,pi] 中绘制 'myFunction' 时,我用我使用的代码得到了下图:

>> x = -pi:0.01:pi;
>> y = myFunction(x);
>> plot(x,y)

可以看出min值为-0.77,不是fminbnd给出的结果。这里出了什么问题?我是 MATLAB 的新手,我不知道我哪里错了。

首先,fminbndreturnsx-坐标你函数的最小位置。因此,实际最小值位于 myFunction(0.7768)x=0.7768 是最小值所在的位置。

现在,我尝试了 运行 您的代码,其中包含更详细的信息。具体来说,我想看看每次迭代时最小值的变化情况。我覆盖了 fminbnd 的默认设置,这样我们就可以看到每次迭代发生了什么。

这是我得到的:

>> y = @(x) cos(4*x).*sin(10*x).*exp(-abs(x)); %// No need for function declaration
>> options = optimset('Display', 'iter');
>> [X,FVAL,EXITFLAG] = fminbnd(y, -pi, pi, options)

 Func-count     x          f(x)         Procedure
    1      -0.741629      0.42484        initial
    2       0.741629     -0.42484        golden
    3        1.65833    -0.137356        golden
    4       0.775457    -0.457857        parabolic
    5        1.09264     0.112139        parabolic
    6       0.896609    -0.163049        golden
    7       0.780727    -0.457493        parabolic
    8         0.7768    -0.457905        parabolic
    9       0.776766    -0.457905        parabolic
   10       0.776833    -0.457905        parabolic

Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 


X =

         0.776799595407872


FVAL =

        -0.457905463395071


EXITFLAG =

     1

X是最小值的位置,FVAL是最小值所在的y值,EXITFLAG=1表示算法正确收敛。


这显然不等于您想要的最小值。如果我可以参考fminbnd的文档,它具体是这样说的:

fminbnd may only give local solutions.

随之而来,您没有得到正确答案的原因是您的函数中有 很多 局部最小值。具体来说,如果您放大到 x=0.7784,这本身就是局部最小值:

由于算法设法在这里找到了一个好的局部最小值,它决定停止。
如果您将函数的搜索边界限制在真正的最小值附近,我设法获得了真正的最小值。而不是 [-pi,pi]... 尝试类似 [-1,1] 的东西:

>> [X,FVAL,EXITFLAG] = fminbnd(y, -1, 1, options)


 Func-count     x          f(x)         Procedure
    1      -0.236068    -0.325949        initial
    2       0.236068     0.325949        golden
    3      -0.527864    -0.256217        golden
    4       -0.32561    0.0218758        parabolic
    5     -0.0557281    -0.487837        golden
    6      0.0557281     0.487837        golden
    7      -0.124612    -0.734908        golden
    8      -0.134743    -0.731415        parabolic
    9      -0.126213    -0.735006        parabolic
   10      -0.126055    -0.735007        parabolic
   11      -0.126022    -0.735007        parabolic
   12      -0.126089    -0.735007        parabolic

Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 


X =

        -0.126055418940111


FVAL =

        -0.735007134768142


EXITFLAG =

     1

当我这样做时,我设法获得了正确的最小位置和最小值本身。

虽然这只是部分答案,但我只会指出 fminbnd 文档的 Limitations 部分中的以下文本:

fminbnd may only give local solutions.

你的情况是这样的。通常,当函数具有多个最小值* 优化算法时无法找到全局最小值。

一般来说,当有很多最小值时,最好的方法是将函数分成 2 份,计算两部分的最小值,然后比较看哪一个更小。

*您可以通过计算导数并检查导数的零交叉数量并除以二来确定您的函数是否有多个最小值