强制SymPy保持术语的顺序

时间:2016-03-30 15:59:30

标签: 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

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

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

u_xx - 2*u_xy*sin(x)  - u_yy*cos(x)**2  - 2*u_x + u_y*(2*sin(x) - cos(x) + 2)

这一切都在IPython笔记本中完成。 有没有办法保持秩序?

3 个答案:

答案 0 :(得分:4)

可悲的是,SymPy没有跟踪输入顺序(请参阅我在问题评论中链接的其他问题)。您可以定义自己的订购功能,根据需要对表达式进行排序,但由于没有保存,因此无法完全按照输入的顺序排序。

答案 1 :(得分:1)

尝试阅读此http://docs.sympy.org/0.7.2/modules/utilities/misc.html,可能可以帮助您

注意:

返回的密钥对于将项目放入规范订单非常有用,这些订单在不同平台上都是相同的。它对于排序表达式列表没有直接用处:

>>> a, b = x, 1/x

由于a只有1个术语,因此sort_key的值不受顺序的影响:

>>> a.sort_key() == a.sort_key('rev-lex')
True

如果组合a和b,那么密钥会有所不同,因为有些条款可以订购:

>>> eq = a + b
>>> eq.sort_key() == eq.sort_key('rev-lex')
False
>>> eq.as_ordered_terms()
[x, 1/x]
>>> eq.as_ordered_terms('rev-lex')
[1/x, x]

但由于这些术语中的每个术语的键都与订单的值无关,因此当它们在列表中单独出现时,它们的排序不同:

>>> sorted(eq.args, key=default_sort_key)
[1/x, x]
>>> sorted(eq.args, key=lambda i: default_sort_key(i, order='rev-lex'))
[1/x, x]

使用这些密钥时获得的条款顺序是如果这些条款是产品中的因素,将会获得的顺序。

答案 2 :(得分:0)

如果您知道参数/术语是什么,则可以手动创建带有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)

此输出

u_xx - 2*u_xy*sin(x) - u_yy*cos(x)**2 - 2*u_x + u_y*(2 - cos(x) + 2*sin(x))