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

如何用SymPy的replace方法将嵌套求和转为二重求和?

解决SymPy嵌套求和转二重求和的方案

问题分析

你的原表达式是两个嵌套求和的线性组合,核心需求是将嵌套的Sum展开为二重求和,同时合并同类项。之前的replace失败是因为模式匹配的结构错误——你写的模式是Sum(...) * ws2,但实际目标项是Sum(ws1 * Sum(...) * ws2, ...)(即ws2在求和内部而非外部相乘)。

分步实现代码

1. 导入依赖并定义原表达式

from sympy import symbols, IndexedBase, Sum, Wild

# 定义符号与索引基
i, j, N = symbols("i j N", integers=True, finite=True, nonnegative=True)
a, b, c, d, e = symbols("a b c d e", cls=IndexedBase)

# 原嵌套求和表达式
expr = (Sum(a[i] * Sum(b[i] * d[j], (j, 1, N)) * c[i], (i, 1, N)) 
        + Sum(a[i] * Sum(b[i] * e[j], (j, 1, N)) * c[i], (i, 1, N)))

2. 合并同类求和项

先将两个外层求和合并(因为它们的求和变量、范围一致),再合并内层的求和项:

# 合并外层求和,提取公因子a[i]*c[i]
expr_combined = Sum(a[i]*c[i]*(Sum(b[i]*d[j], (j,1,N)) + Sum(b[i]*e[j], (j,1,N))), (i,1,N))

# 合并内层求和,将d[j]和e[j]合并到同一个Sum中
ws3, ws4, wd1, wl1 = symbols("ws3 ws4 wd1 wl1", cls=Wild)
expr_inner_combined = expr_combined.replace(
    Sum(ws3, (wd1, 1, wl1)) + Sum(ws4, (wd1, 1, wl1)),
    Sum(ws3 + ws4, (wd1, 1, wl1))
)
# 此时expr_inner_combined为:Sum(a[i]*c[i]*Sum(b[i]*(d[j]+e[j]), (j,1,N)), (i,1,N))

3. 嵌套求和转二重求和

使用正确的模式匹配,将嵌套Sum转换为二重求和:

# 定义通配符
ws1, ws2, ws3, wd1, wd2, wl1 = symbols("ws1 ws2 ws3 wd1 wd2 wl1", cls=Wild)

# 匹配模式:Sum( 因子1 * Sum(内层项, 哑变量1) * 因子2, 哑变量2 )
pattern = Sum(ws1 * Sum(ws3, (wd1, 1, wl1)) * ws2, (wd2, 1, wl1))
# 替换为二重求和:Sum(因子1*因子2*内层项, 哑变量2, 哑变量1)
replacement = Sum(ws1 * ws2 * ws3, (wd2, 1, wl1), (wd1, 1, wl1))

# 执行替换
expr_double_sum = expr_inner_combined.replace(pattern, replacement)

最终得到的expr_double_sum就是目标的二重求和形式:
Sum(a[i]*b[i]*c[i]*(d[j]+e[j]), (i, 1, N), (j, 1, N))

关键注意点

  • 模式匹配时必须严格对应表达式的结构:确保通配符覆盖的位置与原表达式一致(比如之前错误地将ws2放在Sum外部,实际它在求和内部)。
  • 合并同类项可以简化后续的模式匹配,减少匹配复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:44:54