[R] lsqlin in R package pracma

Hans W Borchers hwborchers at gmail.com
Fri Aug 28 12:56:57 CEST 2015


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 at 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_raubertas at 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.
>



More information about the R-help mailing list