You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:32:38