PDF version (NAG web site
, 64-bit version, 64-bit version)
NAG Toolbox: nag_linsys_real_gen_sparse_lsqsol (f04qa)
Purpose
nag_linsys_real_gen_sparse_lsqsol (f04qa) solves sparse nonsymmetric equations, sparse linear least squares problems and sparse damped linear least squares problems, using a Lanczos algorithm.
Syntax
[
b,
x,
se,
itnlim,
itn,
anorm,
acond,
rnorm,
arnorm,
xnorm,
user,
inform,
ifail] = f04qa(
n,
b,
aprod,
damp,
atol,
btol,
conlim,
itnlim,
msglvl, 'm',
m, 'user',
user)
[
b,
x,
se,
itnlim,
itn,
anorm,
acond,
rnorm,
arnorm,
xnorm,
user,
inform,
ifail] = nag_linsys_real_gen_sparse_lsqsol(
n,
b,
aprod,
damp,
atol,
btol,
conlim,
itnlim,
msglvl, 'm',
m, 'user',
user)
Description
nag_linsys_real_gen_sparse_lsqsol (f04qa) can be used to solve a system of linear equations
where
is an
by
sparse nonsymmetric matrix, or can be used to solve linear least squares problems, so that
nag_linsys_real_gen_sparse_lsqsol (f04qa) minimizes the value
given by
where
is an
by
sparse matrix and
denotes the Euclidean length of
so that
. A damping argument,
, may be included in the least squares problem in which case
nag_linsys_real_gen_sparse_lsqsol (f04qa) minimizes the value
given by
is supplied as the argument
damp and should of course be zero if the solution to problems
(1) or
(2) is required. Minimizing
in
(3) is often called ridge regression.
nag_linsys_real_gen_sparse_lsqsol (f04qa) is based upon algorithm LSQR (see
Paige and Saunders (1982a) and
Paige and Saunders (1982b)) and solves the problems by an algorithm based upon the Lanczos process. The function does not require
explicitly, but
is specified via
aprod which must perform the operations
and
for a given
-element vector
and
element vector
. A argument to
aprod specifies which of the two operations is required on a given entry.
The function also returns estimates of the standard errors of the sample regression coefficients (
, for
) given by the diagonal elements of the estimated variance-covariance matrix
. When problem
(2) is being solved and
is of full rank, then
is given by
and when problem
(3) is being solved then
is given by
Let
denote the matrix
let
denote the residual vector
corresponding to an iterate
, so that
is the function being minimized, and let
denote the Frobenius (Euclidean) norm of
. Then the function accepts
as a solution if it is estimated that one of the following two conditions is satisfied:
where
and
are user-supplied tolerances which estimate the relative errors in
and
respectively. Condition
(6) is appropriate for compatible problems where, in theory, we expect the residual to be zero and will be satisfied by an acceptable solution
to a compatible problem. Condition
(7) is appropriate for incompatible systems where we do not expect the residual to be zero and is based on the observation that, in theory,
when
is a solution to the least squares problem, and so
(7) will be satisfied by an acceptable solution
to a linear least squares problem.
The function also includes a test to prevent convergence to solutions,
, with unacceptably large elements. This can happen if
is nearly singular or is nearly rank deficient. If we let the singular values of
be
then the condition number of
is defined as
where
is the smallest nonzero singular value of
and hence
is the rank of
. When
, then
is rank deficient, the least squares solution is not unique and
nag_linsys_real_gen_sparse_lsqsol (f04qa) will normally converge to the minimal length solution. In practice
will not have exactly zero singular values, but may instead have small singular values that we wish to regard as zero.
The function provides for this possibility by terminating if
where
is a user-supplied limit on the condition number of
. For problem
(1) termination with this condition indicates that
is nearly singular and for problem
(2) indicates that
is nearly rank deficient and so has near linear dependencies in its columns. In this case inspection of
,
and
, which are all returned by the function, will indicate whether or not an acceptable solution has been found. Condition
(8), perhaps in conjunction with
, can be used to try and ‘regularize’ least squares solutions. A full discussion of the stopping criteria is given in Section 6 of
Paige and Saunders (1982a).
Introduction of a nonzero damping argument
tends to reduce the size of the computed solution and to make its components less sensitive to changes in the data, and
nag_linsys_real_gen_sparse_lsqsol (f04qa) is applicable when a value of
is known
a priori. To have an effect,
should normally be at least
where
is the
machine precision. For further discussion see
Paige and Saunders (1982b) and the references given there.
Whenever possible the matrix should be scaled so that the relative errors in the elements of are all of comparable size. Such a scaling helps to prevent the least squares problem from being unnecessarily sensitive to data errors and will normally reduce the number of iterations required. At the very least, in the absence of better information, the columns of should be scaled to have roughly equal column length.
References
Paige C C and Saunders M A (1982a) LSQR: An algorithm for sparse linear equations and sparse least squares ACM Trans. Math. Software 8 43–71
Paige C C and Saunders M A (1982b) Algorithm 583 LSQR: Sparse linear equations and least squares problems ACM Trans. Math. Software 8 195–209
Parameters
Compulsory Input Parameters
- 1:
– int64int32nag_int scalar
-
, the number of columns of the matrix .
Constraint:
.
- 2:
– double array
-
The right-hand side vector .
- 3:
– function handle or string containing name of m-file
-
aprod must perform the operations
and
for given vectors
and
.
[mode, x, y, user] = aprod(mode, m, n, x, y, user, lruser, liuser)
Input Parameters
- 1:
– int64int32nag_int scalar
-
Specifies which operation is to be performed.
- aprod must compute .
- aprod must compute .
- 2:
– int64int32nag_int scalar
-
, the number of rows of .
- 3:
– int64int32nag_int scalar
-
, the number of columns of .
- 4:
– double array
-
The vector .
- 5:
– double array
-
The vector .
- 6:
– Any MATLAB object
- 7:
– int64int32nag_int scalar
- 8:
– int64int32nag_int scalar
aprod is called from
nag_linsys_real_gen_sparse_lsqsol (f04qa) with the object supplied to
nag_linsys_real_gen_sparse_lsqsol (f04qa).
Output Parameters
- 1:
– int64int32nag_int scalar
-
May be used as a flag to indicate a failure in the computation of
or
. If
mode is negative on exit from
aprod,
nag_linsys_real_gen_sparse_lsqsol (f04qa) will exit immediately with
ifail set to
mode.
- 2:
– double array
-
If
,
x must be unchanged.
If
,
x must contain
.
- 3:
– double array
-
If
,
y must contain
.
If
,
y must be unchanged.
- 4:
– Any MATLAB object
- 4:
– double scalar
-
The value
. If either problem
(1) or problem
(2) is to be solved, then
damp must be supplied as zero.
- 5:
– double scalar
-
The tolerance,
, of the convergence criteria
(6) and
(7); it should be an estimate of the largest relative error in the elements of
. For example, if the elements of
are correct to about
significant figures, then
atol should be set to about
. If
atol is supplied as less than
, where
is the
machine precision, then the value
is used instead of
atol.
- 6:
– double scalar
-
The tolerance,
, of the convergence criterion
(6); it should be an estimate of the largest relative error in the elements of
. For example, if the elements of
are correct to about
significant figures, then
btol should be set to about
. If
btol is supplied as less than
, then the value
is used instead of
btol.
- 7:
– double scalar
-
The value
of equation
(8); it should be an upper limit on the condition number of
.
conlim should not normally be chosen much larger than
. If
conlim is supplied as zero, then the value
is used instead of
conlim.
- 8:
– int64int32nag_int scalar
-
An upper limit on the number of iterations. If
, then the value
n is used in place of
itnlim, but for ill-conditioned problems a higher value of
itnlim is likely to be necessary.
- 9:
– int64int32nag_int scalar
-
The level of printing from
nag_linsys_real_gen_sparse_lsqsol (f04qa). If
, then no printing occurs, but otherwise messages will be output on the advisory message channel (see
nag_file_set_unit_advisory (x04ab)). A description of the printed output is given in
Printed output. The level of printing is determined as follows:
- No printing.
- A brief summary is printed just prior to return from nag_linsys_real_gen_sparse_lsqsol (f04qa).
- A summary line is printed periodically to monitor the progress of nag_linsys_real_gen_sparse_lsqsol (f04qa), together with a brief summary just prior to return from nag_linsys_real_gen_sparse_lsqsol (f04qa).
Optional Input Parameters
- 1:
– int64int32nag_int scalar
-
Default:
the dimension of the array
b.
, the number of rows of the matrix .
Constraint:
.
- 2:
– Any MATLAB object
user is not used by
nag_linsys_real_gen_sparse_lsqsol (f04qa), but is passed to
aprod. Note that for large objects it may be more efficient to use a global variable which is accessible from the m-files than to use
user.
Output Parameters
- 1:
– double array
-
- 2:
– double array
-
The solution vector .
- 3:
– double array
-
The estimates of the standard errors of the components of
. Thus
contains an estimate of
, where
is the
th diagonal element of the estimated variance-covariance matrix
. The estimates returned in
se will be the lower bounds on the actual estimated standard errors, but will usually be correct to at least one significant figure.
- 4:
– int64int32nag_int scalar
-
Unchanged unless
on entry, in which case it is set to
n.
- 5:
– int64int32nag_int scalar
-
The number of iterations performed.
- 6:
– double scalar
-
An estimate of
for the matrix
of
(4).
- 7:
– double scalar
-
An estimate of which is a lower bound.
- 8:
– double scalar
-
An estimate of
for the residual,
, of
(5) corresponding to the solution
returned in
x. Note that
is the function being minimized.
- 9:
– double scalar
-
An estimate of the
corresponding to the solution
returned in
x.
- 10:
– double scalar
-
An estimate of
for the solution
returned in
x.
- 11:
– Any MATLAB object
- 12:
– int64int32nag_int scalar
-
The reason for termination of
nag_linsys_real_gen_sparse_lsqsol (f04qa).
- The exact solution is . No iterations are performed in this case.
- The termination criterion of (6) has been satisfied with and as the values supplied in atol and btol respectively.
- The termination criterion of (7) has been satisfied with as the value supplied in atol.
- The termination criterion of (6) has been satisfied with and/or as the value , where is the machine precision. One or both of the values supplied in atol and btol must have been less than and was too small for this machine.
- The termination criterion of (7) has been satisfied with as the value . The value supplied in atol must have been less than and was too small for this machine.
The values
,
and
correspond to failure with
,
and
respectively (see
Error Indicators and Warnings) and when
ifail is negative
inform will be set to the same negative value.
- 13:
– int64int32nag_int scalar
unless the function detects an error (see
Error Indicators and Warnings).
Error Indicators and Warnings
Errors or warnings detected by the function:
Cases prefixed with W are classified as warnings and
do not generate an error of type NAG:error_n. See nag_issue_warnings.
- W
-
A negative value of
ifail indicates an exit from
nag_linsys_real_gen_sparse_lsqsol (f04qa) because you have set
mode negative in
aprod. The value of
ifail will be the same as your setting of
mode.
-
-
On entry, | , |
or | , |
or | , |
or | . |
-
-
The condition of
(8) has been satisfied for the value of
supplied in
conlim. If this failure is unexpected you should check that
aprod is working correctly. Although conditions
(6) or
(7) have not been satisfied, the values returned in
rnorm,
arnorm and
xnorm may nevertheless indicate that an acceptable solution has been reached.
-
-
The condition of
(8) has been satisfied for the value
, where
is the
machine precision. The matrix
is nearly singular or rank deficient and the problem is too ill-conditioned for this machine. If this failure is unexpected, you should check that
aprod is working correctly.
-
-
The limit on the number of iterations has been reached. The number of iterations required by nag_linsys_real_gen_sparse_lsqsol (f04qa) and the condition of the matrix can depend strongly on the scaling of the problem. Poor scaling of the rows and columns of should be avoided whenever possible.
-
An unexpected error has been triggered by this routine. Please
contact
NAG.
-
Your licence key may have expired or may not have been installed correctly.
-
Dynamic memory allocation failed.
Accuracy
When the problem is compatible, the computed solution
will satisfy the equation
where an estimate of
is returned in the argument
rnorm. When the problem is incompatible, the computed solution
will satisfy the equation
where an estimate of
is returned in the argument
arnorm. See also Section 6.2 of
Paige and Saunders (1982b).
Further Comments
The time taken by
nag_linsys_real_gen_sparse_lsqsol (f04qa) is likely to be principally determined by the time taken in
aprod, which is called twice on each iteration, once with
and once with
. The time taken per iteration by the remaining operations in
nag_linsys_real_gen_sparse_lsqsol (f04qa) is approximately proportional to
.
The Lanczos process will usually converge more quickly if
is pre-conditioned by a nonsingular matrix
that approximates
in some sense and is also chosen so that equations of the form
can efficiently be solved for
. For a discussion of pre-conditioning, see the
F11 Chapter Introduction. In the context of
nag_linsys_real_gen_sparse_lsqsol (f04qa), problem
(1) is equivalent to
and problem
(2) is equivalent to minimizing
Note that the normal matrix
so that the pre-conditioning
is equivalent to the pre-conditioning
of the normal matrix
.
Pre-conditioning can be incorporated into
nag_linsys_real_gen_sparse_lsqsol (f04qa) simply by coding
aprod to compute
and
in place of
and
respectively, and then solving the equations
for
on return from
nag_linsys_real_gen_sparse_lsqsol (f04qa). The quantity
should be computed by solving
for
and then computing
, and
should be computed by solving
for
and then forming
.
Description of the Printed Output
When
, then
nag_linsys_real_gen_sparse_lsqsol (f04qa) will produce output (except in the case where the function fails with
) on the advisory message channel (see
nag_file_set_unit_advisory (x04ab)).
When
then a summary line is printed periodically giving the following information:
Output |
Meaning |
ITN |
Iteration number, . |
X(1) |
The first element of the current iterate . |
FUNCTION |
The current value of the function, , being minimized. |
COMPAT |
An estimate of , where is the residual corresponding to . This value should converge to zero (in theory) if and only if the problem is compatible. COMPAT decreases monotonically. |
INCOMPAT |
An estimate of which should converge to zero if and only if at the solution is nonzero. INCOMPAT is not usually monotonic. |
NRM(ABAR) |
A monotonically increasing estimate of . |
COND(ABAR) |
A monotonically increasing estimate of the condition number . |
Example
This example solves the linear least squares problem
where
is the
by
matrix and
is the
element vector given by
with
.
Such a problem can arise by considering the Neumann problem on a rectangle
where
is the boundary of the rectangle, and discretizing as illustrated below with the square mesh
The by symmetric part of represents the difference equations and the final row comes from the normalizing condition. The example program has at all the internal mesh points, but apart from this is written in a general manner so that the number of rows (NROWS) and columns (NCOLS) in the grid can readily be altered.
Open in the MATLAB editor:
f04qa_example
function f04qa_example
fprintf('f04qa example results\n\n');
m = int64(13);
n = int64(12);
a = [ 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0;
0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0;
0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0;
-1, 0, -1, 4, -1, 0, 0, -1, 0, 0, 0, 0;
0, -1, 0, -1, 4, -1, 0, 0, -1, 0, 0, 0;
0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0;
0, 0, 0, -1, 0, 0, -1, 4, -1, 0, -1, 0;
0, 0, 0, 0, -1, 0, 0, -1, 4, -1, 0, -1;
0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0;
0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0;
0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1;
1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1];
b = zeros(m,1);
b(4:5) = -0.01;
b(8:9) = -0.01;
b(m) = 10;
damp = 0;
atol = 1e-05;
btol = 1e-04;
conlim = 10^6 - 10^-11;
itnlim = int64(100);
msglvl = int64(1);
[b, x, se, itnlim, itn, anorm, acond, rnorm, arnorm, xnorm, ...
ruser, inform, ifail] = ...
f04qa( ...
n, b, @aprod, damp, atol, btol, conlim, itnlim, msglvl, 'user', a);
fprintf('\n\nSolution is x:\n');
fprintf('%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f\n',x);
fprintf('\n\nNorm of the residual = %12.2e\n', rnorm);
function [mode, x, y, user] = aprod(mode, m, n, x, y, user)
if (mode == 1)
y = y + user*x;
else
x = x + transpose(user)*y;
end
f04qa example results
Output from sparse linear least squares solver.
Least squares solution of A*x = b
The matrix A has 13 rows and 12 cols
The damping parameter is damp = 0.00E+00
atol = 1.00E-05 conlim = 1.00E+06
btol = 1.00E-04 itnlim = 100
No. of iterations = 2
stopping condition = 2
( The least squares solution is good enough, given atol )
Actual norm(rbar), norm(x) 1.15E-02 4.33E+00
Norm(transpose(Abar)*rbar) 6.98E-15
Estimates of norm(Abar), cond(Abar) 4.12E+00 2.45E+00
Solution is x:
1.250 1.250 1.250 1.247 1.247 1.250
1.250 1.247 1.247 1.250 1.250 1.250
Norm of the residual = 1.15e-02
PDF version (NAG web site
, 64-bit version, 64-bit version)
© The Numerical Algorithms Group Ltd, Oxford, UK. 2009–2015