NF01BR

Solving linear systems R x = b, or R' x = b, in the least squares sense

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

  To solve one of the systems of linear equations

        R*x = b ,  or  R'*x = b ,

  in the least squares sense, where R is an n-by-n block upper
  triangular matrix, with the structure

      /   R_1    0    ..   0   |   L_1   \
      |    0    R_2   ..   0   |   L_2   |
      |    :     :    ..   :   |    :    | ,
      |    0     0    ..  R_l  |   L_l   |
      \    0     0    ..   0   |  R_l+1  /

  with the upper triangular submatrices R_k, k = 1:l+1, square, and
  the first l of the same order, BSN. The diagonal elements of each
  block R_k have nonincreasing magnitude. The matrix R is stored in
  the compressed form, as returned by SLICOT Library routine NF01BS,

           /   R_1  |   L_1   \
           |   R_2  |   L_2   |
    Rc =   |    :   |    :    | ,
           |   R_l  |   L_l   |
           \    X   |  R_l+1  /

  where the submatrix X is irrelevant. If the matrix R does not have
  full rank, then a least squares solution is obtained. If l <= 1,
  then R is an upper triangular matrix and its full upper triangle
  is stored.

  Optionally, the transpose of the matrix R can be stored in the
  strict lower triangles of the submatrices R_k, k = 1:l+1, and in
  the arrays SDIAG and S, as described at the parameter UPLO below.

Specification
      SUBROUTINE NF01BR( COND, UPLO, TRANS, N, IPAR, LIPAR, R, LDR,
     $                   SDIAG, S, LDS, B, RANKS, TOL, DWORK, LDWORK,
     $                   INFO )
C     .. Scalar Arguments ..
      CHARACTER         COND, TRANS, UPLO
      INTEGER           INFO, LDR, LDS, LDWORK, LIPAR, N
      DOUBLE PRECISION  TOL
C     .. Array Arguments ..
      INTEGER           IPAR(*), RANKS(*)
      DOUBLE PRECISION  B(*), DWORK(*), R(LDR,*), S(LDS,*), SDIAG(*)

Arguments

Mode Parameters

  COND    CHARACTER*1
          Specifies whether the condition of submatrices R_k should
          be estimated, as follows:
          = 'E' :  use incremental condition estimation and store
                   the numerical rank of R_k in the array entry
                   RANKS(k), for k = 1:l+1;
          = 'N' :  do not use condition estimation, but check the
                   diagonal entries of R_k for zero values;
          = 'U' :  use the ranks already stored in RANKS(1:l+1).

  UPLO    CHARACTER*1
          Specifies the storage scheme for the matrix R, as follows:
          = 'U' :  the upper triangular part is stored as in Rc;
          = 'L' :  the lower triangular part is stored, namely,
                   - the transpose of the strict upper triangle of
                     R_k is stored in the strict lower triangle of
                     R_k, for k = 1:l+1;
                   - the diagonal elements of R_k, k = 1:l+1, are
                     stored in the array SDIAG;
                   - the transpose of the last block column in R
                     (without R_l+1) is stored in the array S.

  TRANS   CHARACTER*1
          Specifies the form of the system of equations, as follows:
          = 'N':  R*x  = b  (No transpose);
          = 'T':  R'*x = b  (Transpose);
          = 'C':  R'*x = b  (Transpose).

