**Purpose**

To construct the minimum norm feedback matrix F to perform "deadbeat control" on a (A,B)-pair of a state-space model (which must be preliminarily reduced to upper "staircase" form using SLICOT Library routine AB01OD) such that the matrix R = A + BFU' is nilpotent. (The transformation matrix U reduces R to upper Schur form with zero blocks on its diagonal (of dimension KSTAIR(i)) and therefore contains bases for the i-th controllable subspaces, where i = 1,...,KMAX).

SUBROUTINE SB06ND( N, M, KMAX, A, LDA, B, LDB, KSTAIR, U, LDU, F, $ LDF, DWORK, INFO ) C .. Scalar Arguments .. INTEGER INFO, KMAX, LDA, LDB, LDF, LDU, M, N C .. Array Arguments .. INTEGER KSTAIR(*) DOUBLE PRECISION A(LDA,*), B(LDB,*), DWORK(*), F(LDF,*), U(LDU,*)

**Input/Output Parameters**

N (input) INTEGER The actual state dimension, i.e. the order of the matrix A. N >= 0. M (input) INTEGER The actual input dimension. M >= 0. KMAX (input) INTEGER The number of "stairs" in the staircase form as produced by SLICOT Library routine AB01OD. 0 <= KMAX <= N. A (input/output) DOUBLE PRECISION array, dimension (LDA,N) On entry, the leading N-by-N part of this array must contain the transformed state-space matrix of the (A,B)-pair with triangular stairs, as produced by SLICOT Library routine AB01OD (with option STAGES = 'A'). On exit, the leading N-by-N part of this array contains the matrix U'AU + U'BF. LDA INTEGER The leading dimension of 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 transformed triangular input matrix of the (A,B)-pair as produced by SLICOT Library routine AB01OD (with option STAGES = 'A'). On exit, the leading N-by-M part of this array contains the matrix U'B. LDB INTEGER The leading dimension of array B. LDB >= MAX(1,N). KSTAIR (input) INTEGER array, dimension (KMAX) The leading KMAX elements of this array must contain the dimensions of each "stair" as produced by SLICOT Library routine AB01OD. U (input/output) DOUBLE PRECISION array, dimension (LDU,N) On entry, the leading N-by-N part of this array must contain either a transformation matrix (e.g. from a previous call to other SLICOT routine) or be initialised as the identity matrix. On exit, the leading N-by-N part of this array contains the product of the input matrix U and the state-space transformation matrix which reduces A + BFU' to real Schur form. LDU INTEGER The leading dimension of array U. LDU >= MAX(1,N). F (output) DOUBLE PRECISION array, dimension (LDF,N) The leading M-by-N part of this array contains the deadbeat feedback matrix F. LDF INTEGER The leading dimension of array F. LDF >= MAX(1,M).

DWORK DOUBLE PRECISION array, dimension (2*N)

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

Starting from the (A,B)-pair in "staircase form" with "triangular" stairs, dimensions KSTAIR(i+1) x KSTAIR(i), (described by the vector KSTAIR): | B | A * . . . * | | 1| 11 . . | | | A A . . | | | 21 22 . . | | | . . . | [ B | A ] = | | . . * | | | . . | | 0 | 0 | | | A A | | | r,r-1 rr | where the i-th diagonal block of A has dimension KSTAIR(i), for i = 1,2,...,r, the feedback matrix F is constructed recursively in r steps (where the number of "stairs" r is given by KMAX). In each step a unitary state-space transformation U and a part of F are updated in order to achieve the final form: | 0 A * . . . * | | 12 . . | | . . | | 0 A . . | | 23 . . | | . . | [ U'AU + U'BF ] = | . . * | . | . . | | | | A | | r-1,r| | | | 0 |

[1] Van Dooren, P. Deadbeat control: a special inverse eigenvalue problem. BIT, 24, pp. 681-699, 1984.

The algorithm requires O((N + M) * N**2) operations and is mixed numerical stable (see [1]).

None

**Program Text**

