我试图用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)
有没有办法达到预期的效果?要清楚这个例子与我的原始表达式相比非常简化,所以我需要通用的方法来获得所需的输出。
答案 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
首先不会弄乱衍生物对象......)