您可以使用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}
答案 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}