我正在尝试将matlab中的函数最小化,如下所示:
function [c, ceq] = const_slot( x )
c = [];
% Nonlinear equality constraints
ceq = [sum(x)-1];
end
[x,fval] = fmincon(@func_slot, x0,[],[],[],[],lb,ub,@const_slot,options)
但是,我需要评估指定值内的fval
或正值。我怎么能这样做?
答案 0 :(得分:3)
据我了解你的问题,你想对你的函数@func_slot
设置约束(我假设它是非线性的)。
在我们找到的Matlab help for fmincon中:
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
可以使用nonlcon
参数(在您使用的问题@const_slot
中)设置非线性约束。这些约束应定义为:
function [c,ceq] = mycon(x)
c = ... % # Compute nonlinear inequalities at x.
ceq = ... % # Compute nonlinear equalities at x.
例如,当您希望函数@func_slot
大于零时,您可以在c
中定义不等式约束@const_slot
作为函数的负数。
修改强>
如果我理解正确,则需要函数值大于零但小于指定的限制。在这种情况下,你可以试试这个。
function [c, ceq] = const_slot( x )
% # Nonlinear inequality constraints
upperLimit = 10;
c = [-func_slot(x);
-upperLimit + func_slot(x)];
% # Nonlinear equality constraints
ceq = [sum(x)-1];
end
答案 1 :(得分:2)
根据您的评论,您似乎正在尝试查找域func_slot
和lb <= x <= ub
中sum(x) = 1
的所有零。
1.如果是这种情况,请重新说出您的问题以反映这一点 - 您将获得更好的答案。
2.约束sum(x)=1
是线性约束,您可以使用Aeq = ones(1, size(x,1))
和beq = 1
来实现相同的目标。这样,您现在可以使用const_slot
来反映您的非线性需求
function [c, ceq] = const_slot( x )
c = [];
ceq = func_slot(x) - desired_fval;