我试图使用r来解决我的投资组合优化类的二次规划问题。我想将我的答案与书中的答案进行比较
这是问题所在:
min: t(c)%*%x + .5*t(x)%*%BigC%*%x
st: -x <=0, i=1...5
and: sum(x)=1
这是我的代码:
A = matrix( c( 1,1,1,1,1, -1,0,0,0,0, 0,-1,0,0,0, 0,0,-1,0,0, 0,0,0,-1,0, 0,0,0,0,-1), ncol=5, byrow=T)
b = matrix( c( 1,0,0,0,0,0), ncol=1)
c = matrix( c( 1,-2,3,-4,5), ncol=1)
BigC = matrix( c( 1,0,0,0,0, 0,2,0,0,0, 0,0,3,0,0, 0,0,0,4,0, 0,0,0,0,5), ncol=5, byrow=T)
x0 = matrix( c( 0.2,0.2,0.2,0.2,0.2), ncol=1)
n = 5
m = 5
q = 1
solve.QP( Dmat=BigC, dvec=t(c), Amat=t(A), bvec=t(b), meq=1)
但它会引发以下错误:
Error in solve.QP(Dmat = BigC, dvec = t(c), Amat = t(A), bvec = t(b), :
constraints are inconsistent, no solution!
非常感谢任何帮助。谢谢!
答案 0 :(得分:3)
?solve.QP
doc提及
具有约束A ^ T b> = b_0的形式min(-d ^ T b + 1/2 b ^ T D b)的问题。
所以你至少有两件事是错的:
A
中用于表达x_i >= 0
约束dvec
应为-t(c)
我们还要提一下
quadprog
包,solve.QP
采用向量,因此您无需创建矩阵并对其进行转置,c
,因为它是R中常用函数的名称,diag
功能。考虑到所有这些,这就是你要找的东西:
library(quadprog)
A <- rbind(rep(1, 5), diag(5))
b <- c( 1,0,0,0,0,0)
tc <- c( 1,-2,3,-4,5)
BigC <- diag(1:5)
solve.QP(Dmat = BigC, dvec = -tc, Amat = t(A), bvec = b, meq = 1)