python - 在 SymPy 中象征性地乘以无限和
问题描述
我正在编写使用 SymPy 以符号方式编写代码的软件,并且我遇到了需要简化的乘法总和。我使用的算法要求使用柯西积将两个相乘的总和转换为双倍总和。下面是我想要完成的一个例子:
from sympy import Sum, Function, Symbol, oo
# Define variables
n = Symbol('n')
x = Symbol('x')
t = Symbol('t')
# Define functions
theta = Function('theta')(t)
p = Function('p')(n,x)
q = Function('q')(n,x)
# Create Summations
pSum = Sum(p*theta**n, (n,0,oo))
qSum = Sum(q*theta**n, (n,0,oo))
# Multiply
out = pSum * qSum
print(out)
>>> Sum(p(n, x)*theta(t)**n, (n, 0, oo))*Sum(q(n, x)*theta(t)**n, (n, 0, oo))
我需要将其转换为
print(out)
>>> Sum(Sum((p(i, x)*q(n-i, x))*theta**n, (i, 0, n)), (n, 0, oo))
我的方法是导入Sum
和定义一个继承自Sum
. 然后我定义__mul__
操作员做我想做的事。这适用于简单的情况,但在更复杂的情况下,它将不起作用。在此示例中,第一种情况有效,但下一种情况不会相乘,因为 *__mul__
已经在 SymPy 中时没有调用。
import sympy
from sympy import expand, Function, Symbol, oo, diff, Sum, Derivative
class Sum2(Sum):
# Overriding the __mul__ method.
def __mul__(self, other):
if isinstance(other, Sum2):
i = Symbol('i')
n = Symbol('n')
return Sum2(Sum(self.args[0].subs(n, i)*other.args[0].subs(n, n-i), (i,0,n)), (n,0,oo))
else:
super().__mul__(other)
x = Symbol('x')
t = Symbol('t')
n = Symbol('n')
f = Function('f')(n, x)
a = Sum2(f*t**n, (n,0,oo))
# Works
print(a*a)
# Doesn't work.
c = (Derivative(a,x)*a).doit()
print(c)
print(c.doit())
print(expand(c))
我尝试过类似的方法,Function
而是继承自。同样的问题。也许__mul__
不是重新定义的正确功能?我怎样才能允许以这种方式相乘无限和?
解决方案
推荐阅读
- android - 如何检查是否仍连接到 setProcessDefaultNetwork() 设置的网络
- python - 计算熊猫中列的四分位数类别
- python - 为什么军事勋章表情符号在打印时与文本重叠?
- c# - 在编译的 C# 可执行文件中嵌入 DDL
- c# - 反代理调试 WPF
- flutter - Flutter 构建的 App 包无法正常工作
- artifact - 在软件开发过程中提到“工件”这个词是什么意思?它是源代码或文档,还是两者兼而有之?
- python - 如何使用 Trio 进行快速 Web api 调用?
- python - 将 div 的内容保存在 charfield 模型 Django 中
- scala - 类型构造函数参数推断