fmincon

时间:2017-01-06 18:16:02

标签: matlab optimization differential-equations

在我的程序中,我需要在优化例程中解决边界值问题,该例程也具有非线性约束。使用fmincon来解决问题,我需要BVP的解决方案来评估目标函数和非线性约束函数。

目前我正在解决目标函数和约束函数中的BVP。有没有一种更有效的方法,在对目标函数中的BVP进行一次评估之后,我可以将解决方案传递给约束函数,以便再减少一次BVP评估。任何想法

1 个答案:

答案 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}} 始终在调用目标函数后调用约束函数,其中完全相同的值决策变量。现在我不确定这是否可以得到保证 - 你可能希望在不是这种情况下建立一些保护和机制。