在sympy

时间:2018-01-06 00:32:29

标签: python python-3.x sympy

我试图用sympy计算一般复合函数导数。在我的具体案例中,脚本如下:

from sympy import *
t=symbols('t')
p=Function('p')
x=Function('x')
v=diff(x(p(t)),t)
a=diff(v,t)

对于变量a,它产生:

Derivative(p(t), t)**2*Derivative(x(p(t)), p(t), p(t)) + Derivative(p(t), t, t)*Subs(Derivative(x(_xi_1), _xi_1), (_xi_1,), (p(t),))

如果我拨打doit(),则答案仍然包含子对象

a.doit() #answer: Derivative(p(t), t)**2*Subs(Derivative(x(_xi_3), _xi_3, _xi_3), (_xi_3,), (p(t),)) + Derivative(x(p(t)), p(t))*Derivative(p(t), t, t)

数学上答案是正确的,但我仍然需要以下格式输出(没有Subs对象):

Derivative(p(t), t)**2*Derivative(x(p(t)), p(t), p(t)) + Derivative(x(p(t)), p(t))*Derivative(p(t), t, t)

有没有办法达到预期的效果?要清楚这个例子与我的原始表达式相比非常简化,所以我需要通用的方法来获得所需的输出。

1 个答案:

答案 0 :(得分:2)

实际上,在这种情况下重复应用doit()会导致表达式的两种形式之间的翻转:第一个加数具有Subs的一半时间,第二个加数的一半时间。

但您可以按如下方式解决问题:

for b in a.atoms(Subs):
  a = a.xreplace({b: b.doit()})

根据需要返回Derivative(p(t), t)**2*Derivative(x(p(t)), p(t), p(t)) + Derivative(x(p(t)), p(t))*Derivative(p(t), t, t)

诀窍是atoms(Subs)是表达式中所有Subs对象的集合,而doit仅应用于它们,而不是仅应用于衍生对象的Derivative对象。 (理想情况下,doit首先不会弄乱衍生物对象......)