我想用sympy来帮助我简化表达式,但是我需要继续使用的是函数参数。这是一个玩具问题,但也有以下几点:
到目前为止,我知道我可以创建泛型函数,但传播参数却让我望而却步:
def string(data):
if sys.version_info >= (3, 0):
return str(data)
else:
return unicode(data)
这导致以下结果:
tau_1, tau_2, tau_3, x = symbols("tau_1, tau_2, tau_3, x")
f = Function("f")
g = Function("g")
h = Function("h")
delta = Function("delta")
f = tau_1 + delta(x)
g = f(x + tau_2)
我可以在TypeError: 'Add' object is not callable
中找到我想要的内容吗?
答案 0 :(得分:3)
首先,表达式和函数之间存在差异。例如,expr = sin(x) + cos(x)
是一个表达式;它不可调用,这意味着你不能expr(y+1)
或类似的东西(你可以做expr.subs(x, y+1)
)。
如果你想要一些看似sin(x)+ cos(x)但是函数的东西,请使用Lambda
(这是SymPy的Python版本lambda
)。
f = Lambda(x, sin(x) + cos(x))
然后f(y+1)
为sin(y+1) + cos(y+1)
。
在你的符号中,那将是
f = Lambda(x, tau_1 + delta(x))
g = Lambda(x, f(x + tau_2))
现在g(2)是tau_1 + delta(tau_2 + 2)
另外,请注意f = Function("f")
没有任何后果,因为它稍后会被f = ...
覆盖。您可能认为语句f = Function("f")
是一种类型声明:“我声明f是一个函数,并且期望f后续对f知道它是一个函数”。但它只是一个任务,而不是一个类型声明;因此被任何后续任务覆盖。说f = Function("f")
意味着你创建了一个未定义的函数f,就是这样。 SymPy对象是不可变的,以后无法向f添加更多功能,只能覆盖它。