2016-08-02 122 views
2

非常に単純な制約最適化問題を解いています。この時点で、私は(L-2)ベクトルノルムを1にし、後で非負制約を追加することを望む制約を入力しただけです。Matlab Fmincon "出力引数が多すぎます"

Fminconは私の制約に「多すぎる出力引数」を与えています。なぜか分からない。

目的関数:シンプルな2次形式。実際には分散共分散行列です。事前に計算されたグローバル変数として入力しています。

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が2つの出力引数を使用して関数を呼び出そうとしていますが、1つだけを取るようにプログラムしたことを伝えています。したがって、出力引数が多すぎる関数が呼び出されたため、エラーが発生します。

すべてthe examples in the docsはそう、あなたの関数を作成するには、この方法を試してみてください2つの出力を持っている:

function [out, outeq] = confuneq2(x) 
    out = x*x'-1; 
    outeq = []; 
end 
関連する問題