fminbnd没有给出最小值

时间:2015-09-30 16:19:28

标签: matlab matlab-figure minimization

我在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)

enter image description here

可以看出最小值是-0.77,这不是fminbnd给出的结果。这有什么不对?我是MATLAB的新手,我不知道我哪里错了。

2 个答案:

答案 0 :(得分:3)

首先,fminbnd会返回函数最小位置的 x - 坐标。因此,实际最小值位于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,这本身就是一个局部最小值:

enter image description here

由于算法在这里设法找到一个好的局部最小值,它决定停止 如果将函数的搜索边界限制在真正最小值的范围内,我设法得到真正的最小值。而不是[-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

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

答案 1 :(得分:3)

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

  

fminbnd可能只提供本地解决方案。

在您的情况下发生了什么。通常,当存在具有多个最小值的函数时,优化算法无法找到全局最小值。

通常,当有很多最小值时,最好的方法是将函数拆分为2,计算两个部分的最小值,然后进行比较以查看哪个较小。

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