NF01BD

Computing the Jacobian of a Wiener system

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

Purpose

  To calculate the Jacobian dy/dX of the Wiener system

     x(t+1) = A*x(t) + B*u(t)
     z(t)   = C*x(t) + D*u(t),

     y(t,i) = sum( ws(k, i)*f(w(k, i)*z(t) + b(k,i)) ) + b(k+1,i),

  where t = 1, 2, ...,  NSMP,
        i = 1, 2, ...,  L,
        k = 1, 2, ...,  NN.

  NN is arbitrary eligible and has to be provided in IPAR(2), and
  X = ( wb(1), ..., wb(L), theta ) is described below.

  Denoting y(j) = y(1:NSMP,j), 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 it will be returned without the zero blocks, in the form

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

  dy(i)/dwb(i) depends on f and is calculated by the routine NF01BY;
  dy(i)/dtheta is computed by a forward-difference approximation.

Specification
      SUBROUTINE NF01BD( CJTE, NSMP, M, L, IPAR, LIPAR, X, LX, U, LDU,
     $                   E, J, LDJ, JTE, DWORK, LDWORK, INFO )
C     .. Scalar Arguments ..
      CHARACTER         CJTE
      INTEGER           INFO, L, LDJ, LDU, LDWORK, LX, LIPAR, M, NSMP
C     .. Array Arguments ..
      INTEGER           IPAR(*)
      DOUBLE PRECISION  DWORK(*), E(*), J(LDJ, *), JTE(*), U(LDU,*),
     $                  X(*)

Arguments

Mode Parameters

  CJTE    CHARACTER*1
          Specifies whether the matrix-vector product J'*e should be
          computed or not, as follows:
          = 'C' :  compute J'*e;
          = 'N' :  do not compute J'*e.

Input/Output Parameters
  NSMP    (input) INTEGER
          The number of training samples.  NSMP >= 0.

  M       (input) INTEGER
          The length of each input sample.  M >= 0.

  L       (input) INTEGER
          The length of each output sample.  L >= 0.

  IPAR    (input/output) INTEGER array, dimension (LIPAR)
          On entry, the first entries of this array must contain
          the integer parameters needed; specifically,
          IPAR(1)  must contain the order of the linear part, N;
                   actually, N = abs(IPAR(1)), since setting
                   IPAR(1) < 0 has a special meaning (see below);
          IPAR(2)  must contain the number of neurons for the
                   nonlinear part, NN, NN >= 0.
          On exit, if IPAR(1) < 0 on entry, then no computations are
          performed, except the needed tests on input parameters,
          but the following values are returned:
          IPAR(1) contains the length of the array J, LJ;
          LDJ     contains the leading dimension of array J.
          Otherwise, IPAR(1) and LDJ are unchanged on exit.

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

  X       (input) DOUBLE PRECISION array, dimension (LX)
          The leading LPAR entries of this array must contain the
          set of system parameters, where
             LPAR = (NN*(L + 2) + 1)*L + N*(M + L + 1) + L*M.
          X has the form (wb(1), ..., wb(L), theta), where the
          vectors wb(i) have the structure
           (w(1,1), ..., w(1,L), ..., w(NN,1), ..., w(NN,L),
             ws(1), ..., ws(NN), b(1), ..., b(NN+1) ),
          and the vector theta represents the matrices A, B, C, D
          and x(1), and it can be retrieved from these matrices
          by SLICOT Library routine TB01VD and retranslated by
          TB01VY.

  LX      (input) INTEGER
          The length of X.
          LX >= (NN*(L + 2) + 1)*L + N*(M + L + 1) + L*M.

  U       (input) DOUBLE PRECISION array, dimension (LDU, M)
          The leading NSMP-by-M part of this array must contain the
          set of input samples,
          U = ( U(1,1),...,U(1,M); ...; U(NSMP,1),...,U(NSMP,M) ).

  LDU     INTEGER
          The leading dimension of array U.  LDU >= MAX(1,NSMP).

  E       (input) DOUBLE PRECISION array, dimension (NSMP*L)
          If CJTE = 'C', this array must contain a vector e, which
          will be premultiplied with J', e = vec( Y - y ), where
          Y is set of output samples, and vec denotes the
          concatenation of the columns of a matrix.
          If CJTE = 'N', this array is not referenced.

  J       (output) DOUBLE PRECISION array, dimension (LDJ, *)
          The leading NSMP*L-by-NCOLJ part of this array contains
          the Jacobian of the error function stored in a compressed
          form, as described above, where
          NCOLJ = NN*(L + 2) + 1 + N*(M + L + 1) + L*M.

  LDJ     INTEGER
          The leading dimension of array J.  LDJ >= MAX(1,NSMP*L).
          Note that LDJ is an input parameter, except for
          IPAR(1) < 0 on entry, when it is an output parameter.

  JTE     (output) DOUBLE PRECISION array, dimension (LPAR)
          If CJTE = 'C', this array contains the matrix-vector
          product J'*e.
          If CJTE = 'N', this array is not referenced.

Workspace
  DWORK   DOUBLE PRECISION array, dimension (LDWORK)

  LDWORK  INTEGER
          The length of the array DWORK.
          LDWORK >= 2*NSMP*L + MAX( 2*NN, (N + L)*(N + M) + 2*N +
                                    MAX( N*(N + L), N + M + L ) )
                                                           if M > 0;
          LDWORK >= 2*NSMP*L + MAX( 2*NN, (N + L)*N + 2*N +
                                    MAX( N*(N + L), L ) ), if M = 0.
          A larger value of LDWORK could improve the efficiency.

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

Method
  BLAS routines are used for the matrix-vector multiplications, and
  the SLICOT Library routine TB01VY is called for the conversion of
  the output normal form parameters to an LTI-system; the routine
  NF01AD is then used for the simulation of the system with given
  parameters, and the routine NF01BY is called for the (analytically
  performed) calculation of the parts referring to the parameters
  of the static nonlinearity.

Further Comments
  None
Example

Program Text

  None
Program Data
  None
Program Results
  None

Return to Supporting Routines index