在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}