违反非线性约束fmincon内点Matlab

时间:2017-06-07 10:11:26

标签: matlab optimization

我试图在Matlab中用fmincon (interior-point)强加两个非线性约束:

sqrt(w*S*w') <= sigmaTgt/sqrt(260)
sqrt(w*S*w') >= sigmaTgt/sqrt(260)-0.02/sqrt(260)

我尝试了以下内容:

function [c,ceq] = in_nonlconstr(w, S)

    c(1) = sqrt(w*S*w') - tgtVolAnn/sqrt(260);
    c(2) = - sqrt(w*S*w') + ( tgtVolAnn/sqrt(260) - 0.02/sqrt(260) );
    ceq = [];

end

但在优化之后,尽管sqrt(w*S*w')为1并且解算器已收敛,我仍然会c(1)满足c(2)但不满足exitflag

我是否正确地写了它或者我的解算器是否有错误?

来自output.message的消息:

  

发现满足约束条件的局部最小值。

     

优化已完成,因为目标函数是   在可行方向上不减少,在默认值内   最优性容差,并且满足约束   约束容差的默认值。

     

停止标准详情:

     

优化完成:相对一阶最优度度量,   9.821943e-07,小于options.OptimalityTolerance = 1.000000e-06,相对最大约束违规,0.000000e + 00,更少   比options.ConstraintTolerance = 1.000000e-06。

     

优化指标选项   相对一阶最优性= 9.82e-07 OptimalityTolerance   = 1e-06(默认值)relative max(约束违规)= 0.00e + 00 ConstraintTolerance = 1e-06(默认值)

1 个答案:

答案 0 :(得分:1)

试一试:

options = optimset('OptimalityTolerance', 1e-20, 'ConstraintTolerance', 1e-20); 
% this may need to be instead started with the function name, depends on your MATLAB version
options = optimset('fmincon','OptimalityTolerance', 1e-20, 'ConstraintTolerance', 1e-20);
fmincon(....., options) % i.e. what you already are passing to fmincon but adding additional tolerances 

如果能解决您的问题,请告诉我。如果不是我的变量名称可能不对,我需要您运行options=optimset('fmincon')并在options内发布变量名称以设置容差。另一个选择是更改算法 - MATHWORKS说sqp通常比你使用的方法更好:

options = optimset('fmincon','Algorithm','sqp','TolConSQP',1e-20) % other choices are 'active-set' or 'trust-region-reflective' and don't have the `TolConSQP` tolerance parameter, which you may not need at all anyhow

如果它适用于您的应用程序,您当然可以使用较低的容差 - 对于任何算法来说,1e-20似乎是最大的。 请参阅此处获取文档:http://www.mathworks.com/help/optim/ug/fmincon.html#inputarg_options