强制SymPy保持条款的顺序

Upm*_*rab 5 python sympy

我有以下代码:

from sympy import *
init_printing()

x,y = symbols('x y')
u = Function('u')(x,y)
ux,uy,uxx,uxy,uyy = symbols("u_x u_y u_xx u_xy u_yy")

mainEvaluation = uxx - 2*sin(x)*uxy - (cos(x) ** 2) * uyy - 2*ux + (2 - cos(x) + 2*sin(x) )*uy
Run Code Online (Sandbox Code Playgroud)

而当的输出print(mainExpression)

-2*u_x + u_xx - 2*u_xy*sin(x) + u_y*(2*sin(x) - cos(x) + 2) - u_yy*cos(x)**2
Run Code Online (Sandbox Code Playgroud)

问题是:我想要变量的原始顺序。

u_xx - 2*u_xy*sin(x)  - u_yy*cos(x)**2  - 2*u_x + u_y*(2*sin(x) - cos(x) + 2)
Run Code Online (Sandbox Code Playgroud)

所有这些都是在IPython Notebook中完成的。有什么办法保持秩序?

asm*_*rer 6

可悲的是,SymPy无法跟踪输入顺序(请参阅我在该问题的评论中链接的另一个问题)。您可以定义自己的排序函数,以便根据需要对表达式进行排序,但是由于无法保存信息,因此无法完全按照输入的顺序对它们进行排序。

  • 如何“定义自己的排序函数,根据需要对表达式进行排序”?至少可以说,有关各种打印模式的文档非常密集。 (3认同)

smi*_*chr 5

如果您知道您的参数/术语是什么,那么您可以手动创建“添加”evaluate=False以保持它们的顺序,并使用初始化为不更改顺序的打印机打印它们:

x,y = symbols('x y')
u = Function('u')(x,y)
ux,uy,uxx,uxy,uyy = symbols("u_x u_y u_xx u_xy u_yy")
args = uxx , -2*sin(x)*uxy, -cos(x)**2*uyy, -2*ux, +(2-cos(x)+2*sin(x))*uy

expr = Add(*args, evaluate=False)
from sympy.printing.str import StrPrinter # or LatexPrinter from .latex)
StrPrinter(dict(order='none'))._print_Add(expr)
Run Code Online (Sandbox Code Playgroud)

这输出

u_xx - 2*u_xy*sin(x) - u_yy*cos(x)**2 - 2*u_x + u_y*(2 - cos(x) + 2*sin(x))
Run Code Online (Sandbox Code Playgroud)