2014-09-29 89 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