Subs object still remains after calling doit method in sympy

强颜欢笑 提交于 2019-12-01 23:09:45

问题


I am trying to calculate general composite function derivative using sympy. In my specific case script is the following:

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

for variable a it yields:

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),))

If I call doit(), answer still contains subs object

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)

Mathematically the answer is correct but I still need output in following format (without Subs objects):

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

Is there any way to achieve desired result? To be clear this example is very simplified compared to my original expression so I need general way to get desired output.


回答1:


Indeed, repeated applications of doit() in this case result in flip-flopping between two forms of the expression: half the time the first addend has Subs, half the time it's the second.

But you can deal with the issue as follows:

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

This returns Derivative(p(t), t)**2*Derivative(x(p(t)), p(t), p(t)) + Derivative(x(p(t)), p(t))*Derivative(p(t), t, t) as desired.

The trick is that atoms(Subs) is the set of all Subs objects in the expression, and doit is applied only to them, not to Derivative objects where it only messes things up. (Ideally, doit would not mess Derivative objects up in the first place...)



来源:https://stackoverflow.com/questions/48123138/subs-object-still-remains-after-calling-doit-method-in-sympy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!