## NF01BS

### QR factorization with column pivoting for Wiener system identification

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

Purpose

      To compute the QR factorization of the Jacobian matrix J, as
      received in compressed form from SLICOT Library routine NF01BD,

             /  dy(1)/dwb(1)  |  dy(1)/ dtheta  \
        Jc = |       :        |       :         | ,
             \  dy(L)/dwb(L)  |  dy(L)/ dtheta  /

      and to apply the transformation Q on the error vector e (in-situ).
      The factorization is J*P = Q*R, where Q is a matrix with
      orthogonal columns, P a permutation matrix, and R an upper
      trapezoidal matrix with diagonal elements of nonincreasing
      magnitude for each block column (see below). The 1-norm of the
      scaled gradient is also returned.

      Actually, the Jacobian J has the block form

        dy(1)/dwb(1)       0         .....       0        dy(1)/dtheta
             0        dy(2)/dwb(2)   .....       0        dy(2)/dtheta
           .....         .....       .....     .....         .....
             0           .....         0    dy(L)/dwb(L)  dy(L)/dtheta

      but the zero blocks are omitted. The diagonal blocks have the
      same size and correspond to the nonlinear part. The last block
      column corresponds to the linear part. It is assumed that the
      Jacobian matrix has at least as many rows as columns. The linear
      or nonlinear parts can be empty. If L <= 1, the Jacobian is
      represented as a full matrix.

Specification

          SUBROUTINE NF01BS( N, IPAR, LIPAR, FNORM, J, LDJ, E, JNORMS,
         $                   GNORM, IPVT, DWORK, LDWORK, INFO )
    C     .. Scalar Arguments ..
          INTEGER           INFO, LDJ, LDWORK, LIPAR, N
          DOUBLE PRECISION  FNORM, GNORM
    C     .. Array Arguments ..
          INTEGER           IPAR(*), IPVT(*)
          DOUBLE PRECISION  DWORK(*), E(*), J(*), JNORMS(*)

Arguments

Input/Output Parameters

      N       (input) INTEGER
              The number of columns of the Jacobian matrix J.
              N = BN*BSN + ST >= 0.  (See parameter description below.)

      IPAR    (input) INTEGER array, dimension (LIPAR)
              The integer parameters describing the structure of the
              matrix J, as follows:
              IPAR(1) must contain ST, the number of parameters
                      corresponding to the linear part.  ST >= 0.
              IPAR(2) must contain BN, the number of blocks, BN = L,
                      for the parameters corresponding to the nonlinear
                      part.  BN >= 0.
              IPAR(3) must contain BSM, the number of rows of the blocks
                      J_k = dy(k)/dwb(k), k = 1:BN, if BN > 0, or the
                      number of rows of the matrix J, if BN <= 1.
                      BN*BSM >= N, if BN > 0;
                      BSM >= N,    if BN = 0.
              IPAR(4) must contain BSN, the number of columns of the
                      blocks J_k, k = 1:BN.  BSN >= 0.

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

      FNORM   (input) DOUBLE PRECISION
              The Euclidean norm of the vector e.  FNORM >= 0.

      J       (input/output) DOUBLE PRECISION array, dimension (LDJ, NC)
              where NC = N if BN <= 1, and NC = BSN+ST, if BN > 1.
              On entry, the leading NR-by-NC part of this array must
              contain the (compressed) representation (Jc) of the
              Jacobian matrix J, where NR = BSM if BN <= 1, and
              NR = BN*BSM, if BN > 1.
              On exit, the leading N-by-NC part of this array contains
              a (compressed) representation of the upper triangular
              factor R of the Jacobian matrix. The matrix R has the same
              structure as the Jacobian matrix J, but with an additional
              diagonal block. Note that for efficiency of the later
              calculations, the matrix R is delivered with the leading
              dimension MAX(1,N), possibly much smaller than the value
              of LDJ on entry.

      LDJ     (input/output) INTEGER
              The leading dimension of array J.
              On entry, LDJ >= MAX(1,NR).
              On exit,  LDJ >= MAX(1,N).

      E       (input/output) DOUBLE PRECISION array, dimension (NR)
              On entry, this array contains the vector e,
              e = vec( Y - y ), where Y is set of output samples, and
              vec denotes the concatenation of the columns of a matrix.
              On exit, this array contains the updated vector Z*Q'*e,
              where Z is the block row permutation matrix used in the
              QR factorization of J (see METHOD).

      JNORMS  (output) DOUBLE PRECISION array, dimension (N)
              This array contains the Euclidean norms of the columns
              of the Jacobian matrix, considered in the initial order.

      GNORM   (output) DOUBLE PRECISION
              If FNORM > 0, the 1-norm of the scaled vector J'*e/FNORM,
              with each element i further divided by JNORMS(i) (if
              JNORMS(i) is nonzero).
              If FNORM = 0, the returned value of GNORM is 0.

      IPVT    (output) INTEGER array, dimension (N)
              This array defines the permutation matrix P such that
              J*P = Q*R. Column j of P is column IPVT(j) of the identity
              matrix.

