【发布时间】:2017-11-08 15:12:50
【问题描述】:
我试图在 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') 满足 c(1) 但不满足 c(2),尽管 exitflag 为 1 并且求解器已经收敛。
我写得对还是我的求解器有问题?
来自output.message的消息:
找到满足约束的局部最小值。
优化完成,因为目标函数是 在可行方向上不减少,在默认值范围内 最优性容差和约束满足在 约束容差的默认值。
停止条件详情:
优化完成:相对一阶最优性度量, 9.821943e-07,小于 options.OptimalityTolerance = 1.000000e-06,相对最大约束违规,0.000000e+00,小于 比 options.ConstraintTolerance = 1.000000e-06。
优化指标选项 相对一阶最优性 = 9.82e-07 OptimalityTolerance = 1e-06(默认)相对最大值(违反约束)= 0.00e+00 ConstraintTolerance = 1e-06(默认)
【问题讨论】:
-
是的,因为我将 *-1 用于从 >= 转换为
-
你能为我运行这个吗? options = optimset('fmincon') 并在选项中发布变量?那么即使我没有优化工具箱,我也可以相当快地给你一个解决方案。
标签: matlab optimization