防止Sympy重新排列方程

13 投票
2 回答
3548 浏览
提问于 2025-04-17 14:18

也许我忽略了一些明显的东西,但我该如何防止sympy重新排列方程呢?

我在iPython笔记本中使用Sympy,这样我可以方便地把Latex代码复制粘贴到Lyx中,但我希望方程能保持我定义时的顺序。

比如,灰体辐射的公式是温度的函数:

enter image description here

Sympy会自动把温度这个部分放到最前面,这样就让这个公式看起来很奇怪。有没有办法防止这种情况发生呢?

2 个回答

5

如果你想让一个乘法运算的参数按特定顺序显示,你可以用这些参数创建一个Mul(乘法对象),然后告诉打印机不要重新排序,就像在这里对加法运算所做的那样。对于你的例子,你可以这样做:

>>> var('epsilon, sigma, T')
(epsilon, sigma, T)
>>> this = Mul(epsilon, sigma, T**4, evaluate=False)
>>> StrPrinter({'order':'none'})._print_Mul(this)
epsilon*sigma*T**4
10

目前,在SymPy中没有办法完全按照输入的样子打印内容,因为这些信息根本没有被保存下来。

我认为在乘法运算中,符号是按字母顺序排列的,大写字母排在小写字母前面(基本上就是按照ord的顺序)。我想到的一个好办法是使用latex中的symbol_names选项,这样可以改变符号在LaTeX表示中的名称。不过,排列顺序还是基于原始符号的名称,所以你可以通过这种方式来“欺骗”它:

>>> from sympy.abc import epsilon, omega, t
>>> latex(epsilon*sigma*t**4, symbol_names={t:"T"})
\epsilon \sigma T^{4}

如果你想让这个在笔记本中漂亮地打印出来,你需要写一个自定义的打印扩展版本,把你的symbol_names字典传递给latex。可以参考这个链接:https://github.com/sympy/sympy/blob/master/sympy/interactive/printing.py(理想情况下,我们可以直接把latex选项传给init_printing,我会在SymPy的bug追踪器上提出这个问题)。

撰写回答