* SB06ND EXAMPLE PROGRAM TEXT * Copyright (c) 2002-2017 NICONET e.V. * * .. Parameters .. INTEGER NIN, NOUT PARAMETER ( NIN = 5, NOUT = 6 ) INTEGER NMAX, MMAX PARAMETER ( NMAX = 20, MMAX = 20 ) INTEGER LDA, LDB, LDU, LDV, LDF PARAMETER ( LDA = NMAX, LDB = NMAX, LDU = NMAX, $ LDV = MMAX, LDF = MMAX ) INTEGER LIWORK PARAMETER ( LIWORK = MMAX ) INTEGER LDWORK PARAMETER ( LDWORK = NMAX + MAX(NMAX,3*MMAX) ) * PARAMETER ( LDWORK = 4*NMAX) DOUBLE PRECISION ZERO, ONE PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) * .. Local Scalars .. DOUBLE PRECISION TOL INTEGER I, INFO, J, KMAX, M, N, NCONT CHARACTER*1 JOBU, JOBV * .. Local Arrays .. DOUBLE PRECISION A(LDA,NMAX), B(LDB,MMAX), DWORK(LDWORK), $ F(LDF,NMAX), U(LDU,NMAX), V(LDV,MMAX) INTEGER IWORK(LIWORK), KSTAIR(NMAX) C .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. External Subroutines .. EXTERNAL AB01OD, DLASET, SB06ND * .. Intrinsic Functions .. INTRINSIC MAX * .. Executable Statements .. * WRITE ( NOUT, FMT = 99999 ) * Skip the heading in the data file and read the data. READ ( NIN, FMT = '()' ) READ ( NIN, FMT = * ) N, M, TOL, JOBU, JOBV IF ( N.LT.0 .OR. N.GT.NMAX ) THEN WRITE ( NOUT, FMT = 99994 ) N ELSE READ ( NIN, FMT = * ) ( ( A(I,J), I = 1,N ), J = 1,N ) IF ( M.LT.0 .OR. M.GT.MMAX ) THEN WRITE ( NOUT, FMT = 99993 ) M ELSE READ ( NIN, FMT = * ) ( ( B(I,J), J = 1,M ), I = 1,N ) * First put (A,B) into staircase form with triangular pivots * and determine the stairsizes. CALL AB01OD( 'A', JOBU, JOBV, N, M, A, LDA, B, LDB, U, $ LDU, V, LDV, NCONT, KMAX, KSTAIR, TOL, IWORK, $ DWORK, LDWORK, INFO ) * IF ( INFO.EQ.0 ) THEN IF( LSAME( JOBU, 'N' ) ) THEN * Initialize U as the identity matrix. CALL DLASET( 'Full', N, N, ZERO, ONE, U, LDU ) END IF * Perform "deadbeat control" to give F. CALL SB06ND( N, M, KMAX, A, LDA, B, LDB, KSTAIR, U, LDU, $ F, LDF, DWORK, INFO ) * IF ( INFO.NE.0 ) THEN WRITE ( NOUT, FMT = 99997 ) INFO ELSE WRITE ( NOUT, FMT = 99996 ) DO 60 I = 1, M WRITE ( NOUT, FMT = 99995 ) ( F(I,J), J = 1,N ) 60 CONTINUE END IF ELSE WRITE ( NOUT, FMT = 99998 ) INFO END IF END IF END IF STOP * 99999 FORMAT (' SB06ND EXAMPLE PROGRAM RESULTS',/1X) 99998 FORMAT (' INFO on exit from AB01OD = ',I2) 99997 FORMAT (' INFO on exit from SB06ND = ',I2) 99996 FORMAT (' The deadbeat feedback matrix F is ') 99995 FORMAT (20(1X,F8.4)) 99994 FORMAT (/' N is out of range.',/' N = ',I5) 99993 FORMAT (/' M is out of range.',/' M = ',I5) END

SB06ND EXAMPLE PROGRAM DATA 5 2 0.0 N N -17.0 24.0 41.0 68.0 15.0 23.0 -35.0 27.0 14.0 16.0 34.0 26.0 -13.0 20.0 22.0 10.0 12.0 19.0 -21.0 63.0 11.0 18.0 25.0 52.0 -29.0 -31.0 14.0 74.0 -69.0 -59.0 16.0 16.0 -25.0 -25.0 36.0

SB06ND EXAMPLE PROGRAM RESULTS The deadbeat feedback matrix F is -0.4819 -0.5782 -2.7595 -3.1093 0.0000 0.2121 -0.4462 0.7698 -1.5421 -0.5773