在Sympy中收集类似于表达式的项

2024-10-05 14:26:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在处理多个变量的函数,需要收集类似的术语,以尝试简化表达式。在

假设表达式如下:

x = sympy.Symbol('x')
y = sympy.Symbol('y')
k = sympy.Symbol('k')
a = sympy.Symbol('a')

z = k*(y**2*(a + x) + (a + x)**3/3) - k((2*k*y*(a + x)*(n - 1)*(-k*(y**2*(-a + x) + (-a + x)**3/3) + k*(y**2*(a + x) + (a + x)**3/3)) + y)**2*(-a + k*(n - 1)*(y**2 + (a + x)**2)*(-k*(y**2*(-a + x)))))
zEx = z.expand()
print type(z)
print type(zEx)

编辑:设置格式以增加清晰度,并更改表达式z以使问题更易于理解。在

假设z包含了如此多的术语,以至于可以通过眼睛来筛选它们。而选择合适的术语,则需要一段令人不满意的时间。在

我想收集所有a**1的倍数的术语。我不关心a的二次幂或更高的幂,也不关心不包含a的项

z和{}的类型返回以下内容:

^{pr2}$

有人知道我如何收集a的倍数,而不是^0或^2吗?在

tl'dr公司

其中z(x,y)包含由zzEx及其type()描述的常数:如何从z中删除所有非a项,并从表达式中删除{}的所有二次或更高的项?这样剩下的是只有包含a的单位幂的项。在


Tags: 函数编辑表达式格式typesymbol术语expand
3条回答

最后,它只是一个班轮。@阿斯默勒把我带到了正确的轨道上(查看下面的评论)。代码如下;解释如下:

from sympy import *
from sympy.parsing.sympy_parser import parse_expr
import sys

x, y, k, a = symbols('x y k a')

# modified string: I added a few terms
z = x*(k*a**9) + (k**1)*x**2 - k*a**8 + y*x*(k**2) + y*(x**2)*k**3 + x*(k*a**1) - k*a**3 + y*a**5

zmod = Add(*[argi for argi in z.args if argi.has(a)])

那么zmod

^{pr2}$

所以让我们更仔细地看一下:

z.args

只是表达式中所有单个术语的集合(请注意,符号也经过了解析,这使事情变得更简单):

(k*x**2, a**5*y, -a**3*k, -a**8*k, a*k*x, a**9*k*x, k**2*x*y, k**3*x**2*y)

然后在列表理解中,使用函数has选择包含a的所有术语。然后,可以使用Add将所有这些项粘在一起,这将提供所需的输出。在

编辑

上面的返回所有包含a的表达式。如果只想用unity power筛选出包含a的表达式,可以使用^{}Mul

from sympy import *
from sympy.parsing.sympy_parser import parse_expr
import sys

x, y, k, a = symbols('x y k a')

z2 = x**2*(k*a**1) + (k**1)*x**2 - k*a**8 + y*x*(k**2) + y*(x**2)*k**3 + x*k*a - k*a**3 + y*a**1

zc = collect(z2, a, evaluate=False)
zmod2 = Mul(zc[a], a)

那么zmod2

a*(k*x**2 + k*x + y)

zmod2.expand()

a*k*x**2 + a*k*x + a*y

这是正确的。在

通过更新的z,我运行:

z3 =  k*(y**2*(a + x) + (a + x)**3/3) - k((2*k*y*(a + x)*(n - 1)*(-k*(y**2*(-a + x) + (-a + x)**3/3) + k*(y**2*(a + x) + (a + x)**3/3)) + y)**2*(-a + k*(n - 1)*(y**2 + (a + x)**2)*(-k*(y**2*(-a + x)))))
zc3 = collect(z3.expand(), a, evaluate=False)
zmod3 = Mul(zc3[a], a)

然后获得zmod3.expand()

a*k*x**2 + a*k*y**2

这就是你要找的结果吗?在

附言:感谢@asmeurer的所有这些有用的评论!在

除了给出的其他答案之外,您还可以使用collect作为字典。在

print(collect(zEx,a,evaluate=False)[a])

生成表达式

^{pr2}$

要迭代表达式的术语,请使用expr.args。在

我不清楚a应该是什么,但是{a1}可以做你想要的。在

相关问题 更多 >