Search code examples
rquadprog

R error QP:not a positive definite matrix?


Im trying to solve the following problem in R, using the quadprog package:

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

where

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)

I've used

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

but I keep getting the following error:

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

However, cleary

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

What am I doing wrong? How come this error keeps showing up?


Solution

  • Your matrix mat is not symmetric. The quadprog package is designed to solve quadratic programs, which by definition, require a symmetric matrix in the highest order term. See here, for example.

    To solve this problem as written, you will need to use a general constrained optimization algorithm. For example, you can try constrOptim as so:

    # 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))