【问题标题】:fminbnd doesn't give the minimum valuefminbnd 没有给出最小值
【发布时间】:2015-09-30 16:19:27
【问题描述】:

我正在尝试 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)

可见最小值为-0.77,不是fminbnd给出的结果。这里有什么问题?我是 MATLAB 新手,我不知道我错在哪里。

【问题讨论】:

  • 第一件事!最小值为 -0.12。当您寻找最小值时,您不会寻找函数的最小值,而是寻找最小值发生的地方。所以最小值 -0.12,x=-0.12!
  • 啊,原来是x的位置,谢谢

标签: matlab matlab-figure minimization


【解决方案1】:

首先,fminbnd 返回函数最小位置的 x-coordinate。因此,实际最小值位于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

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

【讨论】:

    【解决方案2】:

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

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

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

    通常,当有很多最小值时,最好的方法是将函数一分为二,计算两部分的最小值,然后比较哪个更小。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 2011-01-18
      • 2023-04-06
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2020-12-10
      相关资源
      最近更新 更多