首页 > 解决方案 > 在 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__不是重新定义的正确功能?我怎样才能允许以这种方式相乘无限和?

标签: pythonsympy

解决方案


推荐阅读