gpt4 book ai didi

python - 在 Sympy print 上强制执行自定义排序

转载 作者:行者123 更新时间:2023-12-02 07:20:13 24 4
gpt4 key购买 nike

SymPy 在跟踪我对符号表达式所做的所有操作方面做得非常出色。但是在打印 latex 输出结果时,我想强制执行该术语的某种顺序。这只是为了约定,不幸的是,符号名称的约定不是按字母顺序排列的(正如 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

我的问题是 SymPy 将表达式排序为

U + U/(-3*t_\perp + z) + d + t_\perp**2 + z

但是这种顺序并不是我所在领域的惯例。对于我们来说,z 必须是最左边的表达式,然后是 tp,然后是 U,即使它是大写的,d是最无关紧要的,放在右边。所有这些变量都具有特定的含义,这就是我们按这样的顺序编写它们的原因,也是代码中变量以这样的方式命名的原因。

我不想将 z 重命名为 a 并按照 Prevent Sympy from rearranging the equation 中的建议进行操作。然后在打印时将 a 转换为 z。在 Force SymPy to keep the order of terms有提示我可以编写排序函数,但我找不到有关它的文档。

最佳答案

如果您可以按照您想要的顺序放置术语,那么将 Latex 打印机的 order 标志设置为“none”将按该顺序打印它们。

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

这里我们将它们按顺序排列(知道tp的幂是2)并使用evaluate=False重建为Add以保持顺序不变

>>> p = Add(*[eq.coeff(i)*i for i in (z, U, tp**2, d)],evaluate=False)

现在我们使用带有 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

关于python - 在 Sympy print 上强制执行自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com