使用sympy获取函数的导数作为函数(以供以后评估和替换)

时间:2020-07-30 18:25:21

标签: python sympy

我想尽可能地使用泛型函数,并且仅在最后替换函数。 我想将一个函数定义为另一个函数的派生,使用该函数及其派生定义一个通用表达式,并在最后替换该函数。 现在,我的尝试如下,但出现错误'Derivative' object is not callable

from sympy import Function
x, y, z = symbols('x y z')
f  = Function('f') 
df = f(x).diff(x)  # <<< I'd like this to be a function of dummy variable x
expr = f(x) * df(z)  + df(y) + df(0) # df is unfortunately not callable
# At the end, substitute with example function
expr.replace(f, Lambda(X, cos(X))) # should return: -cos(x)*sin(z) - sin(y) - sin(0)

我认为我可以按如下方式使用积分: I= Lambda( x, integrate( f(y), (y, 0, x))),但不适用于衍生产品。 如果有帮助,我现在可以将自己限制为单个变量的功能。

作为奖励,我希望它可以与原始函数的任何组合(乘积,导数,积分)一起使用。

1 个答案:

答案 0 :(得分:2)

正如您所说,f.diff(x)无效很令人失望。也许有人会在将来的某个时间为其提供支持。同时,有两种解决方法:要么用x代替y, z, ...,要么使df呆板。

我认为从长远来看,第一种选择会更一致地工作(例如,如果您决定扩展到多元演算)。但是第二种选择expr更自然。

使用替换:

from sympy import *

x, y, z = symbols('x y z')
X = Symbol('X')

f = Function('f')
df = f(x).diff(x)

expr = f(x) * df.subs(x, z) + df.subs(x, y) + df.subs(x, 0)
print(expr.replace(f, Lambda(X, cos(X))).doit())

df进行标记:

from sympy import *

x, y, z = symbols('x y z')
X = Symbol('X')

f = Function('f')
df = lambda t: f(t).diff(t) if isinstance(t, Symbol) else f(X).diff(X).subs(X, t)

expr = f(x) * df(z) + df(y) + df(0)
print(expr.replace(f, Lambda(X, cos(X))).doit())

两者都能提供所需的输出。

相关问题