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

如何用SymPy直接化简分式(a+b*(c+d))/(c+d)?替换法可行原因?

SymPy分式化简问题解答

问题背景

原始分式:

a + b⋅(c + d)
─────────────
    c + d    

期望化简结果:

a      
───── + b
c + d    

现有实现代码:

import sympy as sp
a,b,c,d,e = sp.symbols('a b c d e')
expr = (a + b*(c+d)) / (c+d)
expr = expr.subs({(c+d):e}).simplify().subs({e:c+d})
print( sp.pretty(expr) )
# 输出
#   a      
# ───── + b
# c + d   

用户疑问:

  • 上述替换方法可行的原因是什么?
  • 是否存在无需替换的直接化简方式?

解答

一、替换方法可行的原因

  • 核心是整体代换简化结构:原表达式里c+d是复合项,SymPy默认的simplify()逻辑不会主动把分子拆成a + b*(c+d)后拆分分式。换成单变量e后,表达式变成(a + b*e)/e,结构更简单,simplify()能直接识别出可以拆分为a/e + b。
  • 代换是等价变换:只要c+d≠0(SymPy默认符号不为零,除非额外指定),替换前后表达式完全等价,所以最终结果准确。

二、无需替换的直接化简方式

有两种更直接的方法:

方法1:用expand()拆分分子

直接对表达式调用expand(),SymPy会自动拆分并约分:

import sympy as sp
a,b,c,d = sp.symbols('a b c d')
expr = (a + b*(c+d)) / (c+d)
expr = sp.expand(expr)
print(sp.pretty(expr))

输出和期望一致,原理是expand()把分子展开为a + b*c + b*d,SymPy会自动将能和分母约分的b*c + b*d分离出来,约分后得到b,最终拆分出a/(c+d) + b。

方法2:用apart()做分式分解

apart()是专门处理有理函数拆分的工具,直接调用就能得到目标结果:

import sympy as sp
a,b,c,d = sp.symbols('a b c d')
expr = (a + b*(c+d)) / (c+d)
expr = sp.apart(expr)
print(sp.pretty(expr))

apart()的功能就是把有理函数拆成最简分式的和,对于这种简单的线性分式,能一步识别并拆分出目标形式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:47