你对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))
(通过sympy import *比输入所有这些sp更容易.)
即使进行了上述修改,我也不太清楚为什么SymPy的特征方法报告失败.正如你可以看到in the source,它没有比上面代码做的更多:在特征多项式上调用根.差异似乎与创建此多项式的方式有关:M.charpoly(lam)返回
PurePoly(lambda**3 + (I*sin(kx)/2 - 5*cos(kx)/6 - 1)*lambda**2 + (-I*sin(kx)/2 + 11*cos(kx)/18 - 2/3)*lambda + 1/6 + 2*exp(-I*kx)/3, lambda, domain='EX')
与神秘(对我而言)domain =’EX’.随后,root的应用程序返回{},找不到根.看起来像实施的缺陷.