防止Sympy重新排列方程
也许我忽略了一些明显的东西,但我该如何防止sympy重新排列方程呢?
我在iPython笔记本中使用Sympy,这样我可以方便地把Latex代码复制粘贴到Lyx中,但我希望方程能保持我定义时的顺序。
比如,灰体辐射的公式是温度的函数:
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追踪器上提出这个问题)。