0

我尝试使用 quadprog 包解决 R 中的以下问题:

min: vec %*% p + t(p) %*% mat %*% p 
st: p >= 0

在哪里

mat <- matrix(c(1162296,0,0,0,0,1,0,0,951.7089,0,1,0,-951.7089,0,0,1),4)
vec <- c(6341934541.1,175800.1,-356401.7,14398073047.1)

我用过

libary(quadprog)
solve.QP(2*mat,-vec, diag(4), integer(4))

但我不断收到以下错误:

Error in solve.QP(2*mat, -vec, diag(4), integer(4)) : 
  matrix D in quadratic function is not positive definite!

然而,清

> eigen(mat)$values > 0
[1] TRUE TRUE TRUE TRUE

我究竟做错了什么?这个错误怎么一直出现?

4

1 回答 1

1

你的矩阵mat不是对称的。该quadprog软件包旨在解决二次程序,根据定义,二次程序需要最高阶项的对称矩阵。例如,请参见此处。

为了解决这个问题,你需要使用一个通用的约束优化算法。例如,您可以constrOptim这样尝试:

# system matrices
mat <- matrix(c(1162296,0,0,0,0,1,0,0,951.7089,0,1,0,-951.7089,0,0,1),4)
vec <- c(6341934541.1,175800.1,-356401.7,14398073047.1)

# an initial value
p0 <- c(1,1,1,1)

# the objective function
objective <- function(p) {
  vec %*% p + t(p) %*% mat %*% p
}

# solve -- warning!  without additional work you won't know if this is a global minimum solution.
solution <- constrOptim(p0, objective, NULL, diag(4), c(0,0,0,0))
于 2017-03-25T17:12:43.070 回答