通用函数包括另一个函数,传播参数

时间:2018-01-09 17:37:42

标签: python sympy

我想用sympy来帮助我简化表达式,但是我需要继续使用的是函数参数。这是一个玩具问题,但也有以下几点:

example_equation

到目前为止,我知道我可以创建泛型函数,但传播参数却让我望而却步:

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 中找到我想要的内容吗?

1 个答案:

答案 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添加更多功能,只能覆盖它。