2016-11-22 7 views
0

DSYEV에서 가장 작은 고유 값을 찾고 싶습니다. DSYEV 코드에 무엇을 넣을 지 모르겠습니다.(Fortran) lapack의 DSYEV를 사용하여 (정사각형) 행렬의 고유 값을 계산하려면 어떻게해야합니까?

내 행렬 A가 45x45이고 그 고유 값을 찾고 싶다고 말하십시오. 지금까지 내가 가진 :

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 

나도 상위 삼각 행렬을 저장하기 위해 선택하여 무엇을 의미하는지 정말 모르겠어요. LWORK이 문서에서 무엇을 의미하는지 아직도 알지 못합니다.

+0

@HighPerformanceMark이 부분이 변경되었습니다. 그러나 세그먼트 오류가 발생합니다. 나는 또한 예제를 추가했다. –

+0

초기화되지 않은 M 행렬로 콜레 스키를 호출합니다. –

답변

0
  1. 당신은 A의 고유 값을 계산하지만 당신은 선언 M
  2. 로 dsyev 전화를 원하지만 정의하거나 할당, 당신을 A
  3. 를 할당하지 어느 쪽도 선언하지 M

경우 당신의 매트릭스가 온거야? 다른 곳에서 계산하면 서브 루틴으로 전달해야 할 수도 있습니다. 그런 다음 치수도 전달해야합니다.

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 

이와 비슷한 내용 (예를 들어 완전하지 않음).

당신은 거기에 고유 값을 필요로 확인 메신저, 호출 루틴 aswell에서 고유 벡터를 할당해야합니다

...

WORK 및 LWORK 정말 당신을 염려 할 필요가 없습니다. 위, 아래에 대해 A 매트릭스를보고 dsyev 전화를 전후합니다.