因此,我尝试使用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()
每次尝试运行此代码时,都会出现以下错误:
“正定约束中的非平方矩阵。”
但是矩阵显然是正方形的!所以我不知道发生了什么。 有任何想法吗? 非常感谢您的帮助!
答案 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
。