Workspace

      DWORK   DOUBLE PRECISION array, dimension (LDWORK)
              On exit, if INFO = 0, DWORK(1) returns the optimal value
              of LDWORK.

      LDWORK  INTEGER
              The length of the array DWORK.
              LDWORK >= 1,      if N = 0 or BN <= 1 and BSM = N = 1;
                                otherwise,
              LDWORK >= 4*N+1,  if BN <= 1 or  BSN = 0;
              LDWORK >= JWORK,  if BN >  1 and BSN > 0, where JWORK is
                                given by the following procedure:
               JWORK  = BSN + MAX(3*BSN+1,ST);
               JWORK  = MAX(JWORK,4*ST+1),         if BSM > BSN;
               JWORK  = MAX(JWORK,(BSM-BSN)*(BN-1)),
                                                   if BSN < BSM < 2*BSN.
              For optimum performance LDWORK should be larger.

Error Indicator

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

Method

      A QR factorization with column pivoting of the matrix J is
      computed, J*P = Q*R.

      If l = L > 1, the R factor of the QR factorization has the same
      structure as the Jacobian, but with an additional diagonal block.
      Denote

          /   J_1    0    ..   0   |  L_1  \
          |    0    J_2   ..   0   |  L_2  |
      J = |    :     :    ..   :   |   :   | .
          |    :     :    ..   :   |   :   |
          \    0     0    ..  J_l  |  L_l  /

      The algorithm consists in two phases. In the first phase, the
      algorithm uses QR factorizations with column pivoting for each
      block J_k, k = 1:l, and applies the orthogonal matrix Q'_k to the
      corresponding part of the last block column and of e. After all
      block rows have been processed, the block rows are interchanged
      so that the zeroed submatrices in the first l block columns are
      moved to the bottom part. The same block row permutation Z is
      also applied to the vector e. At the end of the first phase,
      the structure of the processed matrix J is

          /   R_1    0    ..   0   |  L^1_1  \
          |    0    R_2   ..   0   |  L^1_2  |
          |    :     :    ..   :   |    :    | .
          |    :     :    ..   :   |    :    |
          |    0     0    ..  R_l  |  L^1_l  |
          |    0     0    ..   0   |  L^2_1  |
          |    :     :    ..   :   |    :    |
          \    0     0    ..   0   |  L^2_l  /

      In the second phase, the submatrix L^2_1:l is triangularized
      using an additional QR factorization with pivoting. (The columns
      of L^1_1:l are also permuted accordingly.) Therefore, the column
      pivoting is restricted to each such local block column.

      If l <= 1, the matrix J is triangularized in one phase, by one
      QR factorization with pivoting. In this case, the column
      pivoting is global.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index