2012-03-06 43 views
1

我試圖讓LAPACK的ZGEEV例程用於測試問題的工作,並具有一定的困難。我剛開始在FORTRAN編碼一個星期前,所以我認爲這是可能是一些很瑣碎,我很想念。FORTRAN ZGEEV,所有0的特徵值

我對角化相當大的複雜的對稱矩陣。要開始使用Matlab,我創建了一個200×200的矩陣,我已驗證它是可對角化的。當我運行代碼時,它不會引發錯誤,並且INFO = 0,表示成功。但是,我知道所有的特徵值都是(0,0)是錯誤的。

附件是我的代碼。

PROGRAM speed_zgeev 
    IMPLICIT NONE 
    INTEGER(8) :: N 
    COMPLEX*16, DIMENSION(:,:), ALLOCATABLE :: MAT 
    INTEGER(8) :: INFO, I, J 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: RWORK 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: D 
    COMPLEX*16, DIMENSION(1,1) :: VR, VL 
    INTEGER(8) :: LWORK = -1 
    COMPLEX*16, DIMENSION(:), ALLOCATABLE :: WORK 
    DOUBLE PRECISION :: RPART, IPART 

    EXTERNAL ZGEEV 
    N = 200 

    ALLOCATE(D(N)) 
    ALLOCATE(RWORK(2*N)) 
    ALLOCATE(WORK(N)) 
    ALLOCATE(MAT(N,N)) 

    OPEN(UNIT = 31, FILE = "newmat.txt") 
    OPEN(UNIT = 32, FILE = "newmati.txt") 
    DO J = 1,N 
    DO I = 1,N 
    READ(31,*) RPART 
    READ(32,*) IPART 
    MAT(I,J) = CMPLX(RPART, IPART) 
    END DO 
    END DO 

    CLOSE(31) 
    CLOSE(32) 

    CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO) 
    INFO = WORK(1) 

    DEALLOCATE(WORK) 
    ALLOCATE(WORK(INFO)) 

    CALL ZGEEV('N','N', N, MAT, N, D, VL, 1, VR, 1, WORK, LWORK, RWORK, INFO) 

    IF (INFO .EQ. 0) THEN 
    PRINT*, D(1:10) 
    ELSE 
    PRINT*, INFO 
    END IF 

    DEALLOCATE(MAT) 
    DEALLOCATE(D) 
    DEALLOCATE(RWORK) 
    DEALLOCATE(WORK) 


END PROGRAM speed_zgeev 

我試過相同的代碼在較小的矩陣,大小30 30,他們工作正常。任何幫助,將不勝感激!謝謝。

我忘了提,我加載從我已經驗證是工作權的測試文件矩陣。

回答

3

也許LWORK = WORK (1)而不是?還要更改ALLOCATE(WORK(INFO))

+0

非常感謝。有效。 – Jeremie187 2012-03-06 06:51:20