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

如何用SymPy对符号方程进行多因子分层合并/因式分解?

用SymPy实现符号方程的多因子分层合并/因式分解

能否使用SymPy对符号方程进行多因子表达式的合并/因式分解(且支持分层处理)?

以下为示例:将展开后的长方程f进行处理,实际计算中方程会更复杂。

import sympy
a,b,m,n = sympy.symbols('a b m n')
f = -a**2*b*m**2 - a**2*b*m*n - a**2*b*m + a**2*m**2*n + a**2*m**2 + 2*a**2*m + a**2*n**2 - a*b*m - a*b*n + 5*a*m + a*n**2 + a*n + b*m**2 - 2*b*m*n - b*m - b*n**2 - m**2 + 2*m*n + n**2 + 1
g=sympy.collect(f,(a**2,1-b))

期望通过函数(如collect)先围绕a**2分层聚合项,再围绕(1-b)处理,将f转化为如下方程g:

g = a**2 * ( (1-b) * (m+n*m+m**2)+m+n**2-m*n+m**2*n)+a*((1-b)*(m+n)+n**2+4*m)+(1-b) * (m+n**2-m**2+2*m*n) +1 - m

即先以a**2为核心,再以(1-b)为核心对方程进行因式分解/分组。

可通过以下代码验证f与g等价:

h = sympy.simplify(f-g)
print(h)

编辑补充:来自smichr的简洁高效解法详解

import sympy
a,b,m,n, y = sympy.symbols('a b m n y')
f1 = -a**2*b*m**2 - a**2*b*m*n - a**2*b*m + a**2*m**2*n + a**2*m**2 + 2*a**2*m + a**2*n**2 - a*b*m - a*b*n + 5*a*m + a*n**2 + a*n + b*m**2 - 2*b*m*n - b*m - b*n**2 - m**2 + 2*m*n + n**2 + 1
g1=sympy.collect(f1,(a**2,1-b))

f1_1 = f1.subs(b,1-y)   # 将b替换为1-y,此技巧便于SymPy按y=1-b进行因式分解
f1_2 = f1_1.expand()    # 展开含y的乘积项,便于后续合并
f1_3 = sympy.collect(f1_2, a)       # 按a合并展开后的方程,得到a²及a的因子
f1_4 = sympy.collect(f1_3,y)        # 对已按a合并的方程按y合并,实现分层处理
f1_5 = f1_4.subs(y,1-b)             # 将y替换回1-b
# 若需按精确因子合并而非其幂次,可在sympy.collect中指定exact=true
print(f1_5)

运行结果如下:

a**2 * [m**2*n - m*n + m + n**2 + (1 - b) * (m**2 + m*n + m)] +
a * [4*m + n**2 + (1 - b)*(m + n)] +
(1 - b)*(-m**2 + 2*m*n + m + n**2) + 1 - m

该结果先按a(含a²和a)分层因式分解,再按(1-b)处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:44:54