'matrix' 对象没有属性 'eigenvals'

'matrix' object has no attribute 'eigenvals'

我有以下代码

import numpy as np
import sympy as sp

def bra(i,d):
    arr = np.zeros((1,d))
    if i <= (d-1):
        arr[:,i] = 1
    else:
        print("Index Out of bounds")
    return arr

def density(i,j,d):
    return bra(i,d).T*bra(j,d)

SIGMA = (1/3)*(np.kron(np.kron(bra(0,3),bra(1,3)).T,np.kron(bra(0,3),bra(1,3)))+np.kron(np.kron(bra(1,3),bra(2,3)).T,np.kron(bra(1,3),bra(2,3)))+np.kron(np.kron(bra(2,3),bra(0,3)).T,np.kron(bra(2,3),bra(0,3))))

DELTA = (1/3)*(np.kron(np.kron(bra(1,3),bra(0,3)).T,np.kron(bra(1,3),bra(0,3)))+np.kron(np.kron(bra(2,3),bra(1,3)).T,np.kron(bra(2,3),bra(1,3)))+np.kron(np.kron(bra(0,3),bra(2,3)).T,np.kron(bra(0,3),bra(2,3))))

本质上,bra(i,d) 给出一个 (1,d) 数组,其中第 (1,i) 个元素为 1,其余为零。例如,

 bra(0,3)=[[1,0,0]]
bra(1,3)=[[0,1,0]] 
bra(0,3)=[[0,0,1]]

density(i,j,d) returns (d,d) 矩阵第(i,j)个元素作为一个余数为零,例如

 density(0,1,3) = array([[0., 1., 0.], [0., 0., 0.],[0., 0., 0.]]).

使用上面的代码,我使用 np.kron

生成了一个 (9,9) 矩阵对象
a = sp.symbols('a', positive = True)

HORO = (2/21)*(np.kron(density(0,0,3),density(0,0,3))+np.kron(density(1,0,3),density(0,1,3))+np.kron(density(0,0,3),density(2,2,3))
+np.kron(density(0,1,3),density(1,0,3))+np.kron(density(1,1,3),density(1,1,3))+np.kron(density(2,1,3),density(1,2,3))
+np.kron(density(0,2,3),density(2,0,3))+np.kron(density(1,2,3),density(2,1,3))+np.kron(density(2,2,3),density(2,2,3)))+(a/7)*SIGMA+((5-a)/7)*DELTA

M = np.asmatrix(HORO)

可以证明M矩阵是可逆的并且它 就是下面的(9,9)矩阵

matrix([[0.0952380952380952, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0.0476190476190476*a, 0, 0.0952380952380952, 0, 0, 0, 0, 0],
        [0, 0, 0.333333333333333 - 0.0476190476190476*a, 0, 0, 0,
         0.0952380952380952, 0, 0],
        [0, 0.0952380952380952, 0,
         0.238095238095238 - 0.0476190476190476*a, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0.0952380952380952, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0.0476190476190476*a, 0, 0.0952380952380952, 0],
        [0, 0, 0, 0, 0, 0, 0.0476190476190476*a, 0, 0],
        [0, 0, 0, 0, 0, 0.0952380952380952, 0,
         0.238095238095238 - 0.0476190476190476*a, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0.0952380952380952]], dtype=object)

对于这个符号矩阵,我想将特征值计算为

M.eigenvals()

但是,它返回以下错误

AttributeError: 'matrix' object has no attribute 'eigenvals'

我不知道哪里出了问题。

通常,numpy 和 sympy 不能很好地混合。 Numpy 无法使用 sympy 函数和符号。此外,sympy 尝试计算精确的符号解,这与浮点数不能很好地结合使用(sympy 强烈喜欢整数、有理数和符号表达式,例如 sp.sqrt())。

在这种情况下,只要您不做太多更改,numpy 就能很好地计算矩阵元素(求和和产生式是通过基础标准 Python 执行的)。

现在,如果你只是在 sympy 中使用那个矩阵,你会得到:

M = sp.Matrix(HORO)
print(M.eigenvals())

你得到:

 {0.0952380952380952: 3,
  0.119047619047619 - 0.152455338986496 * sqrt(0.0975609756097561 * a ** 2 - 0.48780487804878 * a + 1.0): 2,
  0.152455338986496 * sqrt(0.0975609756097561 * a ** 2 - 0.48780487804878 * a + 1.0) + 0.119047619047619: 2,
  0.0476190476190476 * a: 1,
  0.333333333333333 - 0.0476190476190476 * a: 1}

更好的方法是使用 nsimplify 将浮点数转换为有理数:

M = sp.Matrix(sp.nsimplify(HORO))
print(M.eigenvals())

这给出了一个更好的符号解决方案:

{2 / 21: 3,
 5 / 42 - sqrt(4 * a ** 2 - 20 * a + 41) / 42: 2, 
 sqrt(4 * a ** 2 - 20 * a + 41) / 42 + 5 / 42: 2,
 a / 21: 1,
 1 / 3 - a / 21: 1}