CVXPY中lambda_sum_largest约束不符合DQCP规则的问题求解
问题核心原因:混淆了拟凸/拟凹函数对应的合法约束方向
首先明确DQCP规则中对拟单调函数约束的要求:
- 拟凸函数(所有凸函数默认属于拟凸函数)仅支持
f(x) <= 常数形式的合法约束,因为拟凸函数的下水平集是凸集,符合凸优化对可行域的要求 - 拟凹函数仅支持
f(x) >= 常数形式的合法约束,因为拟凹函数的上水平集是凸集
你用到的cp.lambda_sum_largest是标准凸函数,仅满足拟凸性质、不满足拟凹性质,所以写lambda_sum_largest(A,1)>=2.0的约束相当于取凸函数的上水平集,这个集合本身是非凸的,自然不符合DQCP规则,调用is_dqcp()返回False是正确结果。
你之前单独调用表达式的.is_dqcp()返回True,只是说明这个表达式本身是符合DQCP原子要求的凸表达式,不代表任意符号的约束都能符合DQCP规则。
补充说明
你当前写的最大特征值 >= 常数约束本身是非凸约束,举个简单的例子:两个对角矩阵分别为diag([2,0])和diag([0,2])都满足最大特征值≥2,但二者的平均diag([1,1])最大特征值为1,不满足约束,可行域不满足凸集定义,这类非凸约束本身就无法通过DQCP框架处理。
如果你的实际需求是最大特征值≤某个常数,只需要把约束符号改成<=,此时约束就会符合DQCP要求,可正常用qcp=True求解。
内容的提问来源于stack exchange,提问作者HiIAmFromPoland
相关产品推荐
相关产品推荐

