Raw File
lsqlincon.Rd
\name{lsqlincon}
\alias{lsqlincon}
\title{
  Linear Least-Squares Fitting with linear constraints
}
\description{
  Solves linearly constrained linear least-squares problems.
}
\usage{
lsqlincon(C, d,  A = NULL, b = NULL,
          Aeq = NULL, beq = NULL, lb = NULL,  ub = NULL)
}
\arguments{
  \item{C}{\code{mxn}-matrix defining the least-squares problem.}
  \item{d}{vector or a one colum matrix with \code{m} rows}
  \item{A}{\code{pxn}-matrix for the linear inequality constraints.}
  \item{b}{vector or \code{px1}-matrix, right hand side for the constraints.}
  \item{Aeq}{\code{qxn}-matrix for the linear equality constraints.}
  \item{beq}{vector or \code{qx1}-matrix, right hand side for the constraints.}
  \item{lb}{lower bounds, a scalar will be extended to length n.}
  \item{ub}{upper bounds, a scalar will be extended to length n.}
}
\details{
  \code{lsqlincon(C, d, A, b, Aeq, beq, lb, ub)} minimizes \code{||C*x - d||}
  (i.e., in the least-squares sense) subject to the following constraints:
  \code{A*x <= b}, \code{Aeq*x = beq}, and \code{lb <= x <= ub}.

  It applies the quadratic solver in \code{quadprog} with an active-set
  method for solving quadratic programming problems.

  If some constraints are \code{NULL} (the default), they will not be taken
  into account. In case no constraints are given at all, it simply uses
  \code{qr.solve}.
}
\value{
  Returns the least-squares solution as a vector.
}
\note{
  Function \code{lsqlin} in \code{pracma} solves this for equality constraints
  only, by computing a base for the nullspace of \code{Aeq}. But for linear
  inequality constraints there is no simple linear algebra `trick', thus a real
  optimization solver is needed.
}
\author{
  HwB  email: <hwborchers@googlemail.com>
}
\references{
  Trefethen, L. N., and D. Bau III. (1997). Numerical Linear Algebra.
  SIAM, Society for Industrial and Applied Mathematics, Philadelphia.
}
\seealso{
  \code{\link{lsqlin}}, \code{quadprog::solve.QP}
}
\examples{
##  MATLABs lsqlin example
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)
Aeq <- matrix(c(3, 5, 7, 9), 1)
beq <- 4
lb <- rep(-0.1, 4)   # lower and upper bounds
ub <- rep( 2.0, 4)

x <- lsqlincon(C, d, A, b, Aeq, beq, lb, ub)
# -0.1000000 -0.1000000  0.1599088  0.4089598
# check A %*% x - b >= 0
# check Aeq %*% x - beq == 0
# check sum((C %*% x - d)^2)    # 0.1695104
}
\keyword{ optimize }
back to top