特征向量在 Sympy 中不起作用

Eigenvector does not work in Sympy

我想在 Sympy 中找到矩阵的特征向量并编写了以下程序,但它不起作用。另一方面,Sympy 中的 A.eigenvects() 函数计算矩阵 A 的特征值和特征向量,我在这里使用了类似的东西,但是当我想打印结果时,会显示一个空列表。你能指导我吗?

from sympy import *

H=Matrix([  [215.0   ,-104.1   ,5.1    ,-4.3    ,4.7    ,-15.1   ,-7.8],
        [-104.1  , 220.0   ,32.6   , 7.1    ,5.4    , 8.3    ,0.8],
        [ 5.1    , 32.6    ,  0.   , -46.8  , 1.0   , -8.1   , 5.1 ],
        [ -4.3   , 7.1     ,-46.8  ,125.0   ,-70.7  ,-14.7   ,-61.5],
        [ 4.7    , 5.4     , 1.0   ,-70.7   ,450.0  ,89.7    ,-2.5],
        [-15.1   , 8.3     ,-8.1   ,-14.7   ,89.7   ,330.0   ,32.7],
        [-7.8    ,0.8      ,5.1    ,-61.5   ,-2.5   ,32.7    ,280.0]])


zz=H.eigenvects()
pprint(zz)

这对我来说可能是个错误,出于某种原因它不喜欢您的矩阵。尝试使用 eigenvals() 也只是 returns 什么都没有,但是使用 Berkowitz 的算法会产生预期的结果(这些是正确的):

>>> H.berkowitz_eigenvals()
{−23.7383543150805:1,101.965215714556:1,120.955771704237:1,
   268.369453977695:1,307.126362241411:1,332.004505895816:1,513.317044781366:1}

或者,查找字符多项式根给出相同的结果:

>>> roots(H.charpoly(x),x)
{−23.7383543150805:1,101.965215714556:1,120.955771704237:1,
   268.369453977695:1,307.126362241411:1,332.004505895816:1,513.317044781366:1}

至于解决方法,目前我没有任何想法,除了使用另一个库,也许 NumPy/SciPy:

>>> from numpy import linalg as LA
>>> w,v = LA.eig(np.array([  [215.0   ,-104.1   ,5.1    ,-4.3    ,4.7    ,-15.1   ,-7.8],
        [-104.1  , 220.0   ,32.6   , 7.1    ,5.4    , 8.3    ,0.8],
        [ 5.1    , 32.6    ,  0.   , -46.8  , 1.0   , -8.1   , 5.1 ],
        [ -4.3   , 7.1     ,-46.8  ,125.0   ,-70.7  ,-14.7   ,-61.5],
        [ 4.7    , 5.4     , 1.0   ,-70.7   ,450.0  ,89.7    ,-2.5],
        [-15.1   , 8.3     ,-8.1   ,-14.7   ,89.7   ,330.0   ,32.7],
        [-7.8    ,0.8      ,5.1    ,-61.5   ,-2.5   ,32.7    ,280.0]])
>>> w;v
array([[ 0.0211232 , -0.0863685 ,  0.31060486,  0.64800412,  0.58825511,
         0.34578278, -0.1004976 ],
       [-0.03360278, -0.17141713,  0.28577077,  0.60531169, -0.57444552,
        -0.41080118,  0.15058085],
       [-0.01492258,  0.91780802, -0.23783515,  0.29790711, -0.04561479,
        -0.00789624,  0.09974215],
       [ 0.19183148,  0.33999268,  0.79845203, -0.30609739,  0.01552874,
        -0.18077   , -0.2889039 ],
       [-0.86037599,  0.04835763,  0.171535  , -0.10783263,  0.27161704,
        -0.27390267,  0.25993089],
       [-0.45801107,  0.01859027, -0.05846719,  0.07732967, -0.35064091,
         0.32022588, -0.74497537],
       [-0.1066849 ,  0.05006013,  0.30810033, -0.11677503, -0.35344244,
         0.70807431,  0.50125772]])
    >>> H
    Matrix([
    [ 215.0, -104.1,   5.1,  -4.3,   4.7, -15.1,  -7.8],
    [-104.1,  220.0,  32.6,   7.1,   5.4,   8.3,   0.8],
    [   5.1,   32.6,     0, -46.8,   1.0,  -8.1,   5.1],
    [  -4.3,    7.1, -46.8, 125.0, -70.7, -14.7, -61.5],
    [   4.7,    5.4,   1.0, -70.7, 450.0,  89.7,  -2.5],
    [ -15.1,    8.3,  -8.1, -14.7,  89.7, 330.0,  32.7],
    [  -7.8,    0.8,   5.1, -61.5,  -2.5,  32.7, 280.0]])
    >>> x = H.charpoly(symbols('lamda'))
    >>> factor(x)
    1.0*(1.0*lamda**7 - 1620.0*lamda**6 + 1029369.57*lamda**5 - 
324725076.332*lamda**4 + 52250209639.9248*lamda**3 - 
3762668861934.64*lamda**2 + 49798018861415.7*lamda + 
4.112530087788e+15)

最后一个方程有 7 个实根 => (lamda +23.738) *(lamda -101.965) *(lamda -120.956) *(lamda -268.369) *(lamda -307.126) *(lamda -332.005) *(lamda -513.317) = 0

[-23.738, 101.965, 120.956, 268.369, 307.126, 332.005, 513.317]

这真的很奇怪,为什么 sympy 一直说这个矩阵没有特征向量。

问题源于浮点数和有理数的使用。 eigenvects 将浮点数重铸为有理数。 eigenvals 例程在根无法因式分解多项式时失败。当你直接调用 eigenvals 时,Floats 也会被重铸,但你可以 select 而不是 来重铸它们;当你这样做时,roots 能够 return 值并且特征值是 returned。

>>> H.eigenvals()
{}
>>> H.eigenvals(rational=False)
{513.317044781366: 1, 101.965215714556: 1, 332.004505895816: 1, 268.369453977695: 1, 120.955771704237: 1, -23.7383543150805: 1, 307.126362241411: 1}

似乎 roots 应该 returning 这个 7 阶多项式的 RootOf 实例而不是 return 没有根。最好将此报告为 SymPy 的问题:

roots(p) -> {} instead of RootOf instances when p = 5000000*x**7 - 8100000000*x**6 + 5146847850000*x**5 - 1623625381660000*x**4 + 261251048199624000*x**3 - 18813344309673222800*x**2 + 248990094307079384205*x + 20562650438939697400552