Python 如何更紧凑地打印导数(下标符号)
目前,我对Symphy的输出有点纠结。默认情况下,通过执行以下操作(假设使用Jupyter笔记本): 它打印 然而,我想要这样的 为了增加可读性。有人知道如何做到这一点吗?我是SymPy的新手,非常希望得到这个输出 期待您的回答 编辑1: 我采纳了@smichr的建议,对其进行了一些调整,并将其写入了一个函数中。希望我涵盖了所有重要的事情。下面是函数Python 如何更紧凑地打印导数(下标符号),python,printing,latex,output,sympy,Python,Printing,Latex,Output,Sympy,目前,我对Symphy的输出有点纠结。默认情况下,通过执行以下操作(假设使用Jupyter笔记本): 它打印 然而,我想要这样的 为了增加可读性。有人知道如何做到这一点吗?我是SymPy的新手,非常希望得到这个输出 期待您的回答 编辑1: 我采纳了@smichr的建议,对其进行了一些调整,并将其写入了一个函数中。希望我涵盖了所有重要的事情。下面是函数 # Assuming that symbols and functions with greek letters are defined li
# Assuming that symbols and functions with greek letters are defined like this
# omega = Function('\\omega')(t, x)
def show(expr):
functions = expr.atoms(Function)
reps = {}
for fun in functions:
# Consider the case that some functions won't have the name
# attribute e.g. Abs of an elementary function
try:
reps[fun] = Symbol(fun.name) # Otherwise functions with greek symbols aren't replaced
except AttributeError:
continue
dreps = [(deriv, Symbol(deriv.expr.subs(reps).name + "_{," +
''.join(par.name for par in deriv.variables) + "}")) \
for deriv in expr.atoms(Derivative)]
# Ensure that higher order derivatives are replaced first, then lower ones.
# Otherwise you get d/dr w_r instead of w_rr
dreps.sort(key=lambda x: len(x[0].variables), reverse=True)
output = expr.subs(dreps).subs(reps)
display(output)
zeta, eta = symbols('\\zeta \\eta')
psi = Function('\\psi')(zeta, eta)
eq = Eq(I*psi.diff(zeta) + psi.diff(eta, eta) + abs(psi)**2*psi, 0)
show(eq)
显示
导数(与所有Symphy对象一样)有参数(有时命名),您可以使用这些参数做任何对您有用的事情。在这种情况下,看起来您需要用字母替换函数,并将派生变量替换为复合符号。下面是一个可以根据需要进行调整的尝试:
>>> reps={u:'u'}
>>> dreps = [(i,i.expr.subs(reps).name+"_"+''.join(v.name for v in i.variables)
for i in eq.atoms(Derivative)]
>>> eq.subs(dreps).subs(reps)
u*Abs(u)**2 + I*u_t + u_xx
但是,获取它们是特定的顺序,需要更改关联的打印机。例如,请参见。谢谢您的回复!我确实检查了你的程序,并进行了测试。我也想用逗号来表示偏导数(因为我可以用张量)。我修改了您的行,使dreps在本例中输出
(导数(u(t,x),t),'u{,t}')
,而不是(导数(u(t,x),t),'u_t')
。然而,SymPy现在打印了一个带有全微分的方程。我想我可以禁用这种行为?对不起,我不知道你说的“禁用”是什么意思。你在看什么,你不想看什么?我的想法是用逗号作为下标来表示偏微分。然而,我的问题是dreps
没有排序,而且sympify
不支持逗号字符subscript。我解决了这个问题。请看一下我的主要帖子的编辑。我根据你的想法写了一个函数,应该涵盖大多数情况。不过,非常感谢您的启发!:-)看起来不错。我打算建议使用Symbo而不是纯字符串。(我几乎从不使用字符串,但我从你的帖子中得到了提示。)我希望其他人发现你的函数有用。
>>> reps={u:'u'}
>>> dreps = [(i,i.expr.subs(reps).name+"_"+''.join(v.name for v in i.variables)
for i in eq.atoms(Derivative)]
>>> eq.subs(dreps).subs(reps)
u*Abs(u)**2 + I*u_t + u_xx