我正在做boyd MOOC,CVX101,我正在尝试用Python语言做第三个家庭作业,我遇到了一些问题
我们必须解决下面的程序

我们使用以下命令生成数据:
# ---- Data Generation ---- #
np.random.seed(5)
n = 20
# Covariance matrix
S = np.random.rand(n,n)
S = S.T.dot(S)
S = S/np.max(np.abs(np.diag(S)))*.2
S[:,-1] = 0
S[-1,:] = 0
# Uniform weight vector
x_unif = np.ones((n,1)) / n
# Price vector
pbar = np.ones((n,1))*.03 + np.array(np.append(np.random.rand(n-1,1),0)).reshape((-1,1))*.12我做了什么
from cvxpy import quad_form
from cvxpy import sum as cvxsum
x_unconstrained = cp.Variable(n)
constraints = [cvxsum(x_unconstrained) == 1,
pbar.T * x_unconstrained == x_unif.T * pbar
]
obj_3 = cp.Minimize(quad_form(x_unconstrained, S))
prob = cp.Problem(obj_3, constraints)
prob.solve()
print("status:", prob.status)
print("optimal value", prob.value)
print("optimal var", x_unconstrained.value)这是我得到的结果
status: infeasible
optimal value inf
optimal var None顺便说一句,我在matlab中有解决方案。
simple_portfolio_data;
%% part i
%minimum-risk unconstrained portfolio
%with same expected return as uniform
%allocation
cvx_begin
cvx_quiet(true)
variable x_unconstrained(n)
minimize(quad_form(x_unconstrained,S))
subject to
sum(x_unconstrained)==1;
pbar’*x_unconstrained==x_unif’*pbar;
cvx_end发布于 2019-04-21 05:07:28
我想你打算用x_unif'和pbar做一个矩阵乘法。令人困惑的是,由于这两个数组都是numpy数组,因此使用*运算符将尝试进行元素级乘法,并在可能的情况下进行广播。因此,其形状
(x_unif.T * pbar).shape是(20, 20)。所以你只需要用一个矩阵乘法来代替它。如果您使用的是Python 3.5或更高版本,则可以执行以下操作:
x_unif.T @ pbar否则,这将在任何地方都有效:
np.dot(x_unif.T, pbar)那么你应该会得到一个可行的结果:
status: optimal
optimal value 6.593319112947055e-06
optimal var [-0.04367061 0.14013956 -0.165039 0.11715289 0.26894204 0.19991486
-0.18222916 -0.06746431 -0.28428226 -0.1740003 0.14624092 -0.29178846
0.0979433 0.02320117 -0.29351406 0.06030019 0.13121461 0.14653953
0.24223093 0.92816817]https://stackoverflow.com/questions/55748647
复制相似问题