创建一个带有额外输入的函数,用于区分两个调用。这基本上是目标和约束函数的包装,将所有必要的中间输出保存在persistent 变量中:
function varargout = my_obj_con_function(..., option)
persistent C, Ceq; % ... or any other data you might need
switch (option)
case 'obj'
% objective function
[varargout{1}, data] = objfun(...); % 'data' is an example
% constraint function
[C, Ceq] = confcn(data, ...);
case 'con'
% You've just computed this -- just return it
varargout{1} = C;
varargout{2} = Ceq;
return
end
end
这样使用:
[...] = fmincon(@(x) my_obj_con_function(x, ..., 'obj'), ...
x0,...
Lb, Ub, ...
A, b,...
Aeq, beq, ...
@(x) my_obj_con_function(x, ..., 'con'), ...);
这明确假设fmincon 总是调用约束函数在调用目标函数之后,完全相同决策值相同变量。现在我不确定这是否可以保证——您可能希望在不能保证的情况下建立一些保护和机制。