如何用SymPy将含UnevaluatedExpr的exp(A)*exp(B)化简为exp(A+B)?
解决SymPy中powsimp无法合并含UnevaluatedExpr的指数乘积问题
SymPy的powsimp函数默认不会合并包含UnevaluatedExpr的指数乘积(如exp(a)*exp(b),其中a或b为UnevaluatedExpr),这是因为UnevaluatedExpr的设计初衷就是阻止自动运算。要实现目标化简,可自定义处理函数,手动识别并合并同底数的指数项:
自定义化简实现代码
import sympy from sympy import exp, Symbol, UnevaluatedExpr, Mul, Pow def powsimp_with_unevaluated(expr): # 仅处理乘法类型的表达式 if isinstance(expr, Mul): target_base = sympy.E exponents = [] remaining_terms = [] # 遍历乘法的每一项,分类收集指数项和其他项 for term in expr.args: if isinstance(term, Pow) and term.base == target_base: exponents.append(term.exp) elif isinstance(term, sympy.exp): exponents.append(term.args[0]) else: remaining_terms.append(term) # 若存在多个可合并的指数项,执行合并操作 if len(exponents) > 1: merged_exponential = exp(sum(exponents)) return Mul(*remaining_terms, merged_exponential) if remaining_terms else merged_exponential # 非乘法表达式或无可合并项时,返回原表达式 return expr # 测试示例 expr1 = sympy.sympify("exp(T)") expr2 = UnevaluatedExpr(sympy.sympify("T")) old_expr = expr1 * sympy.Pow(sympy.E, expr2) simplified_expr = powsimp_with_unevaluated(old_expr) print("old expr:", sympy.srepr(old_expr)) print("simplified expr:", sympy.srepr(simplified_expr))
输出结果
old expr: Mul(exp(Symbol('T')), exp(UnevaluatedExpr(Symbol('T')))) simplified expr: exp(Add(Symbol('T'), UnevaluatedExpr(Symbol('T'))))
逻辑说明
- 函数遍历乘法表达式的所有项,筛选出以
sympy.E为底的指数项(包括exp()直接调用和Pow(E, ...)形式)。 - 收集所有指数部分后,通过
sum()将普通表达式与UnevaluatedExpr相加(结果保留UnevaluatedExpr的包装),再重新构建为单个指数表达式。 - 最后将合并后的指数项与其他非指数项相乘,得到目标化简结果。
内容的提问来源于stack exchange,提问作者BenWibking
相关产品推荐
相关产品推荐

