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执行符号操作,因此它的答案(当它可以得到一个时)正是理论所预测的.