SymPy 默认对复指数表达式(如 exp(I*π/3))不做三角展开,导致矩阵乘法后本应为零的非对角元无法自动归零;通过 .rewrite(cos) 强制转为三角形式,可触发精确代数化简。
sympy 默认对复指数表达式(如 `exp(i*π/3)`)不做三角展开,导致矩阵乘法后本应为零的非对角元无法自动归零;通过 `.rewrite(cos)` 强制转为三角形式,可触发精确代数化简。
在使用 SymPy 进行含单位根(如六次单位根 ε = e^(2πi/6))的复数矩阵运算时,一个常见痛点是:理论上的正交性或幺正性(例如 M·M† = I)在符号计算中无法自动验证——非对角线元素看似非零(如 1/3 - 1/3*eps - 1/3*conjugate(eps)),实则恒等于零,但 simplify() 或 nsimplify() 常常失效。
根本原因在于:SymPy 将 exp(I * θ) 视为原子函数,不主动展开为 cos(θ) + I*sin(θ),因而无法识别 eps + conjugate(eps) = 2*cos(π/3) = 1 等关键恒等关系。
✅ 可靠解法:使用 .rewrite(cos)
该方法将所有 exp(I*θ) 自动重写为三角函数组合,使后续化简能基于实部/虚部的代数恒等式完成:
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()
product = M * Minv
# 关键步骤:重写为三角函数形式再化简
I_check = sp.simplify(product.rewrite(sp.cos))
print(I_check)运行后将输出标准单位矩阵 eye(6),所有非对角元严格为 0。
⚠️ 注意事项
- .rewrite(cos) 是符号重写,不引入浮点误差,保持完全精确性;
- 若矩阵规模大或含多个不同角度,可配合 trigsimp() 进一步优化(但通常 .rewrite(cos) + simplify() 已足够);
- 对最终目标 Minv * H * M(对角化变换),务必在每一步乘法后或最终结果上调用 .rewrite(cos).simplify(),否则对角性可能被“隐藏”在未化简的复指数表达式中;
- 避免使用 evalf() 或 nsimplify(tolerance=...),它们面向数值近似,会破坏符号正交性的严格验证。
总结:当 SymPy 在复数矩阵运算中“卡住”于未化简的指数形式时,.rewrite(cos) 是一把精准、无副作用的钥匙——它不依赖先验知识,不引入误差,仅通过标准数学等价变换激活内置代数引擎,让隐藏的零真正显现。

















