4

我有一个非常简单的问题。它与计算容差误差有关。

让我做(见最后)矩阵 A 在特征向量 V 和对角特征值 D 中的特征分解,并通过乘法 V^-1*D*V 再次构建它。

得到的值远不是A,误差很大。

我想知道我是否使用不正确的函数来执行此任务,或者至少,我怎样才能减少此错误。先感谢您

in[1]:import numpy
      from scipy import linalg
      A=matrix([[16,-9,0],[-9,20,-11],[0,-11,11]])
      D,V=linalg.eig(A)
      D=diagflat(D)
      matrix(linalg.inv(V))*matrix(D)*matrix(V)


out[1]:matrix([[ 15.52275377,   9.37603361,   0.79257097],  
       [9.37603361,  21.12538282, -10.23535271],  
       [0.79257097, -10.23535271,  10.35186341]])
4

1 回答 1

6

这不是倒退吗? A*V = V*D从定义来看,所以A = V*D*V^(-1).

>>> import numpy as np
>>> from scipy import linalg
>>> A = np.matrix([[16,-9,0],[-9,20,-11],[0,-11,11]])
>>> D, V = linalg.eig(A)
>>> D = np.diagflat(D)
>>> 
>>> b = np.matrix(linalg.inv(V))*np.matrix(D)*np.matrix(V)
>>> b
matrix([[ 15.52275377+0.j,   9.37603361+0.j,   0.79257097+0.j],
        [  9.37603361+0.j,  21.12538282+0.j, -10.23535271+0.j],
        [  0.79257097+0.j, -10.23535271+0.j,  10.35186341+0.j]])
>>> np.allclose(A, b)
False

>>> f = np.matrix(V)*np.matrix(D)*np.matrix(linalg.inv(V))
>>> f
matrix([[  1.60000000e+01+0.j,  -9.00000000e+00+0.j,  -9.54791801e-15+0.j],
        [ -9.00000000e+00+0.j,   2.00000000e+01+0.j,  -1.10000000e+01+0.j],
        [ -1.55431223e-15+0.j,  -1.10000000e+01+0.j,   1.10000000e+01+0.j]])
>>> np.allclose(A, f)
True

另外:有一些方法可以np.dot用来避免所有这些转换为矩阵,比如

>>> dotm = lambda *args: reduce(np.dot, args)
>>> dotm(V, D, inv(V))
array([[  1.60000000e+01+0.j,  -9.00000000e+00+0.j,  -9.54791801e-15+0.j],
       [ -9.00000000e+00+0.j,   2.00000000e+01+0.j,  -1.10000000e+01+0.j],
       [ -1.55431223e-15+0.j,  -1.10000000e+01+0.j,   1.10000000e+01+0.j]])

我经常发现它更干净,但是 YMMV。

于 2013-01-24T13:32:46.153 回答