如何最小化功能的同等价值

时间:2012-12-13 13:43:24

标签: matlab mathematical-optimization

我正在尝试将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或正值。我怎么能这样做?

2 个答案:

答案 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_slotlb <= x <= ubsum(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;