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

如何用SymPy仅对括号内表达式因式分解并简化指定表达式

SymPy实现指定内层因式分解的表达式简化

问题需求

需要将以下表达式:

-8*F_p + 8*Omega*u + 6*alpha*u*(u**2 + v**2) - 5*beta*u*(u**4 + 2*u**2*v**2 + v**4) - 8*gamma*omega*v

基于r² = u² + v²的替换规则,简化为:

-8*F_p + 8*Omega*u + 6*alpha*u*r**2 - 5*beta*u*r**4 - 8*gamma*omega*v

直接执行替换或全局简化无法达成目标,但单独对u⁴ + 2u²v² + v⁴因式分解后替换可得到r⁴,因此需要让SymPy仅对表达式的最内层多项式子表达式进行因式分解,再完成替换。

解决方案

通过递归遍历表达式的子节点,针对性地对内层多项式执行因式分解,再应用替换规则即可实现目标简化。具体实现如下:

完整代码示例

from sympy import symbols, simplify, factor, collect, Expr

u, v, r = symbols('u v r')
# 定义参数
alpha = symbols('alpha', positive=True)
beta = symbols('beta', positive=True)
F_p = symbols('F_p', positive=True)
gamma = symbols('gamma', positive=True)
omega = symbols('omega', positive=True)
Omega = symbols('Omega', positive=True)

# 原始表达式
f = -8*F_p + 8*Omega*u + 6*alpha*u**3 + 6*alpha*u*v**2 - 5*beta*u**5 - 10*beta*u**3*v**2 - 5*beta*u*v**4 - 8*gamma*omega*v

# 递归处理子表达式,对多项式子项执行因式分解
def factor_inner(expr):
    if isinstance(expr, Expr):
        # 递归处理每个子节点
        new_args = [factor_inner(arg) for arg in expr.args]
        expr = expr.func(*new_args)
        # 仅对多项式类型的子表达式执行因式分解
        if expr.is_polynomial():
            return factor(expr)
    return expr

# 先收集同类项,再处理内层因式分解
f_collected = collect(f, [alpha, beta])
f_factored_inner = factor_inner(f_collected)

# 执行替换
subs_dict = {u**2 + v**2: r**2}
simplified_expr = f_factored_inner.subs(subs_dict)

# 输出结果
print("原始表达式:")
print(f)
print("\n收集同类项后:")
print(f_collected)
print("\n内层因式分解后:")
print(f_factored_inner)
print("\n最终简化结果:")
print(simplified_expr)

代码说明

  • factor_inner函数:递归遍历表达式的所有子节点,仅对多项式类型的子表达式执行因式分解,确保只处理最内层的多项式项
  • 先执行collect操作合并同类项,让内层多项式结构更清晰,便于后续因式分解
  • 完成内层因式分解后,再代入r² = u² + v²的替换规则,即可得到目标简化形式

内容的提问来源于stack exchange,提问作者minmax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:07:12