numpy特征分解是否产生意外输出?

numpy特征分解是否产生意外输出?,numpy,algebra,eigenvector,Numpy,Algebra,Eigenvector,根据numpy.linalg.eig的文档以及我对特征分解的理解,以下代码: a = [[1,1],[-1,-1]] w, v = np.linalg.eig(a) c = a@v print(c) 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

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

a = [[1,1],[-1,-1]]
w, v = np.linalg.eig(a)
c = a@v
print(c)
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]

那么我错在哪里呢?

矩阵
a

a = np.array([[ 1,  1],\
              [-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]
,但将它们归一化为单位长度(例如,对于第一个
np.linalg.norm(v[:,0],2)=0.99…
),这意味着它只是给了你一个
[[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]])
了解了以上所有内容后,您现在可以通过比较方程的两侧来进行数值验证:

或具有理论值,即“无”舍入误差:

a@np.asarray(v_th)
>>> array([[0, 0],
           [0, 0]])

np.asarray(w_th)*np.asarray(v_th)
>>> array([[0, 0],
           [0, 0]])
所以这里的numpy输出并没有什么意外的,似乎只是你的分析特征值
[4,0]
是假的

a@np.asarray(v_th)
>>> array([[0, 0],
           [0, 0]])

np.asarray(w_th)*np.asarray(v_th)
>>> array([[0, 0],
           [0, 0]])