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 的新手,我不知道我哪里错了。
首先,fminbnd
returnsx
-坐标你函数的最小位置。因此,实际最小值位于 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 份,计算两部分的最小值,然后比较看哪一个更小。
*您可以通过计算导数并检查导数的零交叉数量并除以二来确定您的函数是否有多个最小值
我正在尝试 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 的新手,我不知道我哪里错了。
首先,fminbnd
returnsx
-坐标你函数的最小位置。因此,实际最小值位于 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 份,计算两部分的最小值,然后比较看哪一个更小。
*您可以通过计算导数并检查导数的零交叉数量并除以二来确定您的函数是否有多个最小值