【问题标题】:Implement LMI constraint with CVXPY使用 CVXPY 实现 LMI 约束
【发布时间】:2019-06-02 10:40:38
【问题描述】:

所以我正在尝试使用 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()

每次我尝试运行此代码时,都会收到以下错误:

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

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

【问题讨论】:

标签: python cvxpy convex-optimization


【解决方案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

【讨论】:

  • 谢谢,这似乎有效。但这是用仿射变量对所有 LMI 建模的最佳方法吗?如果您有 10 个变量(gamma_1、gamma_2 等),该怎么办。
  • 如果您需要对整个矩阵施加结构(如半定)并在矩阵中具有变量的结构,我不知道更简单的方法(不是说它没有' t 存在)。您可能会使代码比我在此处提供的更具可读性。
  • 谢谢。是的,我想我会针对更复杂的问题重新发布一个问题,看看如何解决。
【解决方案2】:

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

技术问题

问题是你的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多