你对M的定义让symphy的日子过得太难过了,因为它引入了浮点数。当需要符号解时,应避免浮点运算。这意味着:
-
而不是
1./3.
sp.Rational(1, 3)
(辛有理数)或
sp.S(1)/3
它具有相同的效果,但更容易键入。
-
而不是
1j
(Python的虚单位)使用
sp.I
(辛的虚单位)
-
x = 1.
写
x = 1
(Python 2.7 habits和SymPy一起表现不佳)。
随着这些变化
solveset
或
solve
让他们更快。此外,还可以创建多边形对象并应用
roots
这可能是最有效的:
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))
from 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'
. 随后
根
{}
,未找到根。看起来是实施的不足。