Matrix 拉帕克给了我错误的特征值

Matrix 拉帕克给了我错误的特征值,matrix,fortran,lapack,eigenvalue,Matrix,Fortran,Lapack,Eigenvalue,我使用LAPACK库中的DSYEV和DSYEVD查找特征值和特征向量(编译语法:gfortran-llapack)。但是,对于特定的矩阵,我发现了错误的特征值(-0.44,0.35,0.88)。怎么了 很容易看出矩阵的行列式为零,所以至少有一个特征值必须为零 这是我的代码(希望不要太大): 如lapack中所述,DSYEV可用于对称矩阵 DSYEV计算实对称矩阵a的所有特征值和(可选)特征向量 在本例中,矩阵A是不对称的 Dimension of the matrix, n=

我使用LAPACK库中的DSYEV和DSYEVD查找特征值和特征向量(编译语法:gfortran-llapack)。但是,对于特定的矩阵,我发现了错误的特征值(
-0.44,0.35,0.88
)。怎么了

很容易看出矩阵的行列式为零,所以至少有一个特征值必须为零

这是我的代码(希望不要太大):

如lapack中所述,
DSYEV
可用于对称矩阵

DSYEV计算实对称矩阵a的所有特征值和(可选)特征向量

在本例中,矩阵
A
是不对称的

Dimension of the matrix, n=           3
A matrix in full form:
     0.00        1.00        0.00
     0.35        0.29        0.35
     0.50        0.00        0.50
在这种情况下,您应该使用
DGEEV
,它用于不对称

DGEEV计算N×N实非对称矩阵A的特征值和(可选)左和/或右特征向量

A * v(j) = lambda(j) * v(j)
u(j)**H * A = lambda(j) * u(j)**H
通常情况下,特征值是复数,因此必须提供
WR
WL
。此外,您需要定义是要左
VL
还是右
VR
特征向量

A * v(j) = lambda(j) * v(j)
u(j)**H * A = lambda(j) * u(j)**H
该功能的定义是:

DGEEV(JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
我建议像这样使用它

LWORK = 4*N
CALL DGEEV( 'N', 'V', n, A, n, wr, wl, Ap, n, Ap, n, work, lwork, info )
为了得到左右特征向量,使用

real*8:: A(n,n),VL(n,n),VR(n,n)
real*8:: wr(n),wl(n)
lwork = 4*N
allocate(work(lwork))
CALL DGEEV( 'V', 'V', n, A, n, wr, wl, VL, n, VR, n, work, lwork, info )

对于你的矩阵,所有特征值的虚部为零。因此特征值是
(1.00,-0.21,0.00)

没有多少人跟随,如果你想有人帮助你,最好只在必要时使用版本标签(这里不是这样)。谢谢@VladimirF。我会在以后的帖子中记住这一点。非常感谢。我完全没有想到DSYEV只对对称矩阵有效。但是,使用
调用DGEV('N','V',N,A,N,wr,wl,Ap,N,Ap,N,work,lwork,info)
我仍然收到一条错误消息:
**在进入DGEV时,参数编号13有一个非法值info=-13
。我已经声明了
real*8::wr(n),wi(n)
。消息告诉您检查参数编号13。是你干的吗?哪一个是它,它有哪一个值?因为你需要特征向量@hbaromega,你必须设置LWORK>=4*N。我会在回答问题时更新它,说
LWORK=4*N
(在我的例子中是12)产生的所有特征值都是零@ctheo,你也在测试我的代码吗?是的,我也在测试。所有特征值的虚部为零(wl),而wr如上所述。你得到的结果是什么?