Python 在sympy中沿特定符号展开
当我使用symphy进行符号集成时,我想沿着特定符号展开一个表达式,以便稍后我可以收集并集成该符号的w.r.t。有没有办法在不改变其他(不相关)符号形式的情况下进行这种“扩展”Python 在sympy中沿特定符号展开,python,integration,expand,sympy,collect,Python,Integration,Expand,Sympy,Collect,当我使用symphy进行符号集成时,我想沿着特定符号展开一个表达式,以便稍后我可以收集并集成该符号的w.r.t。有没有办法在不改变其他(不相关)符号形式的情况下进行这种“扩展” 例如,考虑此Python代码并运行结果: >>> from sympy import * >>> var('x,a,b,c') (x, a, b, c) >>> f = (a + 1) * a + x * (b + exp(-c*x)) >>> co
例如,考虑此Python代码并运行结果:
>>> from sympy import *
>>> var('x,a,b,c')
(x, a, b, c)
>>> f = (a + 1) * a + x * (b + exp(-c*x))
>>> collect(f, (exp(-c*x), x))
a*(a + 1) + x*(b + exp(-c*x))
>>> collect(expand(f), (exp(-c*x), x))
a**2 + a + b*x + x*exp(-c*x)
产出都是预期的。如果不先“展开”,则“收集”只会返回原始表单。如果我们先用“扩展”,我就能得到我想要的。想象一下,如果我们有一个在“f”上面的许多符号的总和,并且符号b和c是复杂的表达式,那么如果我们使用f的原始形式,积分将花费很长时间。事实上,如果首先应用“扩展”,则需要几秒钟才能完成集成,但在运行近一个小时后无法完成
“扩展”的问题是,“完全扩展”表达式可能代价高昂。在上面的示例中,我们看到a*(a+1)也被扩展(并占用了计算时间)
我有一些表达式(将在后面集成),每个表达式扩展到大约4万个术语。展开的结果,作为x的函数,类似于上面例子中的形式——我知道它一定是那种形式。大部分时间(如果可能的话)都花在扩展那些与“x”无关的术语上。我可以避免这些不必要的扩展吗?您可以尝试屏蔽不包含x的术语,如下所示:
>>> def ex(e,x):
... m = [i for i in e.atoms(Mul) if not i.has(x)]
... reps = dict(zip(m,[Dummy() for i in m]))
... return expand(e.xreplace(reps)).subs([(v,k) for k,v in reps.items()])
...
>>> f = (a + 1) * a + x * (b + exp(-c*x))
>>> ex(f,x)
a*(a + 1) + b*x + x*exp(-c*x)
请注意,仅扩展了包含x的项
此外,您可能只想使用expand\u mul,而不是使用expand;expand执行多种类型的扩展(请参阅docstring)。谢谢。我尝试了一些简单的例子,你的代码很好用。我会把它放在我的节目里,看看这个周末进展如何。我会向你汇报的。