Подтвердить что ты не робот

Как извлечь все коэффициенты в 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}
4b9b3361

Ответ 1

Самый простой способ - использовать Poly

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

Ответ 2

all_coeffs() может быть когда-нибудь лучше, чем при использовании coeffs() для a 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]

Ответ 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.