IB01PX

Estimating system matrices B and D using Kronecker products

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

Purpose

  To build and solve the least squares problem  T*X = Kv,  and
  estimate the matrices B and D of a linear time-invariant (LTI)
  state space model, using the solution  X,  and the singular
  value decomposition information and other intermediate results,
  provided by other routines.

  The matrix  T  is computed as a sum of Kronecker products,

     T = T + kron(Uf(:,(i-1)*m+1:i*m),N_i),  for i = 1 : s,

  (with  T  initialized by zero), where  Uf  is the triangular
  factor of the QR factorization of the future input part (see
  SLICOT Library routine IB01ND),  N_i  is given by the i-th block
  row of the matrix

         [ Q_11  Q_12  ...  Q_1,s-2  Q_1,s-1  Q_1s ]   [ I_L  0  ]
         [ Q_12  Q_13  ...  Q_1,s-1    Q_1s    0   ]   [         ]
     N = [ Q_13  Q_14  ...    Q_1s      0      0   ] * [         ],
         [  :     :            :        :      :   ]   [         ]
         [ Q_1s   0    ...     0        0      0   ]   [  0  GaL ]

  and where

            [   -L_1|1    ]          [ M_i-1 - L_1|i ]
     Q_11 = [             ],  Q_1i = [               ],  i = 2:s,
            [ I_L - L_2|1 ]          [     -L_2|i    ]

  are  (n+L)-by-L  matrices, and  GaL  is built from the first  n
  relevant singular vectors,  GaL = Un(1:L(s-1),1:n),  computed
  by IB01ND.

  The vector  Kv  is vec(K), with the matrix  K  defined by

     K = [ K_1  K_2  K_3  ...  K_s ],

  where  K_i = K(:,(i-1)*m+1:i*m),  i = 1:s,  is  (n+L)-by-m.
  The given matrices are  Uf,  GaL,  and

         [ L_1|1  ...  L_1|s ]
     L = [                   ],   (n+L)-by-L*s,
         [ L_2|1  ...  L_2|s ]

     M = [ M_1  ...  M_s-1 ],      n-by-L*(s-1),  and
     K,                            (n+L)-by-m*s.

  Matrix  M  is the pseudoinverse of the matrix  GaL,  computed by
  SLICOT Library routine IB01PD.

Specification
      SUBROUTINE IB01PX( JOB, NOBR, N, M, L, UF, LDUF, UN, LDUN, UL,
     $                   LDUL, PGAL, LDPGAL, K, LDK, R, LDR, X, B, LDB,
     $                   D, LDD, TOL, IWORK, DWORK, LDWORK, IWARN,
     $                   INFO )
C     .. Scalar Arguments ..
      DOUBLE PRECISION   TOL
      INTEGER            INFO, IWARN, L, LDB, LDD, LDK, LDPGAL, LDR,
     $                   LDUF, LDUL, LDUN, LDWORK, M, N, NOBR
      CHARACTER          JOB
C     .. Array Arguments ..
      DOUBLE PRECISION   B(LDB, *), D(LDD, *), DWORK(*), K(LDK, *),
     $                   PGAL(LDPGAL, *), R(LDR, *), UF(LDUF, *),
     $                   UL(LDUL, *), UN(LDUN, *), X(*)
      INTEGER            IWORK( * )

Arguments

Mode Parameters

  JOB     CHARACTER*1
          Specifies which of the matrices B and D should be
          computed, as follows:
          = 'B':  compute the matrix B, but not the matrix D;
          = 'D':  compute both matrices B and D.

