⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inverse.f

📁 一个基于打靶法的最优控制求解软件 求解过程中采用参数延续算法
💻 F
📖 第 1 页 / 共 5 页
字号:
C            IF( UPPER )THEN               DO 260, K = 1, N                  DO 240, J = 1, K - 1                     IF( A( J, K ).NE.ZERO )THEN                        TEMP = ALPHA*A( J, K )                        DO 230, I = 1, M                           B( I, J ) = B( I, J ) + TEMP*B( I, K )  230                   CONTINUE                     END IF  240             CONTINUE                  TEMP = ALPHA                  IF( NOUNIT )     $               TEMP = TEMP*A( K, K )                  IF( TEMP.NE.ONE )THEN                     DO 250, I = 1, M                        B( I, K ) = TEMP*B( I, K )  250                CONTINUE                  END IF  260          CONTINUE            ELSE               DO 300, K = N, 1, -1                  DO 280, J = K + 1, N                     IF( A( J, K ).NE.ZERO )THEN                        TEMP = ALPHA*A( J, K )                        DO 270, I = 1, M                           B( I, J ) = B( I, J ) + TEMP*B( I, K )  270                   CONTINUE                     END IF  280             CONTINUE                  TEMP = ALPHA                  IF( NOUNIT )     $               TEMP = TEMP*A( K, K )                  IF( TEMP.NE.ONE )THEN                     DO 290, I = 1, M                        B( I, K ) = TEMP*B( I, K )  290                CONTINUE                  END IF  300          CONTINUE            END IF         END IF      END IFC      RETURNCC     End of DTRMM .C      END*DECK DTRMV      SUBROUTINE DTRMV (UPLO, TRANS, DIAG, N, A, LDA, X, INCX)C***BEGIN PROLOGUE  DTRMVC***PURPOSE  Perform one of the matrix-vector operations.C***LIBRARY   SLATEC (BLAS)C***CATEGORY  D1B4C***TYPE      DOUBLE PRECISION (STRMV-S, DTRMV-D, CTRMV-C)C***KEYWORDS  LEVEL 2 BLAS, LINEAR ALGEBRAC***AUTHOR  Dongarra, J. J., (ANL)C           Du Croz, J., (NAG)C           Hammarling, S., (NAG)C           Hanson, R. J., (SNLA)C***DESCRIPTIONCC  DTRMV  performs one of the matrix-vector operationsCC     x := A*x,   or   x := A'*x,CC  where x is an n element vector and  A is an n by n unit, or non-unit,C  upper or lower triangular matrix.CC  ParametersC  ==========CC  UPLO   - CHARACTER*1.C           On entry, UPLO specifies whether the matrix is an upper orC           lower triangular matrix as follows:CC              UPLO = 'U' or 'u'   A is an upper triangular matrix.CC              UPLO = 'L' or 'l'   A is a lower triangular matrix.CC           Unchanged on exit.CC  TRANS  - CHARACTER*1.C           On entry, TRANS specifies the operation to be performed asC           follows:CC              TRANS = 'N' or 'n'   x := A*x.CC              TRANS = 'T' or 't'   x := A'*x.CC              TRANS = 'C' or 'c'   x := A'*x.CC           Unchanged on exit.CC  DIAG   - CHARACTER*1.C           On entry, DIAG specifies whether or not A is unitC           triangular as follows:CC              DIAG = 'U' or 'u'   A is assumed to be unit triangular.CC              DIAG = 'N' or 'n'   A is not assumed to be unitC                                  triangular.CC           Unchanged on exit.CC  N      - INTEGER.C           On entry, N specifies the order of the matrix A.C           N must be at least zero.C           Unchanged on exit.CC  A      - DOUBLE PRECISION array of DIMENSION ( LDA, n).C           Before entry with  UPLO = 'U' or 'u', the leading n by nC           upper triangular part of the array A must contain the upperC           triangular matrix and the strictly lower triangular part ofC           A is not referenced.C           Before entry with UPLO = 'L' or 'l', the leading n by nC           lower triangular part of the array A must contain the lowerC           triangular matrix and the strictly upper triangular part ofC           A is not referenced.C           Note that when  DIAG = 'U' or 'u', the diagonal elements ofC           A are not referenced either, but are assumed to be unity.C           Unchanged on exit.CC  LDA    - INTEGER.C           On entry, LDA specifies the first dimension of A as declaredC           in the calling (sub) program. LDA must be at leastC           max( 1, n ).C           Unchanged on exit.CC  X      - DOUBLE PRECISION array of dimension at leastC           ( 1 + ( n - 1 )*abs( INCX ) ).C           Before entry, the incremented array X must contain the nC           element vector x. On exit, X is overwritten with theC           transformed vector x.CC  INCX   - INTEGER.C           On entry, INCX specifies the increment for the elements ofC           X. INCX must not be zero.C           Unchanged on exit.CC***REFERENCES  Dongarra, J. J., Du Croz, J., Hammarling, S., andC                 Hanson, R. J.  An extended set of Fortran basic linearC                 algebra subprograms.  ACM TOMS, Vol. 14, No. 1,C                 pp. 1-17, March 1988.C***ROUTINES CALLED  LSAME, XERBLAC***REVISION HISTORY  (YYMMDD)C   861022  DATE WRITTENC   910605  Modified to meet SLATEC prologue standards.  Only commentC           lines were modified.  (BKS)C***END PROLOGUE  DTRMVC     .. Scalar Arguments ..      INTEGER            INCX, LDA, N      CHARACTER*1        DIAG, TRANS, UPLOC     .. Array Arguments ..      DOUBLE PRECISION   A( LDA, * ), X( * )C     .. Parameters ..      DOUBLE PRECISION   ZERO      PARAMETER        ( ZERO = 0D+0 )C     .. Local Scalars ..      DOUBLE PRECISION   TEMP      INTEGER            I, INFO, IX, J, JX, KX      LOGICAL            NOUNITC     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAMEC     .. External Subroutines ..      EXTERNAL           XERBLAC     .. Intrinsic Functions ..      INTRINSIC          MAXC***FIRST EXECUTABLE STATEMENT  DTRMVCC     Test the input parameters.C      INFO = 0      IF     ( .NOT.LSAME( UPLO , 'U' ).AND.     $         .NOT.LSAME( UPLO , 'L' )      )THEN         INFO = 1      ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.     $         .NOT.LSAME( TRANS, 'T' ).AND.     $         .NOT.LSAME( TRANS, 'C' )      )THEN         INFO = 2      ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.     $         .NOT.LSAME( DIAG , 'N' )      )THEN         INFO = 3      ELSE IF( N.LT.0 )THEN         INFO = 4      ELSE IF( LDA.LT.MAX( 1, N ) )THEN         INFO = 6      ELSE IF( INCX.EQ.0 )THEN         INFO = 8      END IF      IF( INFO.NE.0 )THEN         CALL XERBLA( 'DTRMV ', INFO )         RETURN      END IFCC     Quick return if possible.C      IF( N.EQ.0 )     $   RETURNC      NOUNIT = LSAME( DIAG, 'N' )CC     Set up the start point in X if the increment is not unity. ThisC     will be  ( N - 1 )*INCX  too small for descending loops.C      IF( INCX.LE.0 )THEN         KX = 1 - ( N - 1 )*INCX      ELSE IF( INCX.NE.1 )THEN         KX = 1      END IFCC     Start the operations. In this version the elements of A areC     accessed sequentially with one pass through A.C      IF( LSAME( TRANS, 'N' ) )THENCC        Form  x := A*x.C         IF( LSAME( UPLO, 'U' ) )THEN            IF( INCX.EQ.1 )THEN               DO 20, J = 1, N                  IF( X( J ).NE.ZERO )THEN                     TEMP = X( J )                     DO 10, I = 1, J - 1                        X( I ) = X( I ) + TEMP*A( I, J )   10                CONTINUE                     IF( NOUNIT )     $                  X( J ) = X( J )*A( J, J )                  END IF   20          CONTINUE            ELSE               JX = KX               DO 40, J = 1, N                  IF( X( JX ).NE.ZERO )THEN                     TEMP = X( JX )                     IX   = KX                     DO 30, I = 1, J - 1                        X( IX ) = X( IX ) + TEMP*A( I, J )                        IX      = IX      + INCX   30                CONTINUE                     IF( NOUNIT )     $                  X( JX ) = X( JX )*A( J, J )                  END IF                  JX = JX + INCX   40          CONTINUE            END IF         ELSE            IF( INCX.EQ.1 )THEN               DO 60, J = N, 1, -1                  IF( X( J ).NE.ZERO )THEN                     TEMP = X( J )                     DO 50, I = N, J + 1, -1                        X( I ) = X( I ) + TEMP*A( I, J )   50                CONTINUE                     IF( NOUNIT )     $                  X( J ) = X( J )*A( J, J )                  END IF   60          CONTINUE            ELSE               KX = KX + ( N - 1 )*INCX               JX = KX               DO 80, J = N, 1, -1                  IF( X( JX ).NE.ZERO )THEN                     TEMP = X( JX )                     IX   = KX                     DO 70, I = N, J + 1, -1                        X( IX ) = X( IX ) + TEMP*A( I, J )                        IX      = IX      - INCX   70                CONTINUE                     IF( NOUNIT )     $                  X( JX ) = X( JX )*A( J, J )                  END IF                  JX = JX - INCX   80          CONTINUE            END IF         END IF      ELSECC        Form  x := A'*x.C         IF( LSAME( UPLO, 'U' ) )THEN            IF( INCX.EQ.1 )THEN               DO 100, J = N, 1, -1                  TEMP = X( J )                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 90, I = J - 1, 1, -1                     TEMP = TEMP + A( I, J )*X( I )   90             CONTINUE                  X( J ) = TEMP  100          CONTINUE            ELSE               JX = KX + ( N - 1 )*INCX               DO 120, J = N, 1, -1                  TEMP = X( JX )                  IX   = JX                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 110, I = J - 1, 1, -1                     IX   = IX   - INCX                     TEMP = TEMP + A( I, J )*X( IX )  110             CONTINUE                  X( JX ) = TEMP                  JX      = JX   - INCX  120          CONTINUE            END IF         ELSE            IF( INCX.EQ.1 )THEN               DO 140, J = 1, N                  TEMP = X( J )                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 130, I = J + 1, N                     TEMP = TEMP + A( I, J )*X( I )  130             CONTINUE                  X( J ) = TEMP  140          CONTINUE            ELSE               JX = KX               DO 160, J = 1, N                  TEMP = X( JX )                  IX   = JX                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 150, I = J + 1, N                     IX   = IX   + INCX                     TEMP = TEMP + A( I, J )*X( IX )  150             CONTINUE                  X( JX ) = TEMP                  JX      = JX   + INCX  160          CONTINUE            END IF         END IF      END IFC      RETURNCC     End of DTRMV .C      END      SUBROUTINE DTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,     $                   B, LDB )*     .. Scalar Arguments ..      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG      INTEGER            M, N, LDA, LDB      DOUBLE PRECISION   ALPHA*     .. Array Arguments ..      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )*     ..**  Purpose*  =======**  DTRSM  solves one of the matrix equations**     op( A )*X = alpha*B,   or   X*op( A ) = alpha*B,**  where alpha is a scalar, X and B are m by n matrices, A is a unit, or*  non-unit,  upper or lower triangular matrix  and  op( A )  is one  of**     op( A ) = A   or   op( A ) = A'.**  The matrix X is overwritten on B.**  Parameters*  ==========**  SIDE   - CHARACTER*1.*           On entry, SIDE specifies whether op( A ) appears on the left*           or right of X as follows:**              SIDE = 'L' or 'l'   op( A )*X = alpha*B.**              SIDE = 'R' or 'r'   X*op( A ) = alpha*B.**           Unchanged on exit.**  UPLO   - CHARACTER*1.*           On entry, UPLO specifies whether the matrix A is an upper or*           lower triangular matrix as follows:**              UPLO = 'U' or 'u'   A is an upper triangular matrix.**              UPLO = 'L' or 'l'   A is a lower triangular matrix.**           Unchanged on exit.**  TRANSA - CHARACTER*1.*           On entry, TRANSA specifies the form of op( A ) to be used in*           the matrix multiplication as follows:**              TRANSA = 'N' or 'n'   op( A ) = A.**              TRANSA = 'T' or 't'   op( A ) = A'.**              TRANSA = 'C' or 'c'   op( A ) = A'.**           Unchanged on exit.**  DIAG   - CHARACTER*1.*           On entry, DIAG specifies whether or not A is unit triangular*           as follows:**              DIAG = 'U' or 'u'   A is assumed to be unit triangular.**              DIAG = 'N' or 'n'   A is not assumed to be unit*                                  triangular.**           Unchanged on exit.**  M      - INTEGER.*           On entry, M specifies the number of rows of B. M must be at*           least zero.*           Unchanged on exit.**  N      - INTEGER.*           On entry, N specifies the number of columns of B.  N must be*           at least zero.*           Unchanged on exit.**  ALPHA  - DOUBLE PRECISION.*           On entry,  ALPHA specifies the scalar  alpha. When  alpha is*           zero then  A is not referenced and  B need not be set before*           entry.*           Unchanged on exit.**  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m*           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.*           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by k*           upper triangular part of the array  A must contain the upper*      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -