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]])