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



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

您可以使用sympy.polytools.LT:获得前导项

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

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

不幸的是,很长一段时间以来,我一直试图找到一些方法来以某种修复顺序打印条款,但没有找到比这个更好的解决方案

似乎没有明确的方法来做到这一点,我找到了解决问题的方法:要修改对象的打印表示,您可以将其类型划分为子类,并覆盖相应的打印方法(对于LaTeX、MathML…(,请参阅文档。

在这种情况下,CCD_生成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}

相关内容

最新更新