我想将以下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中 Out1: code_obj in self.user_global_ns,self.user_ns 文件"",第1行,在 姆布克 文件"/usr/lib/python2.7/dist-packages/IPython/core/displayhook.py",第247行,在call中 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,在call中 printer.pretty(obj) 文件"/usr/lib/python2.7/dist-packages/IPython/lib/pretty.py",第362行,以pretty格式 返回_default_pprint(obj,self,循环) 文件"/usr/lib/python2.7/dist-packages/IPython/lib/pretty.py",第482行,在_default_pprint中 p.text(repr(obj)) 文件"/usr/lib/python2.7/dist-packages/numpy/core/numeric.py",第1553行,在array_repr中 “,”数组(“) 文件"/usr/lib/python2.7/dist-packages/numpy/core/arrayprint.py",第454行,在array2string中 分隔符,前缀,formatter=formatter) 文件"/usr/lib/python2.7/dist-packages/numpy/core/arrayprint.py",第256行,在_array2string中 ‘'int’:IntegerFormat(数据), 文件"/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]它显示了
追溯(最近一次调用):File “./sdp.py”,第22行 np.dot(ABh.T,np.dot(P,ABh)) - rho**2*np.linalg.block_diag(P,0) + ValueError:用序列设置数组元素。
如何解决这些问题?
发布于 2016-04-25 03:43:54
代码的主要问题是不能在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产品。如果你需要的话我可以加进去。
https://stackoverflow.com/questions/36755392
复制相似问题