我正试着听从这里的建议
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
endComplicated_objective是一个文件,它返回第一个参数的目标值,第二个参数返回非层次梯度的值。Complicated_constaints的第一个参数返回一个非线性不等式约束向量,第二个返回非线性等式约束向量。
这样做的原因是,我可以对fmincon使用@objective和@nonlin语法;objective和nonlin只是x的函数,而不是参数的函数,因为它们是已经传递了参数的函数的子函数。我相信这是我应该使用的形式,以便将梯度和非线性约束传递给fmincon。我的问题是,当我运行这段代码时,我会得到以下错误
警告:信任区域反射算法不能解决这类问题,使用主动集算法.您还可以尝试内部点或sqp算法:将算法选项设置为“内点”或“sqp”并重新运行。有关更多帮助,请参见在文档中选择算法。
因为某种原因,fmincon离开了信任区域反射算法,进入活动集,这没有利用我的分析梯度。根据http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-3.html,对fmincon使用分析梯度的要求是,
编写返回的代码:目标函数(标量)作为第一个输出
梯度(向量)作为第二输出
使用优化集将GradObj选项设置为“on”。
目标返回目标的标量值和所需的梯度,Gradobj是打开的,所以我看不到我的问题。
发布于 2011-04-13 22:11:37
我从Matlab组得到了一些帮助,并向我透露,信任区域方法实际上不支持非线性约束,所以这在我的代码中根本不是一个错误。他们重新编写使用“内点”算法,这有自己的问题,但至少这个问题已经解决了。
https://stackoverflow.com/questions/5641822
复制相似问题