你对M的定义使得SymPy的生活太难了,因为它引入了浮点数.当您需要符号解决方案时,应避免浮动.这意味着:
>而不是1./3. (Python的浮点数)使用sp.Rational(1,3)(SymPy的有理数)或sp.S(1)/ 3,它具有相同的效果但更容易键入.
>而不是1j(Python的虚构单位)使用sp.I(SymPy的虚构单位)
>而不是x = 1.,写x = 1(Python 2.7习惯和SymPy一起很糟糕).
通过这些更改,或者求解或求解找到特征值,尽管求解得更快.此外,您可以创建一个Poly对象并将根应用于它,这可能是最有效的:
M = sp.Matrix([
[
1,
sp.Rational(2, 3),
sp.Rational(2, 3),
],
[
sp.exp(sp.I*kx) * sp.Rational(1, 6) + x,
sp.exp(sp.I*kx) * sp.Rational(1, 6),
sp.exp(sp.I*kx) * sp.Rational(-1, 3),
],
[
sp.exp(-sp.I*kx) * sp.Rational(1, 6),
sp.exp(-sp.I*kx) * sp.Rational(-1, 3),
sp.exp(-sp.I*kx) * sp.Rational(2, 3),
]
])
lam = sp.symbols('lambda')
cp = sp.det(M - lam * sp.eye(3))
eigs = sp.roots(sp.Poly(cp, lam))
(通过sy