我想尽可能地使用泛型函数,并且仅在最后替换函数。
我想将一个函数定义为另一个函数的派生,使用该函数及其派生定义一个通用表达式,并在最后替换该函数。
现在,我的尝试如下,但出现错误'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)))
,但不适用于衍生产品。
如果有帮助,我现在可以将自己限制为单个变量的功能。
作为奖励,我希望它可以与原始函数的任何组合(乘积,导数,积分)一起使用。
答案 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())
两者都能提供所需的输出。