从 SymPy 中的给定多项式中提取系数和相应的单项式

Extract coefficients and corresponding monomials from a given polynomial in SymPy

给定一个符号 多元 多项式 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() 中。但是,我在获得单项式时遇到了麻烦。这里内置函数 return 是一个指数列表,例如,在上面的例子中我们会得到 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 ]

然而,多项式 class 似乎没有提供 return 变量列表的函数。我所能找到的只是 free_symbolsfree_symbols_in_domain 方法,其中 return 集合 {a, b, c, x, y}{a, b, c}。因此,通过取差可以得到 set {x, y}.

然而,我们面临着集合无序的问题,因此将其转换为列表可能会根据变量的数量以不同的方式弄乱顺序。

我有点不知所措。有什么建议吗?

属性 gensgenerators 的缩写)持有 symbols or other suitable objectstuple,多项式定义于.

from sympy import symbols, Poly

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()]

returns [x**3, x**2, x*y, y**3, y**2].

另请注意,生成器可以是符号以外的类型,例如:

import sympy

x = sympy.symbols('x')
poly = sympy.poly(sympy.sqrt(2) * x**2)
print('generators: {g}'.format(g=poly.gens))
print('monomials: {m}'.format(m=poly.monoms()))
print('coefficients: {c}'.format(c=poly.coeffs()))

打印:

generators: (x, sqrt(2))
monomials: [(2, 1)]
coefficients: [1]

其中:

  • type(poly.gens[0])<class 'sympy.core.symbol.Symbol'>
  • type(poly.gens[1])<class 'sympy.core.power.Pow'>.

一个相关的方法是sympy.polys.polytools.Poly.as_dict,其中returns一个dict键是单项式,值是相应的系数。

也许回答晚了,但只是为了补充上面的好答案:

在 Sympy 1.8 中,Poly 对象 x 具有属性 .args,即:

import sympy as sp  

x = sp.Poly(x**3 + 2*x**2 + 3*x*y + 4*y**2 + 5*y**3)
x.args[1:] #returns (x,y)

x.args[1:] 将根据您定义符号的方式进行排序。例如,如果您的多项式在符号方面有 n 个变量:

a = sp.symbols('a:n')

那么 x.args[1:] 的顺序就是 (a0, ..., an)。了解这一点和 x.monoms(),我相信它可以按照您想要的格式放置。