我正在尝试像这样最小化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
在指定值内的值,或者是正值。我怎样才能做到这一点?
我正在尝试像这样最小化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
在指定值内的值,或者是正值。我怎样才能做到这一点?
据我了解你的问题,你想对你的函数施加约束@func_slot
(我假设它是非线性的)。
在fmincon 的 Matlab 帮助中,我们发现:
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
从您的评论来看,您似乎正试图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;