2016-08-02 239 views
2

我正在解決一個非常簡單的約束優化問題。在這一點上,我只輸入了一個約束條件,使(L-2)向量範數等於1,之後我希望添加非負約束條件。Matlab Fmincon「太多輸出參數」

Fmincon給我一個「太多的輸出參數」在我的約束上。我不明白爲什麼。

目標函數:一個簡單的二次型。實際上是一個方差協方差矩陣,我輸入爲一個預先計算的全局變量。

function [y, grady] = quadobj(x) 
global Q 
y = x*Q*x'; 
if nargout > 1 
    grady = 2*Q*x; 
end 

等式約束:該矢量L2範數應爲1。

function outeq = confuneq2(x) 


% Nonlinear equality constraints 
outeq = x*x'-1; 
end 

Fmincon

x0 = [0.7,0.1, -0.69]; 
options = optimoptions(@fmincon,'Algorithm','sqp'); 
[x,fval] = fmincon(@quadobj,x0,[],[],[],[],[],[],... 
    @confuneq2,options); 

但它不工作。我收到以下錯誤。

Error using confuneq2 
Too many output arguments. 

Error in fmincon (line 632) 
     [ctmp,ceqtmp] = feval(confcn{3},X,varargin{:}); 

Caused by: 
    Failure in initial user-supplied nonlinear constraint function evaluation. FMINCON cannot continue 

請幫忙!

回答

0

令人困惑的是,問題在於你的函數太幾個輸出參數。如果你看看這個錯誤,它告訴你MATLAB正試圖用兩個輸出參數來調用你的函數,但是你已經編寫了它只有一個參數。因此,它錯誤,因爲它已經調用了你的函數輸出參數太多。

所有the examples in the docs有兩個輸出,因此嘗試創建你的函數是這樣的:

function [out, outeq] = confuneq2(x) 
    out = x*x'-1; 
    outeq = []; 
end