2016-11-22 1 views
0

Je veux trouver la plus petite valeur propre de DSYEV et je ne suis pas sûr de ce que je suis censé mettre dans le code pour DSYEV.(Fortran) Comment utiliser DSYEV de lapack pour calculer les valeurs propres d'une matrice (carrée)?

Dites ma matrice A est 45x45 et je veux trouver ses valeurs propres. Jusqu'à présent, j'ai:

subroutine eigenvalues() 
implicit none 
real(kind=8),allocatable,dimension(:,:)::A 
real(kind=8),allocatable,dimension(:)::WORK, W 
integer, allocatable, dimension(:)::t 
integer::info,k,Z 
t = shape(A) 
k = t(1) 
allocate(W(k)) 
print *, shape(M) 
Z = 3*k-1 
call dsyev('N','U',k,M,k,W,WORK,Z,info) 
end subroutine eigenvalues 

Je ne suis pas vraiment sûr de ce que l'on entend en choisissant de stocker soit la matrice triangulaire supérieure. Je ne sais pas ce que signifie LWORK de la documentation encore.

+0

@HighPerformanceMark Changé cette partie. Pourtant, il arrive avec une erreur de segmentation. J'ai aussi ajouté un exemple. –

+0

Vous appelez votre cholesky avec la matrice M qui n'est pas initialisée –

Répondre

0
  1. Vous voulez calculer les valeurs propres de A mais appelez votre dsyev avec M
  2. Vous déclarez, mais n'allouent A
  3. Vous ne déclare, définir ou allouer M

Où tes matrices viennent-elles? Vous devrez peut-être les transmettre à votre sous-programme si vous les calculez ailleurs. Ensuite, vous devez passer les dimensions aussi.

subroutine eigenvalues(A,k,k,eigvalues) 

!calling list 
integer, intent(in)    :: k 
double precision, intent(inout) :: A(k,k), eigvalues(k) 

!local 
double precision,allocatable :: work(:) 
integer      :: lwork,info 

lwork = max(1,3*k-1) 
allocate(work(lwork)) 


call dsyev('N','U',k,A,k,eigvalues,WORK,LWORK,info) 
if(info .neq. 0) exit 

Quelque chose comme ceci (exemple non complet).

Vous aurez besoin d'affecter votre vecteur dans la valeur propre aswell appeler la routine, je suis sûr que vous avez besoin des valeurs propres là ...

TRAVAIL et ne LWORK vraiment pas besoin de vous inquiéter. À propos de Upper et Lower, regardez votre matrice A avant et après votre appel dsyev ...