Sympy做了很好的工作,跟踪我对符号表达式所做的所有操作.但是打印乳胶输出结果的那一刻我想强制执行该术语的某个顺序.这只适用于惯例,不幸的是,该约定在符号名称上不是按字母顺序排列的(合理的同情)
import sympy as sp
sp.init_printing()
U,tp, z, d = sp.symbols('U t_\perp z d')
# do many operations with those symbols
# the final expression is:
z+tp**2+U+U/(z-3*tp)+d
Run Code Online (Sandbox Code Playgroud)
我的问题是SymPy将表达式表示为
U + U/(-3*t_\perp + z) + d + t_\perp**2 + z
Run Code Online (Sandbox Code Playgroud)
但这种排序不是我所在领域的惯例.对于我们来说,z必须是最左边的表达式,然后是tp,然后是U,即使它是大写的,d是最不相关的,并且放在右边.所有这些变量都具有特定的含义,这就是我们按照这样的顺序编写它们的原因,并且代码变量中的原因以这种方式命名.
我不想将z重命名为a并按照Prevent Sympy中的建议重新排列等式,然后在打印时将a转换为z.在Python中 - SymPy - 强制SymPy保持顺序有一个提示我可以写一个排序函数但我找不到有关它的文档.
如果您可以按照您想要的顺序放置术语,那么将orderLatex 打印机的标志设置为“无”将按该顺序打印它们。
>>> import sympy as sp
>>> sp.init_printing()
>>> U,tp, z, d = sp.symbols('U t_\perp z d')
>>> eq=z+tp**2+U+U/(z-3*tp)+d
Run Code Online (Sandbox Code Playgroud)
这里我们将它们按顺序排列(知道 的幂tp是 2)并重建为 Add withevaluate=False以保持顺序不变
>>> p = Add(*[eq.coeff(i)*i for i in (z, U, tp**2, d)],evaluate=False)
Run Code Online (Sandbox Code Playgroud)
现在我们使用打印机实例打印该表达式order='none':
>>> from sympy.printing.latex import LatexPrinter
>>> s=LatexPrinter(dict(order='none'))
>>> s._print_Add(p)
z + U \left(1 + \frac{1}{z - 3 t_\perp}\right) + t_\perp^{2} + d
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |