在同情中隔离多元多项式的一个系数的最佳方法

xan*_*ood 6 python symbolic-math sympy

我有一个多元多项式(在一般情况下有许多变量),其系数列出了我需要读取的一些数据,但看起来似乎没有一个很好的方法来做到这一点.

collect功能似乎是正确的想法,但是当你有几个变量使用它,它实际上并没有给你个人单项式,但单项的比较奇怪的分组依赖你列出的变量的顺序.

有谁知道这样做的方法?

小智 8

多项式模块文档列出了许多处理系数的方法.例如:

>>> import sympy
>>> x,y,z = sympy.symbols('x,y,z')
>>> p = sympy.poly((x+2*y-z)**3)
>>> p.coeffs()
[1, 6, -3, 12, -12, 3, 8, -12, 6, -1]
Run Code Online (Sandbox Code Playgroud)

这些是字典顺序中的非零系数.要查看匹配顺序中的单项式,请使用

>>> p.monoms()
[(3, 0, 0), (2, 1, 0), (2, 0, 1), (1, 2, 0), (1, 1, 1), (1, 0, 2), (0, 3, 0), (0, 2, 1), (0, 1, 2), (0, 0, 3)]
Run Code Online (Sandbox Code Playgroud)

要获得特定单项式的系数,请使用

>>> p.coeff_monomial(x**2*y)
6
Run Code Online (Sandbox Code Playgroud)

  • 您可以将变量以任何您想要的顺序传递给`poly`,而不是依赖于隐式变量排序,例如`poly((x + 2*yz)**3,x,y,z)`. (3认同)

smi*_*chr 5

多项式的单项式按生成器出现的顺序列出(并且该顺序由用户控制):

>>> from sympy import Poly
>>> from sympy.abc import x, y, z
>>> Poly(x + 3*y**2, x, y).monoms()
[(1, 0), (0, 2)]
>>> Poly(x + 3*y**2, y, x).monoms()
[(2, 0), (0, 1)]
Run Code Online (Sandbox Code Playgroud)

当查询获取系数时,可以使用单项元组或表达式:

>>> Poly(x + 3*y**2, x, y).coeff_monomial(y**2)
3
>>> Poly(x + 3*y**2, x, y).coeff_monomial((0, 2))
3
Run Code Online (Sandbox Code Playgroud)

通过将 Poly 转换为表达式,然后使用以下方法,可以以单项式表达式形式获得不同单项式的所有系数的字典as_coefficients_dict

>>> p = Poly((x+2*y-z)**3)
>>> p.as_expr().as_coefficients_dict()
defaultdict(<class 'int'>, {
x**3: 1, z**3: -1, y**3: 8, y**2*z: -12, x**2*z: -3,
x*z**2: 3, x**2*y: 6, y*z**2: 6, x*y**2: 12, x*y*z: -12})
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢单项元组形式,您可以使用:

>>> [(m,p.coeff_monomial(m)) for m in p.monoms()]
[((3, 0, 0), 1), ((2, 1, 0), 6), ((2, 0, 1), -3), ((1, 2, 0), 12), ((1, 1, 1),
-12), ((1, 0, 2), 3), ((0, 3, 0), 8), ((0, 2, 1), -12), ((0, 1, 2), 6),
((0, 0, 3), -1)]
Run Code Online (Sandbox Code Playgroud)

这可以变成一个 defaultdict,对于不存在的单项式,它会给出 0:

>>> defaultdict(int, _)
defaultdict(<class 'int'>, {(3, 0, 0): 1, (2, 1, 0): 6, (2, 0, 1): -3,
(1, 2, 0): 12, (1, 1, 1): -12, (1, 0, 2): 3, (0, 3, 0): 8, (0, 2, 1): -12,
(0, 1, 2): 6, (0, 0, 3): -1})
>>> c = _; c[(2,2,2)]  # there is no term of order 6 so coeff is 0
0
Run Code Online (Sandbox Code Playgroud)