Fortran Coder

查看: 7794|回复: 6
打印 上一主题 下一主题

[线性代数] 矩阵求逆 不知道哪一步错了

[复制链接]

59

帖子

2

主题

0

精华

大师

F 币
810 元
贡献
476 点
楼主
发表于 2015-3-21 22:43:32 | 显示全部楼层
本帖最后由 kerb 于 2016-8-12 18:41 编辑

下面的程序是一位50多岁的老人写的,刚学fortran不久后的作品,可以参考一下

[Fortran] 纯文本查看 复制代码
PROGRAM MAIN
     IMPLICIT NONE
     INTEGER ( KIND = 8 ) :: N = 1000
     REAL(8) ELAPSED_TIME
     REAL(8), DIMENSION( 1000, 1000 ) :: A
     REAL(8), DIMENSION( 1000 ) :: B
     REAL(8), DIMENSION( 1000 ) :: X
     INTEGER ( KIND = 8 ) I
     CALL RANDOM_SEED() 
     CALL RANDOM_NUMBER(B)
     CALL RANDOM_NUMBER(A)
     WRITE ( UNIT = 6, FMT = * ) "EXAMPLE OF GAUSSIAN ELIMINATION AND BACK SUBSTITUTION: A * X = B"
     WRITE ( UNIT = 6, FMT = * ) "SAVE MATRIX TO FILE"
     OPEN( UNIT = 1, FILE='MAT.TXT')
     WRITE ( UNIT = 1, FMT = * ) A
     CLOSE ( 1 )
     WRITE ( UNIT = 6, FMT = * ) "SAVE RHS TO FILE"
     OPEN ( UNIT = 2, FILE = 'RHS.TXT' )
     WRITE ( UNIT = 2, FMT = * ) B
     CLOSE ( 2 )
     WRITE ( UNIT = 6, FMT = * ) "SOLVING......"
     !ELAPSED_TIME = TIMEF( )
     !CALL GAUSSJ ( A, N, B, X )
     OPEN( UNIT = 3, FILE='SOL.TXT')
     !ELAPSED_TIME = TIMEF( ) 
     !WRITE ( UNIT = 6, FMT = * ) "ELAPSED TIME: ", ELAPSED_TIME, "SECONDS"
     
     WRITE ( UNIT = 6, FMT = * ) "SAVE SOLUTION TO FILE"
     WRITE ( UNIT = 3, FMT = * ) X
     CLOSE ( 3 )
     WRITE ( UNIT = 6, FMT = * ) "SOLVING HAS COMPLETED, PRESS ENTER TO RETURN"
     PAUSE

 END PROGRAM

 SUBROUTINE GAUSSJ ( A, N, B, X )
 !AUTHOR: G. Z. CHU
 !EMAIL_TO: [url=mailto:CHUGUOZHEN@ALIYUN.COM]CHUGUOZHEN@ALIYUN.COM[/url]

     IMPLICIT NONE
     INTEGER ( KIND = 8 ) :: N
     REAL(8) :: A ( N, N )    
     REAL(8) :: B ( N )
     REAL(8) :: X ( N )

     INTEGER ( KIND = 8 ) :: IPIV ( N )
     INTEGER ( KIND = 8 ) :: IT, JT, KT, I, J, K, M, INDEX
     REAL(8) :: TEMP2, TEMP3
     REAL(8) :: MAX

     DO I = 1, N
         IPIV ( I ) = I
     END DO

     DO I = 1, N
         IT = IPIV ( I )
         MAX = DABS ( A ( I, IT ) )
         INDEX = I
         DO J = I + 1, N
             JT = IPIV ( I )
             IF ( MAX < DABS ( A ( I, JT ) ) ) THEN
                 MAX = DABS ( A ( I, JT ) )
                 INDEX = J
             END IF
         END DO
         IF ( INDEX /= IT ) THEN
             KT = IPIV ( I )
             IPIV ( I ) = IPIV ( INDEX )
             IPIV ( INDEX ) = KT
         ENDIF

         IT = IPIV ( I )
         TEMP2 = 1.D0 / A ( I, IT )

         DO K = I + 1, N
             KT = IPIV ( K )            
             !IF ( A ( I, KT ) /= 0.D0 ) THEN !IF "A" IS A SPARSE MATRIX
                 TEMP3 = A ( I, KT ) * TEMP2
                 DO M = I, N
                     !IF ( A ( M, IT ) /= 0.D0 ) THEN !IF "A" IS A SPARSE MATRIX
                         A ( M,  KT ) = A ( M, KT ) - A ( M, IT ) * TEMP3
                     !ENDIF
                 END DO
                 B ( KT ) = B ( KT ) - B ( IT ) * TEMP3
             !ENDIF
         END DO

     END DO
     !BACK-SUBSTITUTION
     DO I = N, 1, -1
         TEMP3 = 0
         IT = IPIV ( I )
         TEMP2 = 1.D0 / A ( I, IT )
         DO K = I + 1, N
             !IF ( A ( K, IT ) /= 0.D0 ) THEN !IF "A" IS A SPARSE MATRIX
                 TEMP3 = TEMP3 + A ( K, IT ) * X ( K )
             !END IF
         END DO
         X ( I ) = ( B ( IT ) -TEMP3 ) * TEMP2
     END DO

 END SUBROUTINE
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-7 09:00

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表