提取SymPy表达式的常量部分

时间:2018-05-13 22:54:30

标签: python sympy symbolic-math

假设我有一个像

这样的SymPy表达式
expr = sqrt(2)*x*y/sin(2)/L

我如何才能提取

sqrt(2)/sin(2)

如果我事先不知道表达式中有哪些免费符号?换句话说,我希望SymPy返回不包含自由符号的单项式部分。

1 个答案:

答案 0 :(得分:1)

expr = sqrt(2)*x*y/sin(2)/L
const = expr.func(*[term for term in expr.args if not term.free_symbols])

使const等于sqrt(2)/sin(2)。虽然您询问了某个产品,但这种方法也适用于总和(expr.func将是Mul的产品和Add for sums)。

在评论中,barrymoo指出了is_constant方法。 not term.free_symbolsterm.is_constant()之间存在差异。前者仅检查自由符号的存在,这是快速的;后者更进一步,尝试数值评估,简化和符号区分,试图证明或证明表达式是常数(reference)。例如,sin(x)**2 + cos(x)**2虽然有自由符号,但会被识别为常量。