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

如何在SymPy中拆分Sum求和表达式?复杂场景处理方法

解决SymPy复杂表达式下Sum与加法的拆分等价性问题

在简单表达式中,SymPy可以直接识别Sum(a + b, ...)与Sum(a, ...) + Sum(b, ...)的等价性,但在包含嵌套Sum(如加权平均mx、my)的复杂场景中,直接用equals()会失败——这是因为SymPy默认不会自动展开所有嵌套的符号结构,导致两者的内部表达式形式不匹配。

解决方案

通过化简表达式让SymPy识别数学等价性,常用两种方法:

方法1:展开表达式后比较

对拆分前后的表达式分别调用expand(),展开所有嵌套运算结构后再用equals()判断:

from sympy import symbols, Idx, IndexedBase, Sum, expand

a, b = symbols("a b")
i, n = symbols("i n", cls=Idx)
w = IndexedBase("w", shape=(n,))
x = IndexedBase("x", shape=(n,))
y = IndexedBase("y", shape=(n,))
sum = lambda e: Sum(e, (i, 1, n))
sw = sum(w[i])
mx = sum(w[i] * x[i]) / sw
my = sum(w[i] * y[i]) / sw
d = w[i] * ((a * (x[i] - mx) - (y[i] - my)))**2
e = w[i] * (a * mx + b - my)**2
f = w[i] * 2 * (a * (x[i] - mx) - (y[i] - my)) * (a * mx + b - my)
s = sum(d + e + f)
t = sum(d) + sum(e) + sum(f)

# 先展开再验证等价性
assert expand(s).equals(expand(t))  # 断言成功

方法2:验证差值是否为0

计算s - t并化简,若结果为0则说明两者数学等价:

from sympy import symbols, Idx, IndexedBase, Sum, simplify

a, b = symbols("a b")
i, n = symbols("i n", cls=Idx)
w = IndexedBase("w", shape=(n,))
x = IndexedBase("x", shape=(n,))
y = IndexedBase("y", shape=(n,))
sum = lambda e: Sum(e, (i, 1, n))
sw = sum(w[i])
mx = sum(w[i] * x[i]) / sw
my = sum(w[i] * y[i]) / sw
d = w[i] * ((a * (x[i] - mx) - (y[i] - my)))**2
e = w[i] * (a * mx + b - my)**2
f = w[i] * 2 * (a * (x[i] - mx) - (y[i] - my)) * (a * mx + b - my)
s = sum(d + e + f)
t = sum(d) + sum(e) + sum(f)

# 化简差值,判断是否为0
assert simplify(s - t) == 0  # 断言成功

原理说明

复杂表达式中的mx、my是包含Sum的分式,导致d、e、f内部存在嵌套的符号结构。SymPy的equals()默认仅检查表达式的结构等价性,而非数学等价性。通过expand()或simplify()可以将表达式转换为统一的展开形式,让SymPy识别其数学上的等价关系。

内容的提问来源于stack exchange,提问作者Valéry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:51:02