如何提取sympy中的所有系数

62 投票
5 回答
51502 浏览
提问于 2025-04-18 01:59

你可以通过使用 coeff() 来获取某个特定项的系数。

x, a = symbols("x, a")
expr = 3 + x + x**2 + a*x*2
expr.coeff(x)
# 2*a + 1

在这里,我想提取所有关于 x、x 的平方(还有其他类似的项)的系数,比如:

# 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}

5 个回答

0

根据RDizzl3的回答,我做了如下修改:

d_c = collect(my_poly, x)
# replace n by highest power + 1 
dict = {x**p: d_c.coeff(x, p) for p in range(0,n)}

这样做并没有跳过常量。

4

你可以使用一种叫做字典推导式的方法,像这样:

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

这里的 n 是最高次方加一。在这个例子中,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 也是最高次方加一。

7

一组系数可以用Poly来处理,然后可以通过Expr.as_independent来把单项式分成依赖部分和独立部分:

def codict(expr, *x):
  collected = Poly(expr, *x).as_expr()
  i, d = collected.as_independent(*x, as_Add=True)
  rv = dict(i.as_independent(*x, as_Mul=True)[::-1] for i in Add.make_args(d))
  if i:
      assert 1 not in rv
      rv.update({S.One: i})
  return rv

>>> var('a x z y')
(a, x, z, y)
>>> expr = 3 + x + x**2 + a*x*2
>>> codict(expr, x)
{x**2: 1, x: 2*a + 1, 1: 3}
>>> codict(expr+y+z, x)
{x**2: 1, x: 2*a + 1, 1: y + z + 3}
>>> codict(expr+y+z, x,y)
{y: 1, x**2: 1, x: 2*a + 1, 1: z + 3}
>>> codict(expr+y+z, x,y,z)
{y: 1, z: 1, x**2: 1, x: 2*a + 1, 1: 3}
67

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]
47

最简单的方法就是使用 Poly

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

撰写回答