0

我想将以下 SDP(仅验证约束的可行性)从 CVX(MATLAB)转换为 CVXPY(Python):

Ah = [1.0058, -0.0058; 1, 0];
Bh = [-1; 0];
Ch = [1.0058, -0.0058; -0.9829, 0.0056];
Dh = [-1; 1];

M = [0, 1;1, 0];
ni = size(M,1)/2;
n = size(Ah,1);
rho = 0.5;

cvx_begin sdp quiet
    variable P(n,n) semidefinite
    variable lambda(ni) nonnegative
    Mblk = M*kron(diag(lambda),eye(2));
    lambda(ni) == 1  % break homogeneity (many ways to do this...)
    [Ah Bh]'*P*[Ah Bh] - rho^2*blkdiag(P,0) + [Ch Dh]'*Mblk*[Ch Dh] <= 0
cvx_end


switch cvx_status
    case 'Solved'
        feas = 1;
    otherwise
        feas = 0;
end

下面是我的 Python 代码,

import cvxpy as cvx
import numpy as np
import scipy as sp


Ah = np.array([[1.0058, -0.0058], [1, 0]])
Bh = np.array([[-1], [0]])
Ch = np.array([[1.0058, -0.0058], [-0.9829, 0.0056]])
Dh = np.array([[-1], [1]])

M = np.array([[0, 1], [1, 0]])
ni, n = M.shape[0] / 2, Ah.shape[0]
rho = 0.5

P = cvx.Semidef(n)
lamda = cvx.Variable()

Mblk = np.dot(M, np.kron(cvx.diag(lamda), np.eye(2)))
ABh = np.concatenate((Ah, Bh), axis=1)
CDh = np.concatenate((Ch, Dh), axis=1)
constraints = [lamda[-1] == 1,
               np.dot(ABh.T, np.dot(P, ABh)) - rho**2*np.linalg.block_diag(P, 0) +
               np.dot(CDh.T, np.dot(Mblk, CDh)) << 0]

prob = cvx.Problem(cvx.Minimize(1), constraints)
feas = prob.status is cvx.OPTIMAL

运行程序时有几个错误。1.当我打印Mblk时,它显示

回溯(最近一次通话最后):

文件“/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py”,第 2820 行,在 run_code

Out[1]: exec code_obj in self.user_global_ns, self.user_ns

文件“”,第 1 行,在

mblk

文件“/usr/lib/python2.7/dist-packages/IPython/core/displayhook.py”,第 247 行,调用中

format_dict, md_dict = self.compute_format_data(结果)

文件“/usr/lib/python2.7/dist-packages/IPython/core/displayhook.py”,第 157 行,compute_format_data

返回 self.shell.display_formatter.format(结果)

文件“/usr/lib/python2.7/dist-packages/IPython/core/formatters.py”,第 152 行,格式

数据 = 格式化程序(obj)

文件“/usr/lib/python2.7/dist-packages/IPython/core/formatters.py”,第 481 行,调用中

打印机.漂亮(obj)

文件“/usr/lib/python2.7/dist-packages/IPython/lib/pretty.py”,第 362 行,漂亮

return _default_pprint(obj, self, cycle)

_default_pprint 中的文件“/usr/lib/python2.7/dist-packages/IPython/lib/pretty.py”,第 482 行

p.text(repr(obj))

array_repr 中的文件“/usr/lib/python2.7/dist-packages/numpy/core/numeric.py”,第 1553 行

', ', “大批(”)

文件“/usr/lib/python2.7/dist-packages/numpy/core/arrayprint.py”,第 454 行,在 array2string 中

分隔符,前缀,格式化程序=格式化程序)

_array2string 中的文件“/usr/lib/python2.7/dist-packages/numpy/core/arrayprint.py”,第 256 行

'int':整数格式(数据),

文件“/usr/lib/python2.7/dist-packages/numpy/core/arrayprint.py”,第 641 行,在init

max_str_len = max(len(str(maximum.reduce(data))),

文件“/usr/local/lib/python2.7/dist-packages/cvxpy/constraints/leq_constraint.py”,第 67 行,非零

引发异常(“无法评估约束的真值。”)

例外:无法评估约束的真值。

当我踏上这条线时,

  constraints = [lamda[-1] == 1,
                   np.dot(ABh.T, np.dot(P, ABh)) - rho**2*np.linalg.block_diag(P, 0) +
                   np.dot(CDh.T, np.dot(Mblk, CDh)) << 0]

表明

Traceback(最近一次通话最后一次):文件

“.../sdp.py”,第 22 行,在

np.dot(ABh.T, np.dot(P, ABh)) - rho**2*np.linalg.block_diag(P, 0) + 

ValueError:使用序列设置数组元素。

如何解决这些问题?

4

1 回答 1

5

您的代码的最大问题是您不能在 CVXPY 对象上使用 NumPy 函数。您需要使用等效的 CVXPY 函数。这是您的代码的工作版本:

import cvxpy as cvx
import numpy as np
import scipy as sp


Ah = np.array([[1.0058, -0.0058], [1, 0]])
Bh = np.array([[-1], [0]])
Ch = np.array([[1.0058, -0.0058], [-0.9829, 0.0056]])
Dh = np.array([[-1], [1]])

M = np.array([[0, 1], [1, 0]])
ni, n = M.shape[0] / 2, Ah.shape[0]
rho = 0.5

P = cvx.Semidef(n)
lamda = cvx.Variable()

Mblk = M*lamda*np.eye(2)
ABh = cvx.hstack(Ah, Bh)
CDh = cvx.hstack(Ch, Dh)
zeros = np.zeros((n,1))
constraints = [lamda[-1] == 1,
               ABh.T*P*ABh - rho**2*cvx.bmat([[P,zeros],[zeros.T, 0]]) +
               CDh.T*Mblk*CDh << 0]

prob = cvx.Problem(cvx.Minimize(1), constraints)
prob.solve()
feas = prob.status is cvx.OPTIMAL

我删除了 kron 函数,因为它在这里没有做任何事情,而且 CVXPY 目前不支持左侧可变的 Kronecker 产品。如果你需要,我可以添加它。

于 2016-04-25T03:43:54.823 回答