在 CVXPY 中阻止 LMI

Block LMI in CVXPY

我想将 LMI 约束优化问题从 Matlab 转换为 Python。在阅读 CVXPY 文档时,我发现我可以通过创建矩阵变量并添加相应的约束来定义 LMI 约束问题。但是,我需要使用以下块 LMI,而不是通过简单的 LMI 来约束问题:

其中PL是矩阵变量,gamma是标量。其他符号是动态系统的状态 space 矩阵。

是否可以在CVXPY中使用这种LMI作为约束?如果没有,是否有任何其他工具可以让我在 Python 中解决这个问题?

我遵循了 Rodrigo de Azevedo 发布的示例,并设法在 cvxpy 中编写了给定的 LMI。

供参考,我写的代码,可能对某人有帮助:

n = A.shape[0]

L = Variable((B2.shape[1], n))
P = Variable((n, n), PSD=True)
gamma2 = Variable()

LMI1 = bmat([
        [P, A*P + B2*L, B1, np.zeros((B1.shape[0], D11.shape[0]))],
        [P*A.T + L.T * B2.T, P, np.zeros((P.shape[0], B1.shape[1])), P*C1.T + L.T*D12.T],
        [B1.T, np.zeros((B1.shape[1], P.shape[1])), np.eye(B1.shape[1]), D11.T],
        [np.zeros((C1.shape[0], B1.shape[0])), C1*P + D12*L, D11, gamma2*np.eye(D11.shape[0])]
          ])

cons1 = LMI1 >> 0

cons2 = P == P.T
cons3 = gamma2 >= 0

然后,解决问题:

optprob = Problem(Minimize(gamma2), constraints=[cons1, cons2, cons3])
optprob.solve()

norm = np.sqrt(gamma2.value)
Pop = P.value
Lop = L.value