在我的程序中,我需要在优化程序中求解一个边值问题,它也有非线性约束。用fmincon求解问题,需要用BVP的解来求目标函数和非线性约束函数。
目前,我正在求解目标函数和约束函数中的BVP。在对目标函数中的BVP进行一次评价后,是否有一种更有效的方法,通过对约束函数的求解来减少另一次BVP的评价。任何想法
发布于 2017-01-06 18:26:14
使用额外的输入创建一个函数,用于区分这两个调用。这基本上是目标函数和约束函数的包装器,将所有必要的中间输出保存在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总是在调用目标函数之后调用约束函数,决策变量的值完全相同。现在我不确定这是否能得到保证--当情况并非如此的时候,你可能会想要建立一些保护和机制。
https://stackoverflow.com/questions/41511820
复制相似问题