zgeev给出非正交的特征向量

时间:2017-02-07 06:43:10

标签: fortran lapack

我尝试使用zgeev对矩阵进行对角化,并给出正确的特征值,但特​​征向量不是正交的。

program complex_diagonalization 
implicit none
integer,parameter :: N=3
integer::i,j
integer,parameter :: LDA=N,LDVL=N,LDVR=N
real(kind=8),parameter::q=dsqrt(2.0d0),q1=1.0d0/q
integer,parameter :: LWMAX=1000
integer :: INFO,LWORK
real(kind=8) :: RWORK(2*N)
complex(kind=8) :: B(LDA,N),VL(LDVL,N),VR(LDVR,N),W(N),WORK(LWMAX)
external::zgeev
!matrix defining
B(1,1)=0.0d0;B(1,2)=-q1;B(1,3)=-q1
B(2,1)=-q1;B(2,2)=0.50d0;B(2,3)=-0.50d0
B(3,1)=-q1;B(3,2)=-0.5d0;B(3,3)=0.50d0  
LWORK=-1
 CALL ZGEEV('Vectors','Vectors',N,B,LDA,W,VL,LDVL,VR,LDVR,WORK,LWORK,RWORK,INFO)
LWORK=MIN(LWMAX,INT(WORK(1)))
CALL ZGEEV('Vectors','Vectors',N,B,LDA,W,VL,LDVL,VR,LDVR,WORK,LWORK,RWORK,INFO)

IF( INFO.GT.0 ) THEN
 WRITE(*,*)'The algorithm failed to compute eigenvalues.'
 STOP
END IF
!eigenvalues
do i=1,N
WRITE(*,*)W(i)
enddo

!eigenvectors
do i=1,N
WRITE(*,*)(VR(i,j),j=1,N)
ENDDO

end

我得到的结果是这样的: 特征值:

( 0.99999999999999978,0.0000000000000000)
(-0.99999999999999978,0.0000000000000000)
( 0.99999999999999978,0.0000000000000000)

征向量

 (0.70710678118654746,0.0000000000000000)
 (-0.50000000000000000,0.0000000000000000)
 (-0.50000000000000000,0.0000000000000000)


 (0.70710678118654746,0.0000000000000000)
(0.50000000000000000,0.0000000000000000)
 (0.50000000000000000,0.0000000000000000)

(-0.11982367636731203,0.0000000000000000)
( 0.78160853028734012,0.0000000000000000)
(-0.61215226207528295,0.0000000000000000)

你可以看到第三个特征向量与两个特征向量中的一个不正交。我期待的是,在第三个特征向量中,第一个条目应为零,第二个条目将为第三个条目的减去,因为它是单位向量,它将为0.707。

1 个答案:

答案 0 :(得分:0)

如果三个特征值是唯一的,则实对称矩阵具有三个正交特征向量。只有对应于不同特征值的特征向量必须是正交的。 https://math.stackexchange.com/a/1368948/134138

Hermitian专门的常规ZHEEV应该保证Ian Bush所建议的特征向量的正交性。或者在您的情况下,您也可以考虑DSYEV(因为您的矩阵是真实的)。

LAPACK论坛http://icl.cs.utk.edu/lapack-forum/archives/lapack/msg01352.html

在这篇文章中详细描述了这种情况

来自文档:

DSYEV:  
*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
*          orthonormal eigenvectors of the matrix A.

ZHEEV:
*          On exit, if JOBZ = 'V', then if INFO = 0, A contains the
*          orthonormal eigenvectors of the matrix A.