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

5

给定一个具有符号的多元多项式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}
然而,我们面临的问题是集合是无序的,因此将其转换为列表可能会以不同的方式破坏顺序,这取决于变量的数量。
我有点茫然。有什么提示吗?
2个回答

3
属性gens(即生成器)包含一个元组,其中包含定义多项式的符号或其他适当对象。 链接
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()]

返回 [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,它返回一个字典,其键是单项式,值是相应的系数。


1
也许有点晚了,但是为了补充上面的好回答:

在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(),我相信它可以按照您想要的格式进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接