【发布时间】:2012-05-02 22:08:48
【问题描述】:
我正在尝试遵循此处给出的建议
http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-7.html
但我遇到了麻烦。我有一个复杂的目标来最小化复杂的非线性约束,所有这些都是我的 3 个选择变量和各种参数的函数。我的启动一切的脚本如下所示:
% define a bunch of parameters
gamma= .2;
beta = .3; %
x0=[.5 .5 .5];
%etc
solution = nested_minimization_program(x0,gamma,beta)
Nested_minimization_program 如下所示:
function out = nest_minimization-program(x0,gamma,beta)
options = optimset('GradObj','on');
out = fmincon(@objective,x0,[],[],[],[],[0 0 0],[1 1 1],@nonlin,options)
function [obj obj_gradient] = objective(x)
[obj obj_gradient] = complicated_objective(x,gamma,beta);
end
function [ineq_constriant eq_constraint] = nonlin(x)
[ineq_constriant eq_constraint] = complicated_constaints(x,beta,gamma)
end
end
Complicated_objective 是一个文件,它的第一个参数返回目标值,第二个参数返回分析梯度的值。 Complicated_constraints 为第一个参数返回一个非线性不等式约束向量,第二个参数返回一个非线性等式约束向量。
这样做的原因是我可以为 fmincon 使用@objective 和@nonlin 语法; objective 和 nonlin 只是 x 的函数,而不是参数的函数,因为它们是已经传递参数的函数的子函数。我相信这是我应该使用的形式,以便将梯度和非线性约束传递给 fmincon。我的问题是,当我运行此代码时,出现以下错误
警告:Trust-region-reflective 算法不能解决此类问题, 使用主动集算法。您也可以尝试内点或 sqp 算法:将算法选项设置为“内部点”或“sqp”并重新运行。为了 更多帮助,请参阅文档中的选择算法。
IE,由于某种原因,fmincon 正在离开 Trust-region-reflective 算法并进入活动集,它没有使用我的分析梯度。根据http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-3.html,fmincon 使用分析梯度的要求是,
编写返回的代码: 目标函数(标量)作为第一个输出
梯度(向量)作为第二个输出
使用 optimset 将 GradObj 选项设置为“on”。
objective根据需要返回objective的标量值和梯度,Gradobj是开启的,所以我看不出我的问题。
【问题讨论】:
-
fmincon 通常想要一个可以开头的答案:(out = fmincon(@objective,X0,[],[],[],[0 0 0],[1 1 1],@ nonlin,options) X0 不能为空...(至少在我使用优化工具箱的短暂经验中不是这样)
-
你当然是对的——如果我按照上面写的那样运行代码,它甚至都不会运行,更不用说不使用我想要的算法了。在我的实际代码中提供了初始猜测,我将更新问题以反映这一点。
标签: function matlab nested mathematical-optimization