fmincon 中 objective 函数和约束函数的单次计算
Single calculation for objective function and constraints function in fmincon
在我的程序中,我需要解决优化例程中的边界值问题,该问题也具有非线性约束。使用 fmincon
解决问题,我需要 BVP
的解来评估 objective 函数和非线性约束函数。
目前我正在 objective 函数和约束函数中求解 BVP。有没有一种更有效的方法,在 objective 函数中对 BVP 进行一次评估后,我可以将解决方案传递给约束函数,以减少一次 BVP 评估。任何想法
创建一个带有额外输入的函数,用于区分这两个调用。这基本上是 objective 和约束函数的包装器,将所有必要的中间输出保存在 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
总是 在 调用 objective 函数之后调用约束函数 完全 决策变量的值相同。现在我不确定是否可以保证这一点——您可能希望在情况并非如此时建立一些保护和机制。
在我的程序中,我需要解决优化例程中的边界值问题,该问题也具有非线性约束。使用 fmincon
解决问题,我需要 BVP
的解来评估 objective 函数和非线性约束函数。
目前我正在 objective 函数和约束函数中求解 BVP。有没有一种更有效的方法,在 objective 函数中对 BVP 进行一次评估后,我可以将解决方案传递给约束函数,以减少一次 BVP 评估。任何想法
创建一个带有额外输入的函数,用于区分这两个调用。这基本上是 objective 和约束函数的包装器,将所有必要的中间输出保存在 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
总是 在 调用 objective 函数之后调用约束函数 完全 决策变量的值相同。现在我不确定是否可以保证这一点——您可能希望在情况并非如此时建立一些保护和机制。