强迫辛普森遵守条款的顺序

2024-09-26 22:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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)的输出为

^{pr2}$

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

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

所有这些都在IPython笔记本中完成。 有没有办法维持秩序?在


Tags: 代码fromimportsincossymbolssympyxy
3条回答

遗憾的是,SymPy没有记录输入顺序(请参阅我在对该问题的评论中链接的另一个问题)。你可以定义你自己的排序函数来对表达式进行任何你想要的排序,但是没有办法完全按照输入的顺序排序,因为这些信息不会被保存。在

试试看这个http://docs.sympy.org/0.7.2/modules/utilities/misc.html,可能会对你有帮助

注:

返回的键对于将项按规范顺序排列非常有用,这种顺序在不同平台上都是相同的。它对于排序表达式列表没有直接的用处:

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

由于a只有1个项,其sort_key的值不受顺序的影响:

^{pr2}$

如果ab组合在一起,则密钥将不同,因为有可以排序的术语:

>>> 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]

但是,由于每个术语的键都独立于order的值,因此当它们单独出现在列表中时,它们的排序不会有所不同:

>>> 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]

使用这些键时获得的术语顺序是如果这些术语是产品中的因子,则将获得的顺序。在

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

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)

这个输出

^{pr2}$

相关问题 更多 >

    热门问题