从 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_symbols
和 free_symbols_in_domain
方法,其中 return 集合 {a, b, c, x, y}
和 {a, b, c}
。因此,通过取差可以得到 set {x, y}
.
然而,我们面临着集合无序的问题,因此将其转换为列表可能会根据变量的数量以不同的方式弄乱顺序。
我有点不知所措。有什么建议吗?
属性 gens
(generators 的缩写)持有 symbols or other suitable objects 的 tuple
,多项式定义于.
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()
,我相信它可以按照您想要的格式放置。
给定一个符号 多元 多项式 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_symbols
和 free_symbols_in_domain
方法,其中 return 集合 {a, b, c, x, y}
和 {a, b, c}
。因此,通过取差可以得到 set {x, y}
.
然而,我们面临着集合无序的问题,因此将其转换为列表可能会根据变量的数量以不同的方式弄乱顺序。
我有点不知所措。有什么建议吗?
属性 gens
(generators 的缩写)持有 symbols or other suitable objects 的 tuple
,多项式定义于.
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()
,我相信它可以按照您想要的格式放置。