-1

我正在尝试像这样最小化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在指定值内的值,或者是正值。我怎样才能做到这一点?

4

2 回答 2

3

据我了解你的问题,你想对你的函数施加约束@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
于 2012-12-13T14:03:48.417 回答
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;
于 2012-12-13T14:23:06.133 回答