Hyp*_*ane 5 python sympy python-3.x polynomials
给定一个符号多元多项式P,我需要将其系数和相应的单项式提取为列表:
def poly_decomp(P):
....
return coeffs, monoms
Run Code Online (Sandbox Code Playgroud)
这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 ]
Run Code Online (Sandbox Code Playgroud)
然而,多项式类似乎没有提供返回变量列表的函数。我能找到的只是返回集合 和 的方法free_symbols和。因此,通过取它们的差值,可以获得一组。free_symbols_in_domain{a, b, c, x, y}{a, b, c} {x, y}
然而,我们面临的问题是集合是无序的,因此将其转换为列表可能会根据变量的数量以不同的方式打乱顺序。
我在这里有点不知所措。有小费吗?
小智 3
该属性gens(generators的缩写)包含定义多项式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)
Run Code Online (Sandbox Code Playgroud)
所以,
[prod(x**k for x, k in zip(p.gens, mon)) for mon in p.monoms()]
Run Code Online (Sandbox Code Playgroud)
返回[x**3, x**2, x*y, y**3, y**2]。
另请注意,生成器可以是符号以外的类型,例如:
[prod(x**k for x, k in zip(p.gens, mon)) for mon in p.monoms()]
Run Code Online (Sandbox Code Playgroud)
打印:
generators: (x, sqrt(2))
monomials: [(2, 1)]
coefficients: [1]
Run Code Online (Sandbox Code Playgroud)
在哪里:
type(poly.gens[0])是<class 'sympy.core.symbol.Symbol'>, 和type(poly.gens[1])是<class 'sympy.core.power.Pow'>。一个相关的方法是sympy.polys.polytools.Poly.as_dict,它返回 a ,dict其中键是单项式,值是相应的系数。
| 归档时间: |
|
| 查看次数: |
2911 次 |
| 最近记录: |