Извлечь коэффициенты и соответствующие одночлены из заданного полинома в SymPy - PullRequest
0 голосов
/ 28 мая 2018

Учитывая символический многомерный полином P, мне нужно извлечь его коэффициенты и соответствующие одночлены в виде списков:

def poly_decomp(P):
    ....
    return coeffs, monoms

, так что P является точечным произведениемкоэффициенты и мономы, например, если P(x,y) = ax**2 + bxy + cy**2, то мы должны получить coeffs = [a, b, c] и monoms = [x**2, x*y, y**2].

Получить коэффициенты легко, поскольку функция встроена в coeffs = P.coeffs().Однако у меня проблемы с получением мономов.Здесь встроенная функция возвращает список показателей, например, в приведенном выше примере мы получили бы P.monoms() = [(2,0),(1,1),(0,2)].

Очевидно, что идея, при условии списка переменных var=[x,y], сделать что-то вроде

powers = P.monoms() 
monoms = [sympy.prod(x**k for x,k in zip(var, mon)) for mon in powers ]

Однако класс полиномов, похоже, не предлагает функцию, которая возвращает список переменных.Все, что я мог найти, это методы free_symbols и free_symbols_in_domain, которые возвращают множества {a, b, c, x, y} и {a, b, c}.Таким образом, взяв их различие, можно получить набор {x, y}.

Однако тогда мы сталкиваемся с проблемой, что наборы неупорядочены, следовательно, преобразование его в список может испортитьПорядок по-разному в зависимости от количества переменных.

Я в некотором роде в недоумении.Любые советы?

1 Ответ

0 голосов
/ 28 мая 2018

Свойство gens (сокращение от generators ) содержит кортеж переменных в полиноме.

from sympy import *
x, y = symbols('x y')
p = Poly(x**3 + 2*x**2 + 3*x*y + 4*y**2 + 5*y**3, x, y)
q = Poly(x**3 + 2*x**2 + 3*x*y + 4*y**2 + 5*y**3, y, x)
print(p.gens)    #  (x, y)
print(q.gens)    #  (y, x)

Итак,

[prod(x**k for x, k in zip(p.gens, mon)) for mon in p.monoms()]

возвращает [x**3, x**2, x*y, y**3, y**2].

...