(fortran)如何使用拉帕克(Lapack)的dsyev来计算(平方)矩阵的特征值



我想从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在文档中的含义。

  1. 您想计算A的特征值,但请使用M
  2. 致电您的dsyev
  3. 您声明,但不要分配A
  4. 您既没有声明,定义也不分配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 ...

最新更新