2014-09-29 62 views
0

我需要一个优雅而简单的系统来查找给定一个或多个参数的确定性函数返回的最高值。MATLAB中黑盒函数的参数优化

我知道在MATLAB中有一个很好的遗传算法实现,但实际上,在我的情况下,这是一个矫枉过正。我需要更简单的东西。

有什么想法?

+3

这种高度取决于你的功能。你有衍生品吗?函数是凸的吗?是否有限制?你在寻找全球/本地最高?什么准确度就足够了?这是一个完整的数学研究课题。例如,请参见http://www.mathworks.nl/help/optim/ug/choosing-a-solver.html – MeMyselfAndI 2014-09-29 18:46:49

+0

该函数被假定为不可修改的,正如我在问题中已经指出的那样:黑盒子。获得关于其行为的提示的唯一方法是使用参数查询函数,并返回将被最大化的值。这样就不可能确定最大值/最小值是全局还是局部的,所以局部最大值/最小值可能就足够了。我知道这是一个完整的研究课题,因为这个原因,我在stackoverflow上写了,而不是math.stackexchange,只是想知道在MATLAB中是否有现成的方便实现。 – fstab 2014-09-29 18:52:42

+0

'fminbnd'或'fminsearch'是最好的开始,但这是一个令人难以置信的广泛问题。 – David 2014-09-30 01:16:13

回答

2

您无法直接使用Matlab找到最大值,但可以最小化某些内容。乘以-1的功能transformes你“发现的最大” - 问题变成了“寻找最低” - 问题,可与fminsearch

f = @(x) 2*x - 3*x.^2; % a simple function to find the maximum from 
minusf = @(x) -1*f(x); % minus f, find minimum from this function 
x = linspace(-2,2,100); 
plot(x, f(x)); 
xmax = fminsearch(minusf, -1); 
hold on 
plot(xmax,f(xmax),'ro') % plot the minimum of minusf (maximum of f) 

结果发现是这样的:this

1

一个真正简单的想法是使用网格搜索方法,也许与网格细化。更好的主意是使用更先进的无衍生优化器,例如Nelder-Mead算法。这在fminsearch可用。

您也可以尝试全局优化工具箱中的算法:例如patternsearch或臭名昭着的simulannealbnd