2016-11-22 21 views
0

Я хочу найти наименьшее собственное значение от DSYEV, и я не уверен, что я намерен внести в код для DSYEV.(Fortran) Как использовать DSYEV из lapack для вычисления собственных значений (квадратной) матрицы?

Скажите, что моя матрица 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 но назвать свой dsyev с M
  2. Вы объявляете, но не выделяют 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, я уверен, вам нужно собственные там ...

РАБОТА и LWORK действительно не должны вас беспокоить. О верхнем и нижнем, посмотрите на свою матрицу A до и после вашего звонка dsyev ...

 Смежные вопросы

  • Нет связанных вопросов^_^