【问题标题】:Best way to isolate one coefficient of a multivariate polynomial in sympy在 sympy 中隔离多元多项式的一个系数的最佳方法
【发布时间】:2026-01-30 17:05:01
【问题描述】:

我有一个多元多项式(在一般情况下有很多变量),它的系数列出了我需要读取的一些数据,但 sympy 似乎没有提供这样做的好方法。

collect 函数似乎是正确的想法,但是当您将它与多个变量一起使用时,它实际上并没有给您单个单项式,而是取决于您列出变量的顺序的奇怪的单项式分组。

有谁知道这样做的方法吗?

【问题讨论】:

    标签: python sympy symbolic-math


    【解决方案1】:

    documentation of polynomial module 列出了许多处理系数的方法。例如:

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

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

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

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

    >>> p.coeff_monomial(x**2*y)
    6
    

    【讨论】:

    • 您可以将变量传递给poly,而不是依赖于隐式变量排序,以任何您想要的顺序,例如poly((x+2*y-z)**3, x, y, z)
    【解决方案2】:

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

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

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

    >>> Poly(x + 3*y**2, x, y).coeff_monomial(y**2)
    3
    >>> Poly(x + 3*y**2, x, y).coeff_monomial((0, 2))
    3
    

    通过将 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})
    

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

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

    这可以变成一个默认字典,它会为不存在的单项式给出 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})
    

    【讨论】:

      最近更新 更多