在SymPy中象征性地乘以无限和

时间:2019-03-14 23:35:42

标签: python sympy

我正在编写使用SymPy来象征性地编写代码的软件,我遇到了需要简化的乘法和。我使用的算法要求使用Cauchy product将彼此相乘的两个和转换为双和。以下是我要完成的工作的一个示例:

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__运算符以执行所需的操作。这适用于简单的情况,但在较复杂的情况下将不起作用。在此示例中,第一种情况有效,但第二种情况不会相乘,因为*在SymPy中时,*并未调用__mul__

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__不是正确的函数来重新定义?如何允许以这种方式将无穷和相乘?

0 个答案:

没有答案