如何根据递增次数(单变量情况)对多项式表达式(sympy,python)中的项进行排序?

问题描述 投票:0回答:2

sympy
(python)中,默认情况下,单变量多项式中的项似乎是根据递减度数排序的:首先是最高度数,然后是第二高度数,依此类推。因此,例如,像

这样的多项式

x + 1 + x^3 + 3x^6

将打印为 3x^6 + x^3 + x + 1。

我想反转

sympy
中多项式项的顺序,使其度数增加。对于同一示例,打印输出应为 1 + x + x^3 + 3x^6。首选全局更改程序前导码中某些参数的解决方案,但也欢迎其他选项。


这是一个可以使用的 MWE。它与我正在使用的实际程序不同。实际程序(不是 MWE)的一部分是打印出一系列递归定义的多项式,例如 P_n(x) = P_(n-1)(x) + a_n * x^n。当它们按程度递增排序时,我更容易比较它们。这是改变顺序的动机;在全球范围内这样做可能只会使代码更具可读性(美观)。但 MWE 只是针对上面示例中给出的相同简单多项式。

import sympy as sym
from sympy import *

x = sym.Symbol('x')
polynomial = x + 1 + x**3 + 3*x**6
print(polynomial)

MWE的输出:

>>> 3*x**6 + x**3 + x + 1

MWE 所需的输出:

>>> 1 + x + x**3 + 3*x**6

python printing sympy polynomials
2个回答
1
投票

您可以使用 sympy.polys.polytools.LT 获取首项:

LT(3x ** 6 + x ** 3 + x + 1) == 3x**6

所以至少你可以递归地生成术语并以你自己的方式打印它。

不幸的是,我很长一段时间以来一直在尝试寻找某种方法以某种固定顺序打印术语,但没有找到比这更好的解决方案


0
投票

似乎没有明确的方法可以做到这一点,我发现了解决问题的方法: 要修改对象的打印表示,您可以对其类型进行子类化并覆盖相应的打印方法(对于 LaTeX、MathML 等),请参阅文档

在这种情况下

_sympystr
用于“生成 SymPy 表达式的可读表示。

这里是基本实现:

from sympy import Poly, symbols, latex


class UPoly(Poly):
    """Modified univariative polynomial"""
  
    def _sympystr(self, printer) -> str:
        """increasing order of powers"""
        if self.is_multivariate:    # or: not self.is_univariate
            raise Exception('Error, Polynomial is not univariative')
        x = next(iter(expr.free_symbols))
        
        poly_print = ""
        for deg, coef in sorted(self.terms()):
            term = coef * x**deg[0]
            if coef.is_negative:
                term = -term     # fix sign
                poly_print += " - "
            else:
                poly_print += " + "
            poly_print += printer._print(term)
      
        return poly_print.lstrip(" +")

    def _latex(self, printer):
        return self._sympystr(printer)    # keep the order


x = symbols('x')
expr = 2*x + 6  - x**5
up = UPoly(expr)
print(up)
#6 + 2*x - x**5
print(latex(up))
#6 + 2 x - x^{5}
© www.soinside.com 2019 - 2024. All rights reserved.