为什么此CVXPY表达式不是DCP?

时间:2019-12-03 06:51:38

标签: python-3.x cvxpy

我有这个简短的样本。

{
  "_id" : ObjectId("54fdfdfdf54fdfg5474"),
  "someField" : "something",
  "SomeString" : "something",
  "SomeMoreSting" : "SomeMore",
  "fields" : [{
      "name" : "apple",
      "value" : "200"
    }, {
      "name" : "orange",
      "value" : "43173678"
    }, {
      "name" : "banana",
      "value" : "20.25"
    }]
}

但是它说..

sysclk.value = 320e6

ddsdiv = cp.Variable(integer = True,                    # DDS divisor
         name = 'ddsdiv')
ddsdivpos = cp.Variable(pos = True)                     # Constrain to be positive

ddsclk = cp.Variable(pos = True, name = 'ddsclk')       # Resulting clock

constraints = [
        ddsdiv == ddsdivpos,                            # Constrain DDS divisor to be positive
        sysclk == ddsclk * ddsdiv,                      # Compute DDS clock
        ]
objective = cp.Minimize(cp.abs(ddsclk - 10e6))
prob = cp.Problem(objective, constraints);

prob.solve()
print(ddsclk.value)

类似地,如果我尝试(较幼稚),它将失败。

DCPError: Problem does not follow DCP rules. Specifically:
The following constraints are not DCP:
sysclk == ddsclk * ddsdiv , because the following subexpressions are not:
|--  ddsclk * ddsdiv

它还会发出DCPError。

我不明白如何用正数除以正整数不能使我的凸数变大(但我的数学不是很好:)

我在MacOSX 10.14.6上使用CVXPY 1.0.25,Python 3.7.5。

谢谢。

1 个答案:

答案 0 :(得分:1)

比方说,您的约束是x * y == 9,其中xy是(连续)变量。该方程的解集必须为convex set。我们可以通过采取两个解并检查这两个解之间的所有点是否也在集合中来检验这是否是凸的。

(1,9)是一个解(如(x,y)),而(9,1)是一个解。但是,这些解决方案(5,5)之间的中点不是解决方案。我们找到了一个反例,因此这不是凸集。

最终,由于这不是凸的,因此无法使其满足DCP。您需要重新构造问题以使其凸出或更易于解决。