AB07ND - SLICOT Library Routine Documentation

## AB07ND

### Inverse of a given linear system

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

Purpose

      To compute the inverse (Ai,Bi,Ci,Di) of a given system (A,B,C,D).

Specification

          SUBROUTINE AB07ND( N, M, A, LDA, B, LDB, C, LDC, D, LDD, RCOND,
         $                   IWORK, DWORK, LDWORK, INFO )
    C     .. Scalar Arguments ..
          DOUBLE PRECISION   RCOND
          INTEGER            INFO, LDA, LDB, LDC, LDD, LDWORK, M, N
    C     .. Array Arguments ..
          DOUBLE PRECISION   A(LDA,*), B(LDB,*), C(LDC,*), D(LDD,*),
         $                   DWORK(*)
          INTEGER            IWORK(*)

Arguments

Input/Output Parameters

      N       (input) INTEGER
              The order of the state matrix A.  N >= 0.

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

      A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the leading N-by-N part of this array must
              contain the state matrix A of the original system.
              On exit, the leading N-by-N part of this array contains
              the state matrix Ai of the inverse system.

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

      B       (input/output) DOUBLE PRECISION array, dimension (LDB,M)
              On entry, the leading N-by-M part of this array must
              contain the input matrix B of the original system.
              On exit, the leading N-by-M part of this array contains
              the input matrix Bi of the inverse system.

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

      C       (input/output) DOUBLE PRECISION array, dimension (LDC,N)
              On entry, the leading M-by-N part of this array must
              contain the output matrix C of the original system.
              On exit, the leading M-by-N part of this array contains
              the output matrix Ci of the inverse system.

      LDC     INTEGER
              The leading dimension of the array C.  LDC >= MAX(1,M).

      D       (input/output) DOUBLE PRECISION array, dimension (LDD,M)
              On entry, the leading M-by-M part of this array must
              contain the feedthrough matrix D of the original system.
              On exit, the leading M-by-M part of this array contains
              the feedthrough matrix Di of the inverse system.

      LDD     INTEGER
              The leading dimension of the array D.  LDD >= MAX(1,M).

      RCOND   (output) DOUBLE PRECISION
              The estimated reciprocal condition number of the
              feedthrough matrix D of the original system.

Workspace

      IWORK   INTEGER array, dimension (2*M)

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

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

Error Indicator

      INFO    INTEGER
              = 0:  successful exit;
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value;
              = i:  the matrix D is exactly singular; the (i,i) diagonal
                    element is zero, i <= M; RCOND was set to zero;
              = M+1:  the matrix D is numerically singular, i.e., RCOND
                    is less than the relative machine precision, EPS
                    (see LAPACK Library routine DLAMCH). The
                    calculations have been completed, but the results
                    could be very inaccurate.

Method

      The matrices of the inverse system are computed with the formulas:
                    -1              -1         -1           -1
        Ai = A - B*D  *C,  Bi = -B*D  ,  Ci = D  *C,  Di = D  .

Numerical Aspects

      The accuracy depends mainly on the condition number of the matrix
      D to be inverted. The estimated reciprocal condition number is
      returned in RCOND.

Further Comments

      None

Example

