I got interested in enabling the full funcionality that MATLAB's lsqlin() has, that is with equality and bound constraints. To replace an equality constraint with two inequality constraints will not work with solve.QP() because it requires positive definite matrices. I will use kernlab::ipop() instead.
To handle the full MATLAB example, add the following simple linear equality constraint 3x1 + 5x2 + 7x3 + 9x4 = 4 to the example above, plus lower and upper bounds -0.1 and 2.0 for all x_i. C <- matrix(c( 0.9501, 0.7620, 0.6153, 0.4057, 0.2311, 0.4564, 0.7919, 0.9354, 0.6068, 0.0185, 0.9218, 0.9169, 0.4859, 0.8214, 0.7382, 0.4102, 0.8912, 0.4447, 0.1762, 0.8936), 5, 4, byrow=TRUE) d <- c(0.0578, 0.3528, 0.8131, 0.0098, 0.1388) A <- matrix(c( 0.2027, 0.2721, 0.7467, 0.4659, 0.1987, 0.1988, 0.4450, 0.4186, 0.6037, 0.0152, 0.9318, 0.8462), 3, 4, byrow=TRUE) b <- c(0.5251, 0.2026, 0.6721) # Add the equality constraint to matrix A Aeq <- c(3, 5, 7, 9) beq <- 4 A1 <- rbind(A , c(3, 5, 7, 9)) b1 <- c(b, 4) lb <- rep(-0.1, 4) # lower and upper bounds ub <- rep( 2.0, 4) r1 <- c(1, 1, 1, 0) # 0 to force an equality constraint # Prepare for a quadratic solver Dmat <- t(C) %*% C dvec <- (t(C) %*% d) Amat <- -1 * A1 bvec <- -1 * b1 library(kernlab) s <- ipop(-dvec, Dmat, Amat, bvec, lb, ub, r1) s # An object of class "ipop" # Slot "primal": # [1] -0.09999885 -0.09999997 0.15990817 0.40895991 # ... x <- s@primal # [1] -0.1000 -0.1000 0.1599 0.4090 A1 %*% x - b1 <= 0 # i.e., A x <= b and 3x[1] + ... + 9x[4] = 4 sum((C %*% x - d)^2) # minimum: 0.1695 And this is exactly the solution that lsqlin() in MATLAB computes. On Thu, Aug 27, 2015 at 6:06 PM, Raubertas, Richard <richard_rauber...@merck.com> wrote: > Is it really that complicated? This looks like an ordinary quadratic > programming problem, and 'solve.QP' from the 'quadprog' package seems to > solve it without user-specified starting values: > > library(quadprog) > Dmat <- t(C) %*% C > dvec <- (t(C) %*% d) > Amat <- -1 * t(A) > bvec <- -1 * b > > rslt <- solve.QP(Dmat, dvec, Amat, bvec) > sum((C %*% rslt$solution - d)^2) > > [1] 0.01758538 > > Richard Raubertas > Merck & Co. > ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.