繁体   English   中英

Scipy null_space 没有给我正确的答案

[英]Scipy null_space does not give me the correct answer

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

我在特征元组中有特征值和特征向量。 现在如果eA的特征值(例如 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 没有拾取它?

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

有关详细信息,您还可以查看源代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM