Dear Python-users, I am currently very confused about the Scipy routine to obtain the eigenvectors of a complex matrix.In attached you find two files to diagonalize a 2X2 complex Hermitian matrix, however, on my computer, If I run python, I got: [[ 0.80322132+0.j 0.59500941+0.02827207j] [-0.59500941+0.02827207j 0.80322132+0.j ]] If I compile the fortran code, I got: ( -0.595009410289, -0.028272068905) ( 0.802316135182, 0.038122316497) ( -0.803221321796, 0.000000000000) ( -0.595680709955, 0.000000000000) >From the scipy webpage, it is said that numpy.linalg.eig() provides nothing >butan interface to lapack zheevd subroutine, which is used in my fortran code. Would somebody be kind to tell me how to get consistent results? Many thanks in advance. Best wishes, Hongbin
Ad hoc, ad loc and quid pro quo --- Jeremy Hilary Boob
!!********************************************************************************************* !! !! !!********************************************************************************************* !! ifort -CB *.f90 -L/usr/local/intel/lib/intel64 -lifcore -limf -Wl,-rpath,/usr/local/intel/lib/intel64 -llapack_ifort -lblas_ifort -o 2X2.x Program twobytwo !! !! Implicit None !!>>>>>>>>>>>>>>>>>> HAMILTONINA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Complex*16 :: Hamiltonian(2,2) Complex*16 :: Hamilt(2,2) Real*8,ALLOCATABLE :: eigenvals(:) Real*8 :: eigentmp Complex*16, ALLOCATABLE :: eigenvects(:,:),ceigenvals(:) Complex*16 :: dummy(1,1) Integer :: lwork, liwork, lrwork, info Integer,PARAMETER :: lwmax=180000 Complex*16 :: work(lwmax) Real*8,ALLOCATABLE :: rwork(:) real*8 :: vl, vu integer :: ne Real*8 :: abstol integer,allocatable :: ifail(:),iwork(:) integer,allocatable :: order(:) !!LOCAL Integer :: i, j, k Real*8, PARAMETER :: pi=3.1415926535897932384626d0 Complex*16,PARAMETER :: im_i=cmplx(0.0d0,1.0d0) abstol=2.0d0*tiny(abstol) allocate(eigenvals(2)) allocate(ceigenvals(2)) allocate(eigenvects(2,2)) lwork=12.0*2 lrwork=1+2*5+2*2**2 liwork=3+5*2 allocate(rwork(17*2)) allocate(iwork(15*2)) allocate(ifail(15*2)) allocate(order(2)) Hamiltonian=cmplx(0.0d0,0.0d0) Hamiltonian(1,1)=cmplx(0.6d0,0.d0) Hamiltonian(1,2)=cmplx(-1.97537668d0,-0.09386068d0) Hamiltonian(2,1)=cmplx(-1.97537668d0,+0.09386068d0) Hamiltonian(2,2)=cmplx(-0.6d0,0.0d0) Hamilt=Hamiltonian Call print_matrix("Hamiltonian",2, 2, Hamiltonian) !!@_@ ! lwork=-1 ! work(:)=cmplx(0.0d0,0.0d0) ! rwork=0.0d0 !@_@ digonalizing with ZGEEV ---- omitting the overlap matrix ! call ZGEEV('No leftvectors','Vectors right', 2, HH1, 2, ceigenvals,dummy,1,eigenvects, 2, work,lwork,rwork,info) ! lwork=min(lwmax,INT(work(1))) ! call ZGEEV('No leftvectors','Vectors right', 2, HH1, 2, ceigenvals,dummy,1,eigenvects, 2, work,lwork,rwork,info) ! eigenvals(:)=REAL(ceigenvals) !!@_@ ! call zheevx('V','A','U',2,Hamiltonian,2,vl,vu,1,2,abstol,ne,eigenvals,eigenvects,2,work,lwork,rwork,iwork, ifail,info) !!@_@ lwork=-1 liwork=-1 lrwork=-1 call zheevd('V','U',2,Hamiltonian,2,eigenvals, work, lwork, rwork, lrwork, iwork, liwork, info) lwork=MIN(lwmax,int(work(1))) lrwork=min(lwmax,int(rwork(1))) liwork=min(lwmax,iwork(1)) call zheevd('V','U',2,Hamiltonian,2,eigenvals, work, lwork, rwork, lrwork, iwork, liwork, info) eigenvects=Hamiltonian IF (INFO .EQ. 0) then !write(*,*) "Hamiltonian has been successfully diagonalized!" ELSE write(*,*) "Problems in digonalizing the Hamiltonian................................." STOP End IF !write(*,*) eigenvals !call sorty(eigenvals,2,order) write(*,*) eigenvals call print_matrix("eigenvectors:",2,2,eigenvects) !write(*, '(A, f8.4,1X,A,2i4)') "t = ", t, "order()=", order Deallocate(eigenvals) Deallocate(ceigenvals) Deallocate(rwork) Deallocate(iwork) Deallocate(ifail) Deallocate(eigenvects) Deallocate(order) End Program twobytwo !!************************************************************************************************ Subroutine sort(eigenvals, n) !! !! Using the Gnome algorithm to sort n eigenvalues !!--------------------------------------------------------------------------- !! Integer :: n Real*8 :: eigenvals(n) !!LOCAL Real*8 :: eigentmp Integer :: i,j,k ! Write(*,*) 'Sorting >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' i=2 j=3 Do While (i <= n) IF ( eigenvals(i-1) <= eigenvals (i) ) then i=j j=j+1 ELSE eigentmp=eigenvals(i) eigenvals(i)=eigenvals(i-1) eigenvals(i-1)=eigentmp i=i-1 IF ( i == 1 ) then i=j j=j+1 End IF End IF End do End Subroutine sort !!******************************************************************************** Subroutine sorty(eigenvals, n, order) !! !! Using the Gnome algorithm to sort n eigenvalues and berry curvature !!--------------------------------------------------------------------------- !! Integer :: n Real*8 :: eigenvals(n) Integer :: order(n) !!LOCAL Real*8 :: eigentmp Integer :: i,j,k,o Do i=1,n order(i)=i End Do !Write(*,*) 'Sorting >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' i=2 j=3 Do While (i <= n) IF ( eigenvals(i-1) <= eigenvals (i) ) then i=j j=j+1 ELSE eigentmp=eigenvals(i) eigenvals(i)=eigenvals(i-1) eigenvals(i-1)=eigentmp o=order(i) order(i)=order(i-1) order(i-1)=o i=i-1 IF ( i == 1 ) then i=j j=j+1 End IF End IF End do End Subroutine sorty !!***************************************************************************************** Subroutine PRINT_MATRIX(message, M, N, A) !! !! print out complex matrix !!----------------------------------------------------------------------------- !! Character*(*) message Integer M, N, I, J Complex*16 A(M, N) Write(*,*) Write(*,*) message Do I = 1, M write(*,9998) ( A(I, J), J=1, N) End Do ! 9998 FORMAT( 12(:,1X,'(',F16.12,',',F16.12,')')) Return End Subroutine PRINT_MATRIX
import numpy H=[[0.6+0.0j, -1.97537668-0.09386068j],[-1.97537668+0.09386068j, -0.6+0.0j]] eval,evecs=numpy.linalg.eig(H) print eval print evecs
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion