IMSL_LINLSQ
Syntax | Return Value | Arguments | Keywords | Discussion | Examples | Version History
The IMSL_LINLSQ function solves a linear least-squares problem with linear constraints.
Note
This routine requires an IDL Advanced Math and Stats license. For more information, contact your ITT Visual Information Solutions sales or technical support representative.
Syntax
Result = IMSL_LINLSQ( b, a, c, bl, bu, contype [, ABS_TOLERANCE=value]
[, /DOUBLE] [, ITMAX=value] [, REL_TOLERANCE=value] [, RESIDUAL=variable] [, XLB=array] [, XUB=array])
Return Value
One-dimensional array of length nca containing the approximate solution.
Arguments
a
Two-dimensional array of size nra by nca containing the coefficients of the least-squares equations, where nra is the number of least-squares equations and nca is the number of variables.
B
One-dimensional array of length nra containing the right-hand sides of the least-squares equations.
C
Two-dimensional array of size ncon by nca containing the coefficients of the constraints, where ncon is the number of constraints.
BL
One-dimensional array of length ncon containing the lower limit of the general constraints. If there is no lower limit on the i-th constraint, then bl(i) will not be referenced.
BU
One-dimensional array of length ncon containing the upper limit of the general constraints. If there is no upper limit on the i-th constraint, then bu(i) will not be referenced.
CONTYPE
One-dimensional array of length ncon indicating the type of constraints exclusive of simple bounds, where CONTYPE(i) = 0, 1, 2, 3 indicates =, ≤, ≥, and range constraints, respectively.
Keywords
ABS_TOLERANCE
Absolute rank determination tolerance to be used. Default: ABS_TOLERANCE = SQRT(machine epsilon).
DOUBLE
If present and nonzero, double precision is used.
ITMAX
Set the maximum number of iterations. Default: ITMAX = 5*max(nra, nca)
REL_TOLERANCE
Relative rank determination tolerance to be used. Default: REL_TOLERANCE = SQRT(machine epsilon).
RESIDUAL
Named variable into which an one-dimensional array containing the residuals b - Ax of the least-squares equations at the approximate solution is stored.
XLB
One-dimensional array of length nca containing the lower bound on the variables. If there is no lower bound on the i-th variable, then Xlb(i) should be set to 1.0e30.
XUB
One-dimensional array of length nca containing the upper bound on the variables. If there is no upper bound on the i-th variable, then XUB(i) should be set to -1.0e30.
Discussion
The IMSL_LINLSQ function solves linear least-squares problems with linear constraints. These are systems of least-squares equations of the form
Ax @ b
subject to
bl ≤ Cx ≤ bu
xl ≤ x ≤ xu
Here A is the coefficient matrix of the least-squares equations, b is the right-hand side, and C is the coefficient matrix of the constraints. The vectors bl, bu, xl and xu are the lower and upper bounds on the constraints and the variables, respectively. The system is solved by defining dependent variables y ≡ Cx and then solving the least-squares system with the lower and upper bounds on x and y. The equation Cx - y = 0 is a set of equality constraints. These constraints are realized by heavy weighting, i.e., a penalty method, Hanson (1986, pp. 826-834).
Examples
Example 1
This example solves the following problem in the least-squares sense:
3x1 + 2x2 + x3 = 3.3
4x1 +2x2 + x3 = 2.2
2x1 + 2x2 + x3 = 1.3
x1 + x2 + x3 = 1.0
Subject to:
x1 + x2 + x3 ≤ 1
0 ≤ x1 ≤ 0.5
0 ≤ x2 ≤ 0.5
0 ≤ x3 ≤ 0.5
a = TRANSPOSE([[3.0, 2.0, 1.0], [4.0, 2.0, 1.0], $ [2.0, 2.0, 1.0], [1.0, 1.0, 1.0]]) b = [3.3, 2.3, 1.3, 1.0] c = [[1.0], [1.0], [1.0]] xub = [0.5, 0.5, 0.5] xlb = [0.0, 0.0, 0.0] contype = [1] bc = [1.0] ; Note that only upper bound is set for contype =1. sol = IMSL_LINLSQ(b, a, c, bc, bc, contype, Xlb = xlb, Xub = xub) PM, sol, Title = 'Solution' 0.500000 0.300000 0.200000
Example 2
The same problem solved in the first example is solved again. This time residuals of the least-squares equations at the approximate solution are returned, and the norm of the residual vector is printed.
a = TRANSPOSE([[3.0, 2.0, 1.0], [4.0, 2.0, 1.0], $ [2.0, 2.0, 1.0], [1.0, 1.0, 1.0]]) b = [3.3, 2.3, 1.3, 1.0] c = [[1.0], [1.0], [1.0]] xub = [0.5, 0.5, 0.5] xlb = [0.0, 0.0, 0.0] contype = [1] bc = [1.0] sol = IMSL_LINLSQ(b, a, c, bc, bc, contype, Xlb = xlb, $ Xub = xub, Residual = residual) PM, sol, Title = 'Solution' Solution 0.500000 0.300000 0.200000 PM, residual, Title = 'Residual' Residual -1.00000 0.500000 0.500000 0.00000 PRINT, 'Norm of Residual =', IMSL_NORM(residual) Norm of Residual = 1.22474
Version History



