2013-04-01 144 views
0

我嘗試在fmincon優化器中強加一個非線性約束。問題是隻有當其中一個參數爲負時,非線性約束才應該是相關的。該代碼是這樣的:非線性約束條件參數matlab

function [c, ceq] = confun_Model11(param) 
% Nonlinear inequality constraints: c(x)<=0 
if param(6)<0 
    c = (-4)*param(5)*param(7) + param(6)^2+eps; 
else 
    c = []; 
end 

%Nonlinear equality constraints: ceq(x)=0 
ceq = []; 
end 

的問題是,例如使用診斷選項Matlab的說,沒有非線性約束時:

Constraints 
Number of nonlinear inequality constraints: 0 
Number of nonlinear equality constraints: 0 

,並尋找最佳的這種非線性過程約束被違反。 有人請指出我是否沒有正確定義非線性條件約束?

+0

你能告訴你如何調用你的函數嗎?因爲它沒有顯示足夠的代碼。 'x = fmincon(..,..,..,..,'),並且包括所有參數的定義將會有所幫助。 – Floris

回答

2

我不確定fmincon可以處理運行期間約束條件變化的數量。

與其試圖關閉代碼評估中的約束,最好是在您不希望約束處於活動狀態時返回滿足約束條件c(x)< = 0的值。

function [c, ceq] = confun_Model11(param) 
% Nonlinear inequality constraints: c(x)<=0 
c = (-4)*param(5)*param(7) + param(6)^2+eps; 

% Ensure constraint isn't violated if param(6) is positive 
if param(6) >= 0 
    c = -abs(c); 
end 

%Nonlinear equality constraints: ceq(x)=0 
ceq = []; 
end 

現在,這仍然不是很大,因爲這些參數取決於其他(線性?)的約束,約束函數可以是不連續的。一般來說,如果約束函數是連續且平滑的,那麼你更有可能成功地進行優化 - 所以試着將約束函數重新定義爲沒有「if」語句或「abs」函數的東西......即。在你想要應用約束的地方,只是跨過零點。

使用多個非線性約束來實現此目標可能有意義。