Program Text

    *     AB07ND EXAMPLE PROGRAM TEXT
    *     Copyright (c) 2002-2010 NICONET e.V.
    *
    *     .. Parameters ..
          INTEGER          NIN, NOUT
          PARAMETER        ( NIN = 5, NOUT = 6 )
          INTEGER          NMAX, MMAX
          PARAMETER        ( NMAX = 20, MMAX = 20 )
          INTEGER          LDA, LDB, LDC, LDD
          PARAMETER        ( LDA = NMAX, LDB = NMAX, LDC = MMAX,
         $                   LDD = MMAX )
          INTEGER          LDWORK
          PARAMETER        ( LDWORK = 4*MMAX )
    *     .. Local Scalars ..
          INTEGER          I, INFO, J, M, N
          DOUBLE PRECISION RCOND
    *     .. Local Arrays ..
          INTEGER          IWORK(2*MMAX)
          DOUBLE PRECISION A(LDA,NMAX), B(LDB,MMAX), C(LDC,NMAX),
         $                 D(LDD,MMAX), DWORK(LDWORK)
    *     .. External Subroutines ..
          EXTERNAL         AB07ND
    *     .. Executable Statements ..
    *
          WRITE ( NOUT, FMT = 99999 )
    *     Skip the heading in the data file and read in the data.
          READ ( NIN, FMT = '()' )
          READ ( NIN, FMT = * ) N, M
          IF ( N.LT.0 .OR. N.GT.NMAX ) THEN
             WRITE ( NOUT, FMT = 99992 ) N
          ELSE
             READ ( NIN, FMT = * ) ( ( A(I,J), J = 1,N ), I = 1,N )
             IF ( M.LT.0 .OR. M.GT.MMAX ) THEN
                WRITE ( NOUT, FMT = 99991 ) M
             ELSE
                READ ( NIN, FMT = * ) ( ( B(I,J), J = 1,M ), I = 1,N )
                READ ( NIN, FMT = * ) ( ( C(I,J), J = 1,N ), I = 1,M )
                READ ( NIN, FMT = * ) ( ( D(I,J), J = 1,M ), I = 1,M )
    *           Find the inverse of the ssr (A,B,C,D).
                CALL AB07ND( N, M, A, LDA, B, LDB, C, LDC, D, LDD, RCOND,
         $                   IWORK, DWORK, LDWORK, INFO )
    *
                IF ( INFO.NE.0 ) THEN
                   WRITE ( NOUT, FMT = 99998 ) INFO
                ELSE
                   WRITE ( NOUT, FMT = 99997 )
                   DO 20 I = 1, N
                      WRITE ( NOUT, FMT = 99996 ) ( A(I,J), J = 1,N )
       20          CONTINUE
                   WRITE ( NOUT, FMT = 99995 )
                   DO 40 I = 1, N
                      WRITE ( NOUT, FMT = 99996 ) ( B(I,J), J = 1,M )
       40          CONTINUE
                   WRITE ( NOUT, FMT = 99994 )
                   DO 60 I = 1, M
                      WRITE ( NOUT, FMT = 99996 ) ( C(I,J), J = 1,N )
       60          CONTINUE
                   WRITE ( NOUT, FMT = 99993 )
                   DO 80 I = 1, M
                      WRITE ( NOUT, FMT = 99996 ) ( D(I,J), J = 1,M )
       80          CONTINUE
                END IF
             END IF
          END IF
          STOP
    *
    99999 FORMAT (' AB07ND EXAMPLE PROGRAM RESULTS',/1X)
    99998 FORMAT (' INFO on exit from AB07ND = ',I2)
    99997 FORMAT (' The state dynamics matrix of the inverse system is ')
    99996 FORMAT (20(1X,F8.4))
    99995 FORMAT (/' The input/state matrix of the inverse system is ')
    99994 FORMAT (/' The state/output matrix of the inverse system is ')
    99993 FORMAT (/' The feedthrough matrix of the inverse system is ')
    99992 FORMAT (/' N is out of range.',/' N = ',I5)
    99991 FORMAT (/' M is out of range.',/' M = ',I5)
          END

Program Data

     AB07ND EXAMPLE PROGRAM DATA
       3     2
       1.0   2.0   0.0
       4.0  -1.0   0.0
       0.0   0.0   1.0
       1.0   0.0
       0.0   1.0
       1.0   0.0
       0.0   1.0  -1.0
       0.0   0.0   1.0
       4.0   0.0
       0.0   1.0

Program Results

     AB07ND EXAMPLE PROGRAM RESULTS

     The state dynamics matrix of the inverse system is
       1.0000   1.7500   0.2500
       4.0000  -1.0000  -1.0000
       0.0000  -0.2500   1.2500

     The input/state matrix of the inverse system is
      -0.2500   0.0000
       0.0000  -1.0000
      -0.2500   0.0000

     The state/output matrix of the inverse system is
       0.0000   0.2500  -0.2500
       0.0000   0.0000   1.0000

     The feedthrough matrix of the inverse system is
       0.2500   0.0000
       0.0000   1.0000

Click here to get a compressed (gzip) tar file containing the source code of the routine, the example program, data, documentation, and related files.

Return to index