2012-05-02 82 views
3

在我的日常工作中,我必須最大化使用fminsearch的特定功能;代碼:使用fminsearch最大化功能

clc 
clear all 
close all 

f = @(x,c,k) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2; 
c = 10.1; 
k = 2.3; 
X = fminsearch(@(x) f(x,c,k),[4,10,20]); 

它正常工作,如我所料,而不是問題來了:我需要綁定X在一定範圍內,如:

4 < x(1) < 5 
10 < x(2) < 15 
20 < x(3) < 30 

爲了達到正確的結果,我應該使用優化工具箱,那是我不幸的事。

有什麼辦法通過僅使用fminsearch獲得相同的分析?

回答

2

那麼,不直接使用fminsearch,但如果你願意從文件交換中下載fminsearchbnd,那麼是的。 fminsearchbnd作爲fminsearch的疊加,進行一般目標函數的約束約束最小化。它爲你調用fminsearch,應用這個問題的界限。

本質上,這個想法是爲你的問題轉變,你的目標函數看起來好像它正在解決一個約束問題。它是完全透明的。您可以使用函數,參數空間中的起點以及一組下限和上限調用fminsearchbnd

例如,最小化rosenbrock函數返回fminsearch的[1,1]處的最小值。但是,如果我們對每個變量的問題2應用純粹的下界,那麼fminsearchbnd找到[2,4]處的約束約束解。

rosen = @(x) (1-x(1)).^2 + 105*(x(2)-x(1).^2).^2; 

fminsearch(rosen,[3 3])  % unconstrained 
ans = 
    1.0000 1.0000 

fminsearchbnd(rosen,[3 3],[2 2],[])  % constrained 
ans = 
    2.0000 4.0000 

如果您對某個變量沒有約束,那麼請提供-inf或inf作爲相應的邊界。

fminsearchbnd(rosen,[3 3],[-inf 2],[]) 
ans = 
     1.4137   2 
1

綁定x最天真的方式,將會給任何不在該範圍內的x給予巨大的懲罰。

例如:

function res = f(x,c,k) 
     if x(1)>5 || x(1)<4 
      penalty = 1000000000000; 
     else 
      penalty = 0; 
     end 
     res = penalty - (x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2; 
    end 

您可以改善這種方法,通過在平滑的方式給予處罰。

1

安德烈有正確的想法,提供懲罰的更平滑的方式並不難:只需在等式中加上距離即可。

要繼續使用匿名函數:

f = @(x,c,k, Xmin, Xmax) -(x(2)/c)^3*(((exp(-(x(1)/c)^k)-exp(-(x(2)/c)^k))/((x(2)/c)^k-(x(1)/c)^k))-exp(-(x(3)/c)^k))^2 ... 
+ (x< Xmin)*(Xmin' - x' + 10000) + (x>Xmax)*(x' - Xmax' + 10000) ;