假设我有一个像
这样的SymPy表达式expr = sqrt(2)*x*y/sin(2)/L
我如何才能提取
sqrt(2)/sin(2)
如果我事先不知道表达式中有哪些免费符号?换句话说,我希望SymPy返回不包含自由符号的单项式部分。
答案 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_symbols
和term.is_constant()
之间存在差异。前者仅检查自由符号的存在,这是快速的;后者更进一步,尝试数值评估,简化和符号区分,试图证明或证明表达式是常数(reference)。例如,sin(x)**2 + cos(x)**2
虽然有自由符号,但会被识别为常量。