首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Subs对象在调用doit方法后仍然保留

Subs对象在调用doit方法后仍然保留
EN

Stack Overflow用户
提问于 2018-01-06 08:32:29
回答 1查看 249关注 0票数 3

我正在尝试使用渐近来计算一般的复合函数导数。在我的特定情况下,脚本如下:

代码语言:javascript
复制
from sympy import *
t=symbols('t')
p=Function('p')
x=Function('x')
v=diff(x(p(t)),t)
a=diff(v,t)

对于变量a,它会产生:

代码语言:javascript
复制
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对象

代码语言:javascript
复制
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对象):

代码语言:javascript
复制
Derivative(p(t), t)**2*Derivative(x(p(t)), p(t), p(t)) + Derivative(x(p(t)), p(t))*Derivative(p(t), t, t)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-06 10:24:46

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

但您可以按如下方式处理此问题:

代码语言:javascript
复制
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一开始就不会把派生对象搞得一团糟...)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48123138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档