如何强制sympy处理复数的简化?
我对sympy还很陌生,想做一个矩阵的乘法运算。这些矩阵是复数的。
这是我的代码:
import sympy as sp
eps = sp.exp(2 * sp.pi * sp.I / 6)
eps_star = sp.conjugate(eps)
M = 1 / sp.sqrt(6) * sp.Matrix([
[1, 1, 1, 1, 1, 1],
[1, eps_star, -eps, -1, -eps_star, eps],
[1, -eps, -eps_star, 1, -eps, -eps_star],
[1, eps, -eps_star, -1, -eps, eps_star],
[1, -eps_star, -eps, 1, -eps_star, -eps],
[1, -1, 1, -1, 1, -1]
]).transpose()
Minv = sp.conjugate(M).transpose()
如果你计算一下 M * Minv
的结果,应该会得到一个单位矩阵,也就是对角线上的元素是1,而其他位置的元素应该是0。
但是你会发现,像这样:
1/3 -1/3 eps - 1/3 eps_star
实际上这个值是0,因为它可以简化为 1/3 - 1/3 [2 cos (pi / 3)] = 1/3 - 1/3 = 0
。我尝试使用 simplify
或 nsimplify
方法,但结果并没有给我0。可能是因为浮点数误差的问题。
有没有办法在使用sympy时处理这个问题,而不需要知道哪个项是0呢?
在我的情况下,这个矩阵实际上是用来在一个基底和另一个基底之间转换的,其中一个算子是对角的。最后,我想计算的乘积是 Minv * H * M
。由于当前的问题,无法看出结果是对角矩阵。
这是H矩阵:
alpha, beta = sp.symbols("alpha beta")
H = sp.Matrix([
[alpha, beta, 0, 0, 0, beta],
[beta, alpha, beta, 0, 0, 0],
[0, beta, alpha, beta, 0, 0],
[0, 0, beta, alpha, beta, 0],
[0, 0, 0, beta, alpha, beta],
[beta, 0, 0, 0, beta, alpha],
])
1 个回答
0
你可以把 exp
用三角函数来重新表达,这样结果就会自动简化了:
(M*Minv).rewrite(sp.cos)