matlab和python中同一hermitian矩阵的不同特征向量

2024-04-19 09:52:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算一个3x3厄米矩阵的特征值和特征向量。这是我用的matlab代码


coh = [0.327064707875252 + 0.00000000000000i    -0.00770057737827301 + 0.0178948268294334i  -0.00368526462214552 - 0.00615056270163515i
-0.00770057737827302 - 0.0178948268294334i  0.0122797042131420 + 0.00000000000000i  -0.000822583499745789 + 0.000295265015599135i
-0.00368526462214553 + 0.00615056270163516i -0.000822583499745789 - 0.000295265015599135i   0.00526291178539395 + 0.00000000000000i];

[V,D]=eig(coh);

V =

   0.9979 + 0.0000i   0.0229 - 0.0580i   0.0141 + 0.0140i
  -0.0243 - 0.0565i   0.9937 + 0.0000i   0.0936 + 0.0093i
  -0.0114 + 0.0192i  -0.0929 + 0.0104i   0.9954 + 0.0000i

% It should be real valued eigenvalue??
D =

   0.3284 - 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0111 - 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i   0.0050 + 0.0000i

我在文献中使用matlab中的eig()函数,它说“当A是实的、对称的或复Hermitian时,满足Av=λv的e值是实的。”

为了将结果与python进行比较,我使用np.linalg.eigh公司(). 你知道吗

import numpy as np
import scipy

coh = np.array([[ 0.32706471+0.j, -0.00770058+0.01789483j,-0.00368526-0.00615056j],
       [-0.00770058-0.01789483j,  0.0122797 +0.j,-0.00082258+0.00029527j],
       [-0.00368526+0.00615056j, -0.00082258-0.00029527j,0.00526291+0.j]])

eigenh = np.linalg.eigh(coh)

特征值和特征值的结果 python中的向量是

%eigenvalue
0.00504925
0.0111318
0.328426

%eigenvector
 (-0.01992713254631731+0.0j)     (0.0623407637085597+0.0j)   (-0.9978559708538679-0.0j)
 (-0.07298515890572027+0.05929161455059334j)     (0.3655270698873978+0.9239915820830416j)    (0.02429370804648004+0.05654205684315627j)
 (-0.706622215529945+0.7010318287578136j)    (-0.043891589739820214-0.08256315733761976j)    (0.011369094995309527-0.01915767907577206j)

matlab“eig()”和python之间有很大的区别np.linalg.eigh公司()". 我认为这不是一个正常化的问题。因为,当我对对称矩阵(不是hermitian实值)使用相同的函数时,结果是完全相同的。你知道吗

补充意见

当我检查coh矩阵(上面给出的原始输入)是否是hermitian时,matlab返回逻辑0。你知道吗

ishermitian(coh)
ans =
  logical
   0

但是,当我将输入矩阵四舍五入16时,matlab返回逻辑1。 *16的舍入值越高,则返回逻辑0。你知道吗

coh2 = round(coh,16)
ishermitian(coh2)
ans =
  logical
   1

即使我用四舍五入的输入矩阵得到实值特征值,特征向量仍然不同于python

[V2,D2]=eig(coh2);
V2 =
   0.0141 + 0.0140i   0.0293 - 0.0550i   0.5093 + 0.8581i
   0.0936 + 0.0093i   0.9874 + 0.1110i   0.0362 - 0.0497i
   0.9954 + 0.0000i  -0.0935 + 0.0000i  -0.0223 + 0.0000i

D2 =
    0.0050         0         0
         0    0.0111         0
         0         0    0.3284

Tags: 函数importnp公司矩阵逻辑matlab特征值
1条回答
网友
1楼 · 发布于 2024-04-19 09:52:56

如果你写imag(D),你会看到本征值的虚部在1e-18的顺序。在舍入误差0以内(与特征值的大小相比)。但是因为MATLAB不知道特征值应该是实数,所以它把它们作为复数给你。你知道吗

如果你知道特征值应该是实值的,只需要取它们的实部:

D = real(D);

关于编辑后的问题:

矩阵coh几乎是厄米特矩阵,但并不完全是厄米特矩阵。例如,您可以这样检查:

max(abs(reshape((coh - coh')./coh, 1, [])))

返回1.9e-15。这是一个大于eps的数量级,这是MATLAB不认为它是Hermitian的原因。你知道吗

Python代码中输入的矩阵略有不同。如果我将这些值复制到MATLAB中,我会看到:

coh2 = [0.32706471+0.0j, -0.00770058+0.01789483j, -0.00368526-0.00615056j
       -0.00770058-0.01789483j,  0.0122797+0.0j, -0.00082258+0.00029527j
       -0.00368526+0.00615056j, -0.00082258-0.00029527j, 0.00526291+0.0j];
max(abs(reshape((coh2 - coh2')./coh2, 1, [])))

此代码返回0。同时ishermitian(coh2)返回true。你知道吗

最后,比较cohcoh2的本征值,我们发现了数量级1e-8的差异:

flip(real(eig(coh))) - eig(coh2) % `flip` fixes the ordering difference
ans =
   1.0e-08 *
   0.085548579158157
   0.539922194800480
  -0.238091968363108

相关问题 更多 >