numpy本征分解会产生意外的输出?

问题描述 投票:0回答:1

根据numpy.linalg.eig的文档以及我对本征分解的理解,以下代码

aa = [[1,1],[-1,-1]]
w, v = np.linalg.eig(aa)
cc = aa@v
print(cc)
print(w)

应产生

[[√2,0],[-√2,0]]
[4,0]

但是它产生了

[[ 1.11022302e-16+1.11022302e-16j  1.11022302e-16-1.11022302e-16j]
 [-1.11022302e-16-1.11022302e-16j -1.11022302e-16+1.11022302e-16j]]
[-3.25176795e-17+1.57009246e-16j -3.25176795e-17-1.57009246e-16j]

所以我在哪里错了?

numpy algebra eigenvector
1个回答
1
投票

这里您的两个特征值理论上是w_th=[0,0],所以:

w
>>> array([-3.25176795e-17+1.57009246e-16j, -3.25176795e-17-1.57009246e-16j])

只是一些零+/-舍入误差。关于特征向量,它们是v_th=[[1,1],[-1,-1]],但是numpy.linalg.eig将它们归一化,这意味着它给了您[[1/sqrt(2),1/sqrt(2)],[-1/sqrt(2),-1/sqrt(2)]]

v
>>>> array([[ 0.70710678+0.00000000e+00j,  0.70710678-0.00000000e+00j],
            [-0.70710678+1.11022302e-16j, -0.70710678-1.11022302e-16j]])

并且您可以通过比较方程式的两边来进行数字验证:

np.allclose(a@v,w@v)
>>> True

或具有理论值:

np.allclose([email protected]([[1,1],[-1,-1]]),np.array([0,0])*np.array([[1,1],[-1,-1]]))

所以这里的numpy没什么问题,似乎只是您的分析特征值[[4,0]]可能为假。

© www.soinside.com 2019 - 2024. All rights reserved.