【问题标题】:python : check if diagonalisable matrixpython:检查是否对角化矩阵
【发布时间】:2015-09-19 21:56:59
【问题描述】:

我想用 Python 对矩阵进行对角化,这是我的脚本:

import scipy.linalg as lg
vp = lg.eig(A)      # eigen values and vectors 
D = N.diag(vp[0])  # diagonalisation of A from its eigen values
P=vp[1]          # such as A = P.D.P(-1)   
Pm1=lg.inv(P)   

但是我怀疑 A 不可对角化,但这并不妨碍 Python 计算 D、P 和 P(-1) 没有任何麻烦...更重要的是,D 中的系数是复数,当那些在 A 中是真实的吗? 有没有办法检查这个数组是否可对角化?

非常感谢提前

【问题讨论】:

    标签: python matrix scipy diagonal


    【解决方案1】:

    对角化矩阵在 C^nxn 中是密集的。这对浮点计算意味着什么是舍入误差使矩阵对角化 --- eig(A) 的结果是 eig(Ap) 其中|A - Ap| <= floating point error 和 Ap 是对角化的。计算特征值的标准数值算法会给出这样的结果。

    实矩阵的特征值可以是复数,例如为[1 -2; 1 1]

    如果您使用精确算术,则可以对不可对角矩阵进行完全可靠的检测;在浮点数中,您也许可以将与不可对角化矩阵“接近”的可对角化矩阵视为不可对角化矩阵(参见例如https://dl.acm.org/citation.cfm?id=355912)。

    编辑:可以通过计算特征向量矩阵w, V = np.linalg.eig(A); c = np.linalg.cond(V) 的条件数来获得浮点非对角性接近度的一种度量。如果c 很大,在1/eps ~ 10**16 附近,则矩阵在数值上接近不可对角化。

    【讨论】:

      【解决方案2】:

      您可以使用SymPy。它有一个函数is_diagonalizable

      它检查矩阵是否可对角化。

      【讨论】:

      • 这对于整数和有理矩阵条目来说是可以的,但请注意,在浮点中它具有通常的浮点问题(并且 sympy 中使用的算法对于这种情况不是最优的,比 np. linalg.eig)。考虑sympy.Matrix([[1, 1], [1e-100, 1]]).is_diagonalizable() == False
      • from sympy import Matrix as Mx if Mx(A).is_diagonalizable()== False: print "A not diago"
      • 对不起,我还没写完就发了。我添加了上面的代码以尝试得到错误:“文件”/usr/lib/pymodules/python2.6/sympy/matrices/matrices.py”,第 1477 行,在 getattr 中引发 AttributeError ()”从“如果”行...
      【解决方案3】:

      如果A 不可对角化,则P 中的向量将是线性相关的。但是,由于数值错误,它们可能非常接近线性相关。

      例如,考虑

      P = array([[1, 0],[1, 0.001]])
      

      Pm1 = inv(P)
      

      那么P * Pm1 - eye(2) 将远非零

      [[    0.     0.]
       [-1000.     0.]]
      

      在计算逆时,请始终查看矩阵的条件数。例如cond(P) = 2000.5,这是一个非常大的数字。

      另外,对于某些矩阵,由于数值错误,eig() 的输出可能与真实的特征值列表相差甚远。

      至于复特征值,回想一下,实矩阵可能具有复特征值,尽管它们是复共轭对。由于实数域不是代数闭域,因此您不能期望特征值始终为实数,除非矩阵 A 是对称的。

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多