Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在sympy中沿特定符号展开_Python_Integration_Expand_Sympy_Collect - Fatal编程技术网

Python 在sympy中沿特定符号展开

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

当我使用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))
>>> 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)。

谢谢。我尝试了一些简单的例子,你的代码很好用。我会把它放在我的节目里,看看这个周末进展如何。我会向你汇报的。