matrix - hallar - valores y vectores propios de una matriz 3x3 julioprofe
LAPACK me da valores propios incorrectos (1)
Como se indica en la documentación de lapack , el DSYEV
se puede usar para matrices simétricas.
DSYEV calcula todos los autovalores y, opcionalmente, los vectores propios de una matriz A simétrica real.
En el ejemplo, la matriz A
no es simétrica
Dimension of the matrix, n= 3
A matrix in full form:
0.00 1.00 0.00
0.35 0.29 0.35
0.50 0.00 0.50
En este caso, debe usar DGEEV
que se utiliza para matrices asimétricas
DGEEV calcula para una matriz N no simétrica real N-by-N, los valores propios y, opcionalmente, los autovectores propios izquierdo y / o derecho.
En general, los valores propios son números complejos, por lo que debe proporcionar WR
y WL
. Además, debe definir si desea dejar VL
o VR
autovectores correctos.
A * v(j) = lambda(j) * v(j)
u(j)**H * A = lambda(j) * u(j)**H
La definición de la función es:
DGEEV(JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
Sugiero usarlo como
LWORK = 4*N
CALL DGEEV( ''N'', ''V'', n, A, n, wr, wl, Ap, n, Ap, n, work, lwork, info )
Para obtener el uso de vectores propios tanto derechos como izquierdos
real*8:: A(n,n),VL(n,n),VR(n,n)
real*8:: wr(n),wl(n)
lwork = 4*N
allocate(work(lwork))
CALL DGEEV( ''V'', ''V'', n, A, n, wr, wl, VL, n, VR, n, work, lwork, info )
Para su matriz, la parte imaginaria de todos los valores propios es cero. Entonces los autovalores son (1.00, -0.21, 0.00)
.
Estoy usando DSYEV y DSYEVD de la biblioteca LAPACK para encontrar valores propios y vectores propios (sintaxis de compilación: gfortran -llapack). Sin embargo, encuentro valores propios erróneos ( -0.44,0.35,0.88
) para una matriz particular. ¿Qué está mal?
Uno puede ver fácilmente que la matriz tiene cero determinante, por lo que al menos un valor propio debe ser cero.
Aquí está mi código (espero que no sea demasiado grande):
Program Real_Eigenvec
implicit none
integer, parameter:: n=3
integer:: i,j, flag
real*8:: A(n,n),X(n,n)
real*8:: lambda(n)
real*8, parameter:: p=0.5d0/dsqrt(2.d0), q=1.d0-1.d0/dsqrt(2.d0)
Print*,''Enter flag: 0 for DSYEV, 1 for DSYEVD''
Read*, flag
A= transpose(reshape((/ 0.d0, 1.d0, 0.d0, p, q, p, 0.5d0, 0.0d0, 0.5d0 /), shape(A)))
print*,''Dimension of the matrix, n='',int(sqrt(float(size(A))))
Print*,''A matrix in full form:''
Do i=1,n
print 100, (A(i,j),j=1,n)
End Do
call Eigen(A,lambda,X,n,flag)
! Print the eigenvalues and eigenvectors.
PRINT 200
DO i = 1, n
PRINT 201, lambda(i), (X(i,j), j=1,n)
END DO
100 FORMAT (1X,10(:2X,F10.2))
200 FORMAT (/1X, ''Eigenvalue'', 16X, ''Eigenvector^T'')
201 FORMAT (1X, F10.2,4X,6(:f10.2))
End Program Real_Eigenvec
!!! SUBROUTINES -----------------------------------------
Subroutine Eigen(A,lambda,X,n,flag)
implicit none
integer:: i,n,flag
real*8:: A(n,n),Ap(n,n),X(n,n)
real*8:: lambda(n)
real*8, allocatable :: work(:)
integer, allocatable :: iwork(:)
integer:: lwork,liwork,info
print*,''n in Eiegen routine='',n
lwork=3*n-1 ! DSYEV for flag=0
if (flag==1) then ! DSYEVD for flag=1
lwork=1+6*n+2*n**2
end if
liwork=3+5*n
allocate(work(lwork))
allocate(iwork(liwork))
Ap=A
if (flag==0) then
CALL DSYEV (''v'', ''l'', n, Ap, n, lambda, work, lwork, info)
else
CALL DSYEVD (''V'', ''U'', n, Ap, n, lambda, work, &
& lwork, iwork, liwork, info)
! For doumentation visit: http://www.netlib.org/lapack/explore-html/d1/da2/dsyevd_8f.html
end if
X=Ap
print*,''info='',info
deallocate(work)
deallocate(iwork)
End Subroutine Eigen