我试图使用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。
答案 0 :(得分:3)
在
中执行f(i)
时
summation(f(i),(i,0,3))
您正在调用f
函数:
def f(k):
if k==0:
return x
else:
return 1
将i
与0
进行比较,然后返回x
或1
。由于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
会更好。