Input/Output Parameters
  NOBR    (input) INTEGER
          The number of block rows,  s,  in the input and output
          Hankel matrices processed by other routines.  NOBR > 1.

  N       (input) INTEGER
          The order of the system.  NOBR > N > 0.

  M       (input) INTEGER
          The number of system inputs.  M >= 0.

  L       (input) INTEGER
          The number of system outputs.  L > 0.

  UF      (input/output) DOUBLE PRECISION array, dimension
          ( LDUF,M*NOBR )
          On entry, the leading  M*NOBR-by-M*NOBR  upper triangular
          part of this array must contain the upper triangular
          factor of the QR factorization of the future input part,
          as computed by SLICOT Library routine IB01ND.
          The strict lower triangle need not be set to zero.
          On exit, the leading  M*NOBR-by-M*NOBR  upper triangular
          part of this array is unchanged, and the strict lower
          triangle is set to zero.

  LDUF    INTEGER
          The leading dimension of the array  UF.
          LDUF >= MAX( 1, M*NOBR ).

  UN      (input) DOUBLE PRECISION array, dimension ( LDUN,N )
          The leading  L*(NOBR-1)-by-N  part of this array must
          contain the matrix  GaL,  i.e., the leading part of the
          first  N  columns of the matrix  Un  of relevant singular
          vectors.

  LDUN    INTEGER
          The leading dimension of the array  UN.
          LDUN >= L*(NOBR-1).

  UL      (input/output) DOUBLE PRECISION array, dimension
          ( LDUL,L*NOBR )
          On entry, the leading  (N+L)-by-L*NOBR  part of this array
          must contain the given matrix  L.
          On exit, if  M > 0,  the leading  (N+L)-by-L*NOBR  part of
          this array is overwritten by the matrix
          [ Q_11  Q_12  ...  Q_1,s-2  Q_1,s-1  Q_1s ].

  LDUL    INTEGER
          The leading dimension of the array  UL.  LDUL >= N+L.

  PGAL    (input) DOUBLE PRECISION array, dimension
          ( LDPGAL,L*(NOBR-1) )
          The leading  N-by-L*(NOBR-1)  part of this array must
          contain the pseudoinverse of the matrix  GaL,  computed by
          SLICOT Library routine IB01PD.

  LDPGAL  INTEGER
          The leading dimension of the array  PGAL.  LDPGAL >= N.

  K       (input) DOUBLE PRECISION array, dimension ( LDK,M*NOBR )
          The leading  (N+L)-by-M*NOBR  part of this array must
          contain the given matrix  K.

  LDK     INTEGER
          The leading dimension of the array  K.  LDK >= N+L.

  R       (output) DOUBLE PRECISION array, dimension ( LDR,M*(N+L) )
          The leading  (N+L)*M*NOBR-by-M*(N+L)  part of this array
          contains details of the complete orthogonal factorization
          of the coefficient matrix  T  of the least squares problem
          which is solved for getting the system matrices B and D.

  LDR     INTEGER
          The leading dimension of the array  R.
          LDR >= MAX( 1, (N+L)*M*NOBR ).

  X       (output) DOUBLE PRECISION array, dimension
          ( (N+L)*M*NOBR )
          The leading  M*(N+L)  elements of this array contain the
          least squares solution of the system  T*X = Kv.
          The remaining elements are used as workspace (to store the
          corresponding part of the vector Kv = vec(K)).

  B       (output) DOUBLE PRECISION array, dimension ( LDB,M )
          The leading N-by-M part of this array contains the system
          input matrix.

  LDB     INTEGER
          The leading dimension of the array B.  LDB >= N.

  D       (output) DOUBLE PRECISION array, dimension ( LDD,M )
          If  JOB = 'D',  the leading L-by-M part of this array
          contains the system input-output matrix.
          If  JOB = 'B',  this array is not referenced.

  LDD     INTEGER
          The leading dimension of the array D.
          LDD >= L, if  JOB = 'D';
          LDD >= 1, if  JOB = 'B'.

Tolerances
  TOL     DOUBLE PRECISION
          The tolerance to be used for estimating the rank of
          matrices. If the user sets  TOL > 0,  then the given value
          of  TOL  is used as a lower bound for the reciprocal
          condition number;  an m-by-n 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 = m*n*EPS,  is used instead, where  EPS  is the
          relative machine precision (see LAPACK Library routine
          DLAMCH).

Workspace
  IWORK   INTEGER array, dimension ( M*(N+L) )

  DWORK   DOUBLE PRECISION array, dimension ( LDWORK )
          On exit, if  INFO = 0,  DWORK(1) returns the optimal value
          of LDWORK,  and, if  M > 0,  DWORK(2)  contains the
          reciprocal condition number of the triangular factor of
          the matrix  T.
          On exit, if  INFO = -26,  DWORK(1)  returns the minimum
          value of LDWORK.

  LDWORK  INTEGER
          The length of the array DWORK.
          LDWORK >= MAX( (N+L)*(N+L), 4*M*(N+L)+1 ).
          For good performance,  LDWORK  should be larger.

Warning Indicator
  IWARN   INTEGER
          = 0:  no warning;
          = 4:  the least squares problem to be solved has a
                rank-deficient coefficient matrix.

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

Method
  The matrix  T  is computed, evaluating the sum of Kronecker
  products, and then the linear system  T*X = Kv  is solved in a
  least squares sense. The matrices  B  and  D  are then directly
  obtained from the least squares solution.

References
  [1] Verhaegen M., and Dewilde, P.
      Subspace Model Identification. Part 1: The output-error
      state-space model identification class of algorithms.
      Int. J. Control, 56, pp. 1187-1210, 1992.

  [2] Van Overschee, P., and De Moor, B.
      N4SID: Two Subspace Algorithms for the Identification
      of Combined Deterministic-Stochastic Systems.
      Automatica, Vol.30, No.1, pp. 75-93, 1994.

  [3] Van Overschee, P.
      Subspace Identification : Theory - Implementation -
      Applications.
      Ph. D. Thesis, Department of Electrical Engineering,
      Katholieke Universiteit Leuven, Belgium, Feb. 1995.

Numerical Aspects
  The implemented method is numerically stable.

Further Comments
  None
Example

Program Text

  None
Program Data
  None
Program Results
  None

Return to Supporting Routines index