zgeev 给出不正交的特征向量

zgeev giving eigenvectors which are not orthogonal

我尝试使用 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。

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

Hermitian 专用例程 ZHEEV 应按照 Ian Bush 的建议保证特征向量的正交性。或者在你的情况下你也可以考虑 DSYEV (因为你的矩阵是真实的)。

LAPACK 论坛 post 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.