如何提取同情中的所有系数

时间:2014-04-09 07:39:55

标签: python sympy

您可以使用coeff();

获取特定术语的系数
x, a = symbols("x, a")
expr = 3 + x + x**2 + a*x*2
expr.coeff(x)
# 2*a + 1

这里我想提取x,x ** 2(等等)的所有系数,如;

# for example
expr.coefficients(x)
# want {1: 3, x: (2*a + 1), x**2: 1}

有一个方法as_coefficients_dict(),但似乎这并不像我想要的那样工作;

expr.as_coefficients_dict()
# {1: 3, x: 1, x**2: 1, a*x: 2}
expr.collect(x).as_coefficients_dict()
# {1: 3, x**2: 1, x*(2*a + 1): 1}

4 个答案:

答案 0 :(得分:35)

对于all_coeffs()

coeffs()可能比使用Poly更好。 不同之处在于这两者的产出。 coeffs()返回一个列表,其中包含具有值的所有系数,并忽略系数为0的系数,而all_coeffs()返回所有系数,包括系数为零的系数。

>>> a = Poly(x**3 + a*x**2 - b, x)
>>> a.coeffs()
[1, a, -b]

>>> a.all_coeffs()
[1, a, 0, -b]

答案 1 :(得分:24)

最简单的方法是使用Poly

>>> a = Poly(expr, x)
>>> a.coeffs()
[1, 2*a + 1, 3]

答案 2 :(得分:3)

你可以做的一件事就是使用字典理解:

dict = {x**p: expr.collect(x).coeff(x**p) for p in range(1,n)}

其中n是最高功率+ 1。在这种情况下,n = 3。所以你会得到列表[1,2]

这会给出

dict = {x: (2*a+1), x**2: 1}

然后您可以使用

添加单个术语
dict[1] = 3

所以

 dict = {1:3,x:(2*a+1),x**2:1}

您也可以尝试:

a = list(reversed(expr.collect(x).as_ordered_terms()))
dict = {x**p: a[p],coeff(x**p) for p in range(1,n)}
dict[1] = a[0] # Would only apply if there is single term such as the 3 in the example

其中n是最高功率+1。

答案 3 :(得分:2)

可以使用Poly处理系数的集合,然后可以使用Expr.as_independent处理单项式分解为相关部分和独立部分:

>>> def codict(expr, *x):
...   collected = Poly(expr, *x).as_expr()
...   return dict(i.as_independent(*x)[::-1] for i in Add.make_args(collected))
...
>>> codict(y, x)
{1: 3, x**2: 1, x: 2*a + 1}
>>> codict(y+b*z,x,z)
{1: 3, x**2: 1, z: b, x: 2*a + 1}