使用CVXPY实施LMI约束

时间:2019-06-02 10:40:38

标签: python cvxpy convex-optimization

因此,我尝试使用CVXPY包(具有线性矩阵不等式约束的优化问题)在Python中实现简单的优化代码。代码如下所示。

我尝试使用Python 3.6运行代码。

import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
import control as cs

gamma = cp.Variable();
MAT1 = np.array([[1, gamma], [1+gamma, 3]])

constraints_2 = [MAT1 >> 0]
prob = cp.Problem(cp.Minimize(gamma),constraints_2)
prob.solve()

每次尝试运行此代码时,都会出现以下错误:

“正定约束中的非平方矩阵。”

但是矩阵显然是正方形的!所以我不知道发生了什么。 有任何想法吗? 非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

MAT1是一个numpy数组,您需要将其设置为cvxpy变量才能使用半定约束。试试这个:

MAT1 = cp.Variable((2, 2))
constraints_2 = [MAT1 >> 0, MAT1[0, 0] == 1, MAT1[1, 0] == 1 + MAT1[0, 1], MAT1[1, 1] == 3]
prob = cp.Problem(cp.Minimize(MAT1[0, 1]), constraints_2)

gamma大约是-2.73

答案 1 :(得分:1)

这里有一个技术和概念问题

技术问题

问题是你的 MAT1 不是一个 numpy 数组

你可以写

MAT1=cvxpy.vstack([cvxpy.hstack([1 , gamma]), cvxpy.hstack([1+gamma, 3])])

或者更简洁

MAT1=cvxpy.vstack([cvxpy.hstack([1 , gamma]), cvxpy.hstack([1+gamma, 3])])

这样 cvxpy 将接受您的代码,但不会给出正确答案。

概念问题

SDP 问题仅对于对称矩阵是凸的,cvxpy 将做的是使其对称(显然是通过将其添加到转置中)。给出的解决方案是最小 gamma 使得 [[1, 0.5+gamma], [0.5+gamma, 3]] >> 0