Input/Output Parameters
  N       (input) INTEGER
          The order of the matrix R.  N = BN*BSN + ST >= 0.
          (See parameter description below.)

  IPAR    (input) INTEGER array, dimension (LIPAR)
          The integer parameters describing the structure of the
          matrix R, as follows:
          IPAR(1) must contain ST, the number of columns of the
                  submatrices L_k and the order of R_l+1.  ST >= 0.
          IPAR(2) must contain BN, the number of blocks, l, in the
                  block diagonal part of R.  BN >= 0.
          IPAR(3) must contain BSM, the number of rows of the blocks
                  R_k, k = 1:l.  BSM >= 0.
          IPAR(4) must contain BSN, the number of columns of the
                  blocks R_k, k = 1:l.  BSN >= 0.
          BSM is not used by this routine, but assumed equal to BSN.

  LIPAR   (input) INTEGER
          The length of the array IPAR.  LIPAR >= 4.

  R       (input) DOUBLE PRECISION array, dimension (LDR, NC)
          where NC = N if BN <= 1, and NC = BSN+ST, if BN > 1.
          If UPLO = 'U', the leading N-by-NC part of this array must
          contain the (compressed) representation (Rc) of the upper
          triangular matrix R. The submatrix X in Rc and the strict
          lower triangular parts of the diagonal blocks R_k,
          k = 1:l+1, are not referenced. If BN <= 1 or BSN = 0, then
          the full upper triangle of R must be stored.
          If UPLO = 'L', BN > 1 and BSN > 0, the leading
          (N-ST)-by-BSN part of this array must contain the
          transposes of the strict upper triangles of R_k, k = 1:l,
          stored in the strict lower triangles of R_k, and the
          strict lower triangle of R_l+1 must contain the transpose
          of the strict upper triangle of R_l+1. The submatrix X
          in Rc is not referenced. The diagonal elements of R_k,
          and, if COND = 'E', the upper triangular parts of R_k,
          k = 1:l+1, are modified internally, but are restored
          on exit.
          If UPLO = 'L' and BN <= 1 or BSN = 0, the leading N-by-N
          strict lower triangular part of this array must contain
          the transpose of the strict upper triangular part of R.
          The diagonal elements and, if COND = 'E', the upper
          triangular elements are modified internally, but are
          restored on exit.

  LDR     INTEGER
          The leading dimension of the array R.  LDR >= MAX(1,N).

  SDIAG   (input) DOUBLE PRECISION array, dimension (N)
          If UPLO = 'L', this array must contain the diagonal
          entries of R_k, k = 1:l+1. This array is modified
          internally, but is restored on exit.
          This parameter is not referenced if UPLO = 'U'.

  S       (input) DOUBLE PRECISION array, dimension (LDS,N-ST)
          If UPLO = 'L', BN > 1, and BSN > 0, the leading
          ST-by-(N-ST) part of this array must contain the transpose
          of the rectangular part of the last block column in R,
          that is [ L_1' L_2' ... L_l' ] . If COND = 'E', S is
          modified internally, but is restored on exit.
          This parameter is not referenced if UPLO = 'U', or
          BN <= 1, or BSN = 0.

  LDS     INTEGER
          The leading dimension of the array S.
          LDS >= 1,         if UPLO = 'U', or BN <= 1, or BSN = 0;
          LDS >= MAX(1,ST), if UPLO = 'L', BN > 1, and BSN > 0.

  B       (input/output) DOUBLE PRECISION array, dimension (N)
          On entry, this array must contain the right hand side
          vector b.
          On exit, this array contains the (least squares) solution
          of the system R*x = b or R'*x = b.

  RANKS   (input or output) INTEGER array, dimension (r), where
          r = BN + 1,  if ST > 0, BSN > 0, and BN > 1;
          r = BN,      if ST = 0 and BSN > 0;
          r = 1,       if ST > 0 and ( BSN = 0 or BN <= 1 );
          r = 0,       if ST = 0 and BSN = 0.
          On entry, if COND = 'U' and N > 0, this array must contain
          the numerical ranks of the submatrices R_k, k = 1:l(+1).
          On exit, if COND = 'E' or 'N' and N > 0, this array
          contains the numerical ranks of the submatrices R_k,
          k = 1:l(+1), estimated according to the value of COND.

Tolerances
  TOL     DOUBLE PRECISION
          If COND = 'E', the tolerance to be used for finding the
          ranks of the submatrices R_k. If the user sets TOL > 0,
          then the given value of TOL is used as a lower bound for
          the reciprocal condition number;  a (sub)matrix whose
          estimated condition number is less than 1/TOL is
          considered to be of full rank. If the user sets TOL <= 0,
          then an implicitly computed, default tolerance, defined by
          TOLDEF = N*EPS,  is used instead, where EPS is the machine
          precision (see LAPACK Library routine DLAMCH).
          This parameter is not relevant if COND = 'U' or 'N'.

Workspace
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)

  LDWORK  INTEGER
          The length of the array DWORK.
          Denote Full = ( BN <= 1 or  BSN = 0 );
                 Comp = ( BN >  1 and BSN > 0 ).
          LDWORK >= 2*N,           if Full and COND = 'E';
          LDWORK >= 2*MAX(BSN,ST), if Comp and COND = 'E';
          LDWORK >= 0,   in the remaining cases.

Error Indicator
  INFO    INTEGER
          = 0:  successful exit;
          < 0:  if INFO = -i, the i-th argument had an illegal
                value.

Method
  Block back or forward substitution is used (depending on TRANS
  and UPLO), exploiting the special structure and storage scheme of
  the matrix R. If a submatrix R_k, k = 1:l+1, is singular, a local
  basic least squares solution is computed. Therefore, the returned
  result is not the basic least squares solution for the whole
  problem, but a concatenation of (least squares) solutions of the
  individual subproblems involving R_k, k = 1:l+1 (with adapted
  right hand sides).

Numerical Aspects
                                 2    2
  The algorithm requires 0(BN*BSN + ST + N*ST) operations and is
  backward stable, if R is nonsingular.

Further Comments
  None
Example

Program Text

  None
Program Data
  None
Program Results
  None

Return to Supporting Routines index