我正在解决一个非常简单的约束优化问题。在这一点上,我只输入了一个约束,使(L-2)向量范数等于1,后来我希望增加非负性约束。
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 :(得分:0)
令人困惑的是,问题是您的函数还有几个输出参数。如果您查看错误,它会告诉您MATLAB正在尝试使用两个输出参数调用您的函数,但您已将其编程为仅使用一个。因此它会出错,因为它使用过多的输出参数调用了你的函数。
所有the examples in the docs都有两个输出,所以尝试以这种方式创建你的函数:
function [out, outeq] = confuneq2(x)
out = x*x'-1;
outeq = [];
end