我对Scipy null_space有问题。请看以下示例:
A = np.array([[7,3,2],[3,9,4],[2,4,5]])
eigen = np.linalg.eig(A)
具有输出特征值=
(array([13.477, 5. , 2.523]),
array([[ 0.486, 0.873, -0.041],
[ 0.74 , -0.436, -0.511],
[ 0.464, -0.218, 0.858]]))
我在 eigen 元组中有特征值和特征向量。现在,如果e
是A
的特征值(例如13.477),则显然是
A - e I
不应为空,
null = la.null_space(A-eigen[0][0]*np.eye(3))
返回
array([], shape=(3, 0), dtype=complex128)
应该是与eigen[0][0]
相对应的特征向量(请注意,当我为eigen[0][1]
和eigen[0][2]
运行相同的代码时,它会正确返回我们在上面看到的特征向量)。
为了检查这一点,我要求提供(A-eI)
的特征值和特征向量:
null_eigen = np.linalg.eig(A-eigen[0][0]*np.eye(3))
输出null_eigen =
(array([-1.243e-14, -8.477e+00, -1.095e+01]),
array([[ 0.486, 0.873, -0.041],
[ 0.74 , -0.436, -0.511],
[ 0.464, -0.218, 0.858]]))
很明显,第一个特征值对应于13.477的特征向量,“几乎”为零,但是为什么scipy.linalg.null_space没有将其拾取?
答案 0 :(得分:2)
根据null_space
的文档,
rcond
:相对条件编号。小于rcond * max(s)
的奇异值s被认为是零。默认值:floating point eps * max(M,N)
。
,因此rcond
确定有效的空空间。浮点数学并不精确,因此对于特征值,它恰好滑过阈值。为rcond
使用较大的数字将得到预期的结果:
import numpy as np
from scipy.linalg import null_space
A = np.array([[7, 3, 2],
[3, 9, 4],
[2, 4, 5]])
eigen = np.linalg.eig(A)
print(eigen[1][:, 0])
print(null_space(A - eigen[0][0]*np.eye(3), rcond=1e-14))
输出:
[0.48622704 0.74041411 0.46407996]
[[-0.48622704]
[-0.74041411]
[-0.46407996]]
有关更多详细信息,您还可以查看at the source code。