如何强制sympy处理复数的简化?

0 投票
1 回答
27 浏览
提问于 2025-04-12 19:46

我对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。我尝试使用 simplifynsimplify 方法,但结果并没有给我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)

撰写回答