在Sympy中收集表达式的术语

问题描述 投票:4回答:3

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

说表达式如下:

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包含很多术语,用眼睛筛选它们。并选择适当的条款,将花费不满意的时间。

我想收集所有只是** 1的倍数的条款。我不关心a的二次或更高的权力,我不关心不包含a的术语。

zzEx的类型返回以下内容:

print type(z)
print type(zEx)
>>>
<class 'sympy.core.add.Add'>
<class 'sympy.core.mul.Mul'>

有谁知道我如何收集a倍数的术语,而不是^ 0或^ ^ 2?

tl'dr

其中z(x,y)具有由zzEx描述的常数a和k及其类型():如何从a中删除所有非z项并从表达式中删除a的所有二次或更高项?剩下的只是包含a统一力量的术语。

python python-2.7 math sympy polynomials
3个回答
2
投票

最后它只是一个单行。 @asmeurer让我走上正轨(查看本文下面的评论)。这是代码;解释如下:

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

a**9*k*x - a**8*k + a**5*y - a**3*k + a*k*x

让我们更仔细地看一下:

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)

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

编辑

以上返回包含a的所有表达式。如果你只想过滤掉包含a和统一幂的表达式,你可以使用collectMul

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

这是你要找的结果吗?

PS:感谢@asmeurer所有这些有用的评论!


2
投票

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

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

得出表达式

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

1
投票

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

我不清楚a应该是什么,但collect function可能做你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.