在sympy中将变量代入二阶导数

substituting variable to second order derivative in sympy

我正在使用 sympy 推导一些方程式,并且我在代入时遇到了一些意外行为。假设我有一个函数 f(x),我像这样用 x 区分它:

fx = f(x).diff()

结果如下:

现在,如果我将 x 替换为 pi 之类的值,如下所示:

fx.subs(x, pi)

我得到:

但是,如果我用另一个变量替换 x,假设 phi,如下所示:

fx.subs(x, phi)

我得到了一些意想不到的东西:

正在发生的事情是 sympy 在微分之前替换了方程中的 x,我希望它在微分之后替换它。我看到一些建议我应该使用 .doit(),但这并没有得到想要的解决方案:

fx.doit().subs(x, phi)

我做错了什么,微分后如何替换变量?

使用srepr更直接地查看表达式的结构:

In [48]: f(x).diff(x).subs(x, pi)
Out[48]: 
⎛d       ⎞│   
⎜──(f(x))⎟│   
⎝dx      ⎠│x=π

In [49]: srepr(f(x).diff(x).subs(x, pi))
Out[49]: "Subs(Derivative(Function('f')(Symbol('x')), Tuple(Symbol('x'), Integer(1))), Tuple(Symbol('x')), Tuple(pi))"

所以你可以看到 Subs 是用来表示 未计算的 替换:

In [50]: Subs(f(x).diff(x), x, phi)
Out[50]: 
⎛d       ⎞│   
⎜──(f(x))⎟│   
⎝dx      ⎠│x=φ

然后 doit 用于使 Subs 评估 (通过执行替换):

In [51]: Subs(f(x).diff(x), x, phi).doit()
Out[51]: 
d       
──(f(φ))
dφ    

https://docs.sympy.org/latest/modules/core.html#subs