我正在尝试使用渐近来计算一般的复合函数导数。在我的特定情况下,脚本如下:
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(),answer仍然包含subs对象
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)有没有办法达到预期的效果?要清楚的是,这个例子比我的原始表达式非常简单,所以我需要一般的方法来获得所需的输出。
发布于 2018-01-06 10:24:46
事实上,在这种情况下重复应用doit()会导致表达式的两种形式之间的翻转:第一个加数有一半的时间有Subs,第二个加数有一半的时间有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只应用于它们,而不是应用于它只会搞乱事情的派生对象。(理想情况下,doit一开始就不会把派生对象搞得一团糟...)
https://stackoverflow.com/questions/48123138
复制相似问题