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