2016-08-02 193 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