Как получить коэффициенты в выражении sympy/Python

Как получить коэффициенты в выражении sympy

b = sympy.Symbol('b')
a = sympy.Symbol('a')
x = sympy.Symbol('x')

y = 2*x**3 + a*x**2 +b*x

Результат должен быть:

coeff for x**3 =2 coeff for x**2 = a coeff for x = b


person karen_the_great    schedule 05.03.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как извлечь все коэффициенты в sympy   -  person Lomtrur    schedule 05.03.2020


Ответы (2)


Удивительно неудобно получить форму выражения членов в многочлене, но вы можете сделать это так:

In [28]: b = sympy.Symbol('b') 
    ...: a = sympy.Symbol('a') 
    ...: x = sympy.Symbol('x') 
    ...:  
    ...: y = 2*x**3 + a*x**2 +b*x

In [29]: p = Poly(y, x)

In [30]: p
Out[30]: Poly(2*x**3 + a*x**2 + b*x, x, domain='ZZ[a,b]')

In [31]: {x**m[0]:p.coeff_monomial(m) for m in p.monoms()}
Out[31]: 
⎧       2      3   ⎫
⎨x: b, x : a, x : 2⎬
⎩                  ⎭
person Oscar Benjamin    schedule 05.03.2020

Хотя получить коэффициенты несложно

>>> y = 2*x**3 + a*x**2 + b
>>> p = Poly(y, x)
>>> p.coeffs()
[2, a, b]
>>> p.all_coeffs()
[2, a, 0, b]

привязка их к их моному является нереализованной/отсталой частью. @OscarBenjamin показал, как это сделать с мономами Poly. Вы также можете работать с выражением, не конвертируя его в Poly:

>>> dict(i.as_independent(x)[::-1] for i in Add.make_args(y))
{1: b, x**3: 2, x**2: a}

Было бы неплохо для SymPy включить ключевое слово mapping в Poly.coeffs, которое позволило бы вернуть этот словарь. В качестве альтернативы Expr.as_coefficients_dict может быть задано необязательное ключевое слово variable, которое позволит возвращать коэффициенты, не зависящие от каких-либо символов в variable.

Это простое понимание словаря не удастся, если в выражении есть несобранные термины, такие как a*x + b*x. Более надежная небольшая функция опубликована здесь.

person smichr    schedule 05.03.2020