2
votes

I am solving a very simple constrained optimization problem. At this point, I have only entered a constraint that makes the (L-2) vector norm equal 1 and later I hope to add non-negativity constraints.

Fmincon is giving me a "Too many output arguments" on the my constraint. I don't understand why.

Objective function: A simple Quadratic form. Actually a variance covariance Matrix, I am entering as a pre-calculated global variable.

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

Equality Constraint: that vector L2 norm should be 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);

But it's not working. I am getting the following error.

 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

Please help!

1

1 Answers

0
votes

Confusingly, the problem is that your function has too few output arguments. If you look at the error, it is telling you that MATLAB is trying to call your function with two output arguments but you've programmed it to take only one. Thus it errors because it has called your function with too many output arguments.

All the examples in the docs have two outputs so try create your function this way:

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