使用符号

时间:2017-01-16 17:27:35

标签: python sum sympy

我试图使用sympy在python中对函数求和。我的功能是

x=symbols('x')
def f(k):
   if k==0:
        return x
    else:
        return 1

如果我问f(0)是什么,我得到x,我可以高兴地问一些像

这样的事情
integrate(f(0),(x,0,1))

我得到1/2,正如我所料。

但如果我写

summation(f(i),(i,0,3))

我得到4而不是x + 3。这看起来有点奇怪,特别是因为如果我没有指定函数f并且去

f=Function('f')

然后

summation(f(i),(i,0,3))

给出f(0)+ f(1)+ f(2)+ f(3)。那么,为什么,当f如上定义时,我最终会得到4而不是x + 3?

后来添加:我刚注意到我甚至不需要符号x来表示行为不符合我的预期。例如

def f(k):
   if k==0:
        return 100
    else:
        return 1

summation(f(i),(i,0,3))

返回4而不是103。

2 个答案:

答案 0 :(得分:3)

中执行f(i)
summation(f(i),(i,0,3))

您正在调用f函数:

def f(k):
   if k==0:
        return x
    else:
        return 1

i0进行比较,然后返回x1。由于i == 0评估为False,因此会返回1,因此您实际上只是将1从0加到3。

summation根本看不到f。它只会看到1,因为f(i)调用在summation运行之前已完全评估。 summation只能看到返回值。

答案 1 :(得分:3)

正如@ user2357112所指出的那样,Python函数会立即进行评估,因此f(i)一旦调用它就会评估为1(因为i不等于0)。

要创建未评估的功能,您可以使用Piecewise,例如

expr = Piecewise((x, Eq(i, 0)), (1, True))
summation(expr, (i, 0, 3))

或子类Function并定义eval

class f(Function):
    @classmethod
    def eval(cls, i):
        if i.is_Integer: # Checks if i is an explicit integer, like 0, and not a symbolic expression
            if i == 0:
                return x
            return 1

summation(f(i), (i, 0, 3))

eval方法告诉函数何时评估。当它返回None时(此时i不是显式整数),它将保持未评估状态。

Piecewise可能是更好的解决方案,但是当你有更复杂的逻辑时,子类化Function会更好。