为什么在使用 cvxpy 时会出现 "disciplined convex programming" 错误?

Why am I getting a "disciplined convex programming" error when using cvxpy?

import cvxpy as cp
import numpy as np

n = 3
PP = cp.Variable((n,n),"PP")
KK = [[2,1,3],[1,2,1],[3,1,2]]
s = np.array([[.1, .4, .5]]).T
t = np.array([[.4, .2, .4]]).T
e = np.ones((n,1))
x = PP.T@e - s
y = PP@e - t
for b in range(1,21):
    obj = (1/4/b) * (cp.quad_form(x,KK) + cp.quad_form(y,KK)) - cp.trace(KK@PP) 
    prob = cp.Problem(cp.Minimize(obj),[PP>=0,cp.sum(PP)==1])
    obj=prob.solve()
    print("status:",prob.status)
    print("obj:",obj)
    print(PP.value)

当我运行这个时,我得到

cvxpy.error.DCPError: Problem does not follow DCP rules. Specifically:
The objective is not DCP. Its following subexpressions are not:
QuadForm(PP.T * [[1.]
 [1.]
 [1.]] + -[[0.1]
 [0.4]
 [0.5]], [[2. 1. 3.]
 [1. 2. 1.]
 [3. 1. 2.]])

当我的矩阵 KK 显然是 PSD 时,我不明白为什么会出现此错误。为什么会这样?

此处重复 https://scicomp.stackexchange.com/q/34657/34383

编辑:我说得太早了。您的矩阵 KK 不是 PSD(它的特征值为 -1)。对于看到这个问题的矩阵在数学上应该是 PSD 的人,我在下面留下了我的原始答案。

您的矩阵在数值上可能不完全是 PSD,尽管在数学上是这样。这是 CVXPY 的四边形原子的限制(我们稍后可能会尝试解决)。

现在,您可以取 K 的(矩阵)平方根 sqrt_K(使用,例如,scipy.linalg.sqrtm),并将 quad_form 原子替换为 cp.sum_squares(sqrt_K @ y).