Numpy计算特征向量是不正确的

use*_*112 0 python numpy sympy scipy

我在Python中运行以下内容并期望E [1]中的列是A的特征向量,但它们不是.只有Sympy.Matrix.eigenvects()似乎做得对.为什么这个错误?

A
Out[194]: 
matrix([[-3,  3,  2],
        [ 1, -1, -2],
        [-1, -3,  0]])

E = np.linalg.eig(A)

E
Out[196]: 
(array([ 2., -4., -2.]),
 matrix([[ -2.01889132e-16,   9.48683298e-01,   8.94427191e-01],
         [  5.54700196e-01,  -3.16227766e-01,  -3.71551690e-16],
         [ -8.32050294e-01,   2.73252305e-17,   4.47213595e-01]]))

A*E[1] / E[1]
Out[205]: 
matrix([[ 6.59900617, -4.        , -2.        ],
        [ 2.        , -4.        , -3.88449298],
        [ 2.        ,  8.125992  , -2.        ]])
Run Code Online (Sandbox Code Playgroud)

小智 5

  • 特征向量是正确的,在预期的误差范围内.
  • 你发现的是用元素划分测试特征向量是个坏主意.

更好的方法是计算matrix*vector和之间差异的范数eigenvalue*vector.

NumPy在浮点算术中执行计算,限制为52位精度(双精度).这意味着它的任何答案都可能包含数字误差,至少相对大小为2**( - 52),大约为2e-16.所以,当你看到一个像2e-16这样的数字来自一个数字大小为1-3的计算时,结论是:"这个数字应该可能为零,而我们所拥有的数值可能只是噪音".如果你除以那个数字,就会得到噪音.

另一方面,SymPy执行符号操作,因此它的答案(当它可以得到一个时)正是理论所预测的.