在我的程序中,我需要在优化例程中解决边界值问题,该例程也具有非线性约束。使用fmincon
来解决问题,我需要BVP
的解决方案来评估目标函数和非线性约束函数。
目前我正在解决目标函数和约束函数中的BVP。有没有一种更有效的方法,在对目标函数中的BVP进行一次评估之后,我可以将解决方案传递给约束函数,以便再减少一次BVP评估。任何想法
答案 0 :(得分:2)
使用额外输入创建单个函数,您可以使用它来区分两个调用。这基本上是目标和约束函数的包装器,在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'), ...);
这明确假设{/ 1}} 始终在调用目标函数后调用约束函数,其中完全相同的值决策变量。现在我不确定这是否可以得到保证 - 你可能希望在不是这种情况下建立一些保护和机制。