我想从dsyev找到最小的特征值,我不确定我要在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在文档中的含义。
- 您想计算
A
的特征值,但请使用M
致电您的dsyev - 您声明,但不要分配
A
- 您既没有声明,定义也不分配
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
类似的东西(不是完整的示例)。
您需要在调用例程中分配特征值向量,同时我确定您需要那里的特征值...
工作和LWork并不需要您的关心。大约上下,请查看您的dsyev呼叫之前和之后的矩阵A
...