首页 > 解决方案 > 使用 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)))但这不适用于导数。如果这有帮助,我现在可以限制自己使用单个变量的函数。

作为奖励,我想让它与原始函数的任何组合(产品、导数、积分)一起使用。

标签: pythonsympy

解决方案


f.diff(x)正如你所说,这很令人失望。也许有人会在将来的某个时候创建​​支持它。同时,有两种方法可以解决这个问题:或者替换x你的y, z, ...OR lambdify 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())

两者都提供所需的输出。


推荐阅读