web-dev-qa-db-fra.com

Comment extraire tous les coefficients dans sympy

Vous pouvez obtenir un coefficient d'un terme spécifique en utilisant coeff ();

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

Ici, je veux extraire tous les coefficients de x, x ** 2 (et ainsi de suite), comme;

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

Il existe une méthode as_coefficients_dict (), mais il semble que cela ne fonctionne pas comme je le souhaite;

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}
32
akai

La façon la plus simple est d'utiliser Poly

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

all_coeffs() peut être mieux que d'utiliser coeffs() pour un Poly. La différence réside dans la sortie de ces deux. coeffs() renvoie une liste contenant tous les coefficients qui a une valeur et ignore ceux dont le coefficient est 0 tandis que all_coeffs() renvoie tous les coefficients y compris ceux dont le coefficient est nul.

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

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

Une chose que vous pouvez faire est d'utiliser une compréhension de dictionnaire comme ceci:

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

où n est la puissance la plus élevée + 1. Dans ce cas, n = 3. Vous auriez donc la liste [1,2]

Cela donnerait

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

Ensuite, vous pouvez ajouter dans le seul terme avec

dict[1] = 3

Donc

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

Vous pouvez également essayer:

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

où n est la puissance la plus élevée + 1.

3
RDizzl3