使用先前的术语sympy生成序列

时间:2013-06-10 16:14:12

标签: python factorial sympy symbolic-math symbolic-computation

我想生成一个序列,以便先前生成的元素包含在下一个元素中,我不确定如何执行此操作。

即生成列表,使其项目为:

其中x只是一个Sympy符号

[x,(x)*(x+1),(x)*(x+1)*(x+2)]

而不是[x,x+1,x+2]

我在想像

k.append(k*(K+o))

但我一直收到类型错误

任何帮助非常感谢!

4 个答案:

答案 0 :(得分:4)

您可以使用sympy.RaisingFactorial

import sympy.RaisingFactorial as RF
from sympy.abc import x
length=3
ans = [RF(x,i) for i in xrange(1,length+1)]

给出了:

[x, x*(x + 1), x*(x + 1)*(x + 2)]

答案 1 :(得分:1)

可能使用递归lambda函数和map

>>> fact = lambda x: x == 0 and 1 or x * fact(x - 1)
>>> map(fact, range(4))
[1, 1, 2, 6]

以及其他许多方式。如果您想返回string定义递归函数以返回string;

def fact(i):
    if i == 0:
        return 'x'
    else:
        return fact(i - 1) + '*(x+%d)' % i

然后

>>> map(fact, range(4))
['x', 'x*(x+1)', 'x*(x+1)*(x+2)', 'x*(x+1)*(x+2)*(x+3)']

如果您正在使用sympy并认为使用字符串是"反模式"

import sympy

def fact(i):
    if i == 0:
        return sympy.Symbol('x')
    else:
        return sympy.Symbol('(x+%d)' % i) * fact(i - 1)

产生

>>> map(fact, range(4))
[x, (x+1)*x, (x+1)*(x+2)*x, (x+1)*(x+2)*(x+3)*x]

答案 2 :(得分:1)

RisingFactorial可能是最好的方式,特别是如果你只想要最后一个词,但你也可以这样做

a = [x]
for i in range(1, 5): # Replace 5 with however far up you want to go
    a.append(a[-1]*(x - i))

答案 3 :(得分:0)

假设没有现成的函数,你可以很容易地定义一个多项式表达式(不是Poly)......

def poly_by_roots(roots, sym):
    return prod(map(lambda x: sym-x, roots))

然后应用于根列表

polys = [poly_by_roots(range(a,1), x) for a in range(-5,1)]

这不是最有效的方法,即任何使用前一个多项式仅相差(x+i)的事实,例如

def poch_list(x,n):
    if n==0:
        return [x]
    else:
        val = poch_list(x,n-1)
        return val + [val[-1]*(x+n)]

允许符号长度,这可能是也可能不是好事。