我试图在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(默认值)
答案 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