# lsei: Least Squares and Quadratic Programming under Equality and... In lsei: Solving Least Squares or Quadratic Programming Problems under Equality/Inequality Constraints

## Description

These functions can be used for solving least squares or quadratic programming problems under general equality and/or inequality constraints.

## Usage

 ```1 2 3 4``` ```lsei(a, b, c=NULL, d=NULL, e=NULL, f=NULL, lower=-Inf, upper=Inf) lsi(a, b, e=NULL, f=NULL, lower=-Inf, upper=Inf) ldp(e, f) qp(q, p, c=NULL, d=NULL, e=NULL, f=NULL, lower=-Inf, upper=Inf, tol=1e-15) ```

## Arguments

 `a` Design matrix. `b` Response vector. `c` Matrix of numeric coefficients on the left-hand sides of equality constraints. If it is NULL, `c` and `d` are ignored. `d` Vector of numeric values on the right-hand sides of equality constraints. `e` Matrix of numeric coefficients on the left-hand sides of inequality constraints. If it is NULL, `e` and `f` are ignored. `f` Vector of numeric values on the right-hand sides of inequality constraints. `lower, upper` Bounds on the solutions, as a way to specify such simple inequality constraints. `q` Matrix of numeric values for the quadratic term of a quadratic programming problem. `p` Vector of numeric values for the linear term of a quadratic programming problem. `tol` Tolerance, for calculating pseudo-rank in `qp`.

## Details

The `lsei` function solves a least squares problem under both equality and inequality constraints. It is an implementation of the LSEI algorithm described in Lawson and Hanson (1974, 1995).

The `lsi` function solves a least squares problem under inequality constraints. It is an implementation of the LSI algorithm described in Lawson and Hanson (1974, 1995).

The `ldp` function solves a least distance programming problem under inequality constraints. It is an R wrapper of the LDP function which is in Fortran, as described in Lawson and Hanson (1974, 1995).

The `qp` function solves a quadratic programming problem, by transforming the problem into a least squares one under the same equality and inequality constraints, which is then solved by function `lsei`.

The NNLS and LDP Fortran implementations used internally is downloaded from http://www.netlib.org/lawson-hanson/.

Given matrices `a`, `c` and `e`, and vectors `b`, `d` and `f`, function `lsei` solves the least squares problem under both equality and inequality constraints:

minimize || a x - b ||,

subject to c x = d, e x >= f.

Function `lsi` solves the least squares problem under inequality constraints:

minimize || a x - b ||,

subject to e x >= f.

Function `ldp` solves the least distance programming problem under inequality constraints:

minimize || x ||,

subject to e x >= f.

Function `qp` solves the quadratic programming problem:

minimize 0.5 x^T q x + p^T x,

subject to c x = d, e x >= f.

## Value

A vector of the solution values

## Author(s)

Yong Wang <yongwang@auckland.ac.nz>

## References

Lawson and Hanson (1974, 1995). Solving least squares problems. Englewood Cliffs, N.J., Prentice-Hall.

`nnls`,`hfti`.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36``` ```beta = c(rnorm(2), 1) beta[beta<0] = 0 beta = beta / sum(beta) a = matrix(rnorm(18), ncol=3) b = a %*% beta + rnorm(3,sd=.1) c = t(rep(1, 3)) d = 1 e = diag(1,3) f = rep(0,3) lsei(a, b) # under no constraint lsei(a, b, c, d) # under eq. constraints lsei(a, b, e=e, f=f) # under ineq. constraints lsei(a, b, c, d, e, f) # under eq. and ineq. constraints lsei(a, b, rep(1,3), 1, lower=0) # same solution q = crossprod(a) p = -drop(crossprod(b, a)) qp(q, p, rep(1,3), 1, lower=0) # same solution ## Example from Lawson and Hanson (1974), p.140 a = cbind(c(.4302,.6246), c(.3516,.3384)) b = c(.6593, .9666) c = c(.4087, .1593) d = .1376 lsei(a, b, c, d) # Solution: -1.177499 3.884770 ## Example from Lawson and Hanson (1974), p.170 a = cbind(c(.25,.5,.5,.8),rep(1,4)) b = c(.5,.6,.7,1.2) e = cbind(c(1,0,-1),c(0,1,-1)) f = c(0,0,-1) lsi(a, b, e, f) # Solution: 0.6213152 0.3786848 ## Example from Lawson and Hanson (1974), p.171: e = cbind(c(-.207,-.392,.599), c(2.558, -1.351, -1.206)) f = c(-1.3,-.084,.384) ldp(e, f) # Solution: 0.1268538 -0.2554018 ```