微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

numpy给出错误的特征向量?

如何解决numpy给出错误的特征向量?

好的,这真的很奇怪。我有这个厄米矩阵,由于某种原因,numpy特征向量实际上不是特征向量!什么!

matrix = np. array([[ 5.  +0.j,0.  +0.j,61.14109509+774.06193172j,3.11819585 -39.47715852j,0.  +0.j  ],[ 0.  +0.j,5.  +0.j,-9.52578079 -11.43230285j,-9.52578079 +11.43230285j,-244.56443004+597.56276449j,-8.63584441  -7.34967968j,10.68293151  -3.8040208j,-2.04708711 -11.15370048j,-12.47278593 -30.47570099j,10.68293151  +3.8040208j,-550.26995517+421.06359727j,-28.06376771 -21.47424346j,-8.63584441  +7.34967968j,61.14109509+421.06359727j,3.11819585 -21.47424346j,-2.04708711 +11.15370048j,-244.56443004+244.56443004j,-12.47278593 -12.47278593j,-550.26995517 +68.06526281j,-28.06376771  -3.4713284j,61.14109509 +68.06526281j,3.11819585  -3.4713284j,-244.56443004-108.43390441j,-12.47278593  +5.53012912j,-550.26995517-284.93307164j,-28.06376771 +14.53158665j],[  61.14109509-774.06193172j,340.  +0.j,-244.56443004-597.56276449j,8.29952587  -8.790553j,8.29952587  +8.790553j,-550.26995517-421.06359727j,61.14109509-421.06359727j,-244.56443004-244.56443004j,-550.26995517 -68.06526281j,61.14109509 -68.06526281j,-244.56443004+108.43390441j,-550.26995517+284.93307164j,-5.  +0.j,-550.26995517-284.93307164j],[ 3.11819585 +39.47715852j,61.14109509-774.06193172j,-12.47278593 +30.47570099j,-28.06376771 +21.47424346j,3.11819585 +21.47424346j,-12.47278593 +12.47278593j,-28.06376771  +3.4713284j,3.11819585  +3.4713284j,-12.47278593  -5.53012912j,-28.06376771 -14.53158665j,-5.  +0.j  ]])

testvec = LA.eigh(matrix)[1][:,18]
testval = LA.eigh(matrix)[0][18]

print(testval)
print(np.dot(matrix,testvec)/testvec)

输出

28.081038605585686
[ -183.43245272+1.74213886e+01j    28.08103861+7.25481867e-11j
    28.08103861+1.27643875e-11j    28.08103861-1.41589018e-12j
    28.08103861-6.60184127e-13j    28.08103861+6.75330988e-12j
    28.08103861+1.16790389e-14j    28.08103861-3.70296960e-12j
   236.26728922+3.14873632e+02j -1079.23472835-4.74317731e+01j
    28.08103861-9.92409189e-12j    28.08103861-3.35359500e-11j
    28.08103861-1.04000538e-13j    28.08103861+2.78132206e-13j
    28.08103861+4.88732504e-12j    28.08103861+3.98266910e-14j
    28.08103861-1.37676972e-12j   586.99433236-4.65807994e+02j
   -14.23315879+4.40331948e+03j    28.08103861+1.56567705e-09j
    28.08103861-4.39930895e-10j    28.08103861-7.51553075e-12j
    28.08103861+1.92682082e-11j    28.08103861+9.93263280e-11j
    28.08103861+3.95907444e-13j    28.08103861-6.75700975e-12j
  -118.22531925+5.61652861e+01j    -2.79796252-1.38935399e+02j
    28.08103861+3.03407400e-11j    28.08103861+5.30616379e-10j
    28.08103861+3.10058409e-12j    28.08103861-5.18881898e-13j
    28.08103861+3.52468153e-12j    28.08103861-4.98108172e-14j
    28.08103861+3.96217802e-13j  -238.25990447-8.91950754e+02j]

这有什么意义?有些组件正确无误,而另一些却不正确?这是什么问题?

解决方法

您的问题是由于数字精度接近0而发生的,testvec可能是:

array([-3.59900540e-19+0.00000000e+00j,-5.17637105e-04-2.76467148e-04j,-2.15232299e-04+2.40919102e-04j,8.68903778e-03+1.58504512e-02j,1.31080038e-02+2.40391043e-02j,-7.77501222e-04-1.52668092e-03j,-2.73682736e-01-6.93085398e-01j,7.51273340e-03+1.59428750e-02j,2.46330734e-16-7.52436308e-17j,5.52080470e-20+2.96032521e-19j,-7.05446819e-04-1.48378619e-04j,-6.84977730e-05-4.20362420e-04j,-1.49592643e-02+2.24449546e-02j,-3.65064949e-02+3.22827890e-03j,-4.67427537e-04-1.08629775e-03j,-1.42698210e-01-3.57459915e-02j,3.32809901e-02-6.92791416e-03j,-4.41354873e-17-2.80018652e-17j,5.42101086e-20-2.16840434e-19j,1.01201785e-05-2.46242545e-05j,-7.40223595e-06-3.96792638e-06j,1.59380630e-03-7.50085850e-04j,2.22688637e-03+3.68340275e-04j,7.47964828e-05+1.05972530e-04j,1.78419605e-01+6.68711013e-02j,-4.96084176e-03+2.62909133e-04j,3.14618038e-17-1.33145850e-16j,1.19770459e-18+4.40457133e-18j,-6.97579774e-05-3.73394056e-04j,9.88225468e-05-1.83875899e-04j,-1.60717176e-02-1.45382244e-02j,-2.77458699e-02-2.33076540e-02j,-2.06341303e-04-7.03094158e-04j,5.14279493e-01-3.37559644e-01j,3.56457556e-02-2.54713924e-02j,7.10394311e-17+5.07212415e-17j])

如果您仔细观察,则接近0的条目中的值会有所不同,通常在除法中存在精度问题。

当您执行print(np.dot(matrix,testvec)/testvec)时,您假设testvec的所有条目都不为0(或关闭)。如果您尝试使用此代码:

np.isclose(np.dot(matrix,testvec),testval*testvec)

您将看到它们确实是特征值和特征向量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。