2011-04-12 27 views
2

我想遵从下面给出Matlab的 - 正确设置fmincon当目标和非线性制约性需要参数

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是用于返回第一个参数的客观价值的文件,并且anlaytical梯度值为第二。 Complicated_constaints为其第一个参数返回一个非线性不等式约束矢量,并为其第二个非线性等式约束矢量。

做的原因是这样的话,我可以使用fmincon的@objective和@nonlin语法; objective和nonlin只是x的函数,而不是参数的函数,因为它们是已经传递了参数的函数的子函数。我相信这是我为了将梯度和非线性约束传递给fmincon而应该使用的形式。我的问题是,当我运行此代码,我得到以下错误

警告:信赖域反射算法不能解决使用有效集算法这类问题, 。您也可以尝试内点或SQP 算法:设置算法选项设置为“内点”或“小数量议定书”并重新运行。对于 更多帮助,请参阅文档中选择的算法。

IE,由于某些原因,fmincon离开Trust-region反射算法并转到活动集,它不利用我的分析梯度。为fmincon使用分析梯度的要求是,根据http://www.mathworks.com/help/toolbox/optim/ug/brhkghv-3.html

编写代码返回: 目标函数(标量)作为第一输出

梯度(载体)作为第二输出

设置“对”的GradObj选项与optimset。

objective返回目标的标量值和所需的梯度,Gradobj打开,所以我没有看到我的问题。

+0

fmincon通常希望回答它可以与开始:(OUT = fmincon(@目标,X0,[],[],[],[0 0 0],[1 1 1],@ NONLIN,选项)X0不能为空......(至少在使用优化工具箱我简短的经验) – Rasman 2011-04-13 04:24:18

+0

你当然是正确的 - 如果我跑了代码上面写的,它甚至不会跑,不要介意不使用算法我想要。在我的实际代码中提供了初始猜测,我将更新问题以反映这一点。 – Dennis 2011-04-13 16:20:56

回答

0

我从Matlab的Usenet组获得了一些帮助,它向我透露,信任区域方法实际上并不支持非线性约束,所以它在我的代码中根本不是错误。他们推荐使用'内点'算法进行重写,该算法有其自身的问题,但至少这个问题已经解决。