为什么使用 cvxpy 编写并使用 Mosek 求解的凸 QCQP 模型显示的约束比模型中定义的约束更多(正如 Mosek 所报告的)?
即使对于像 square(x) 这样的 cvxpy atom,我也注意到了同样的情况,如果 x 是单个变量和约束:
cvxpy.square(x) <= 1
表明模型有 4 个约束而不是只有一个?
谢谢
您可以轻松地自己分析它。跑:
import cvxpy as cp
# Construct the problem.
x = cp.Variable(1)
constraints = [cp.square(x)<=1]
objective = cp.Minimize(0)
prob = cp.Problem(objective, constraints)
prob.solve(solver=cp.MOSEK, verbose=True, save_file="dump.opf")
然后看一下文件dump.opf。您将看到 cvxpy 如何使用二次锥对二次约束建模以圆锥形式重新表述问题。本质上它变成:
(x1+1)^2 >= (x1-1)^2 + 4x0^2
x1 <= 1
但是必须添加一些辅助变量才能以 MOSEK 格式输入。
如果 opf 文件中的某些内容不清楚,MOSEK 文档https://www.mosek.com/documentation/将提供详细信息。