Python 如何更紧凑地打印导数(下标符号)

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

目前,我对Symphy的输出有点纠结。默认情况下,通过执行以下操作(假设使用Jupyter笔记本):

它打印

然而,我想要这样的

为了增加可读性。有人知道如何做到这一点吗?我是SymPy的新手,非常希望得到这个输出

期待您的回答

编辑1: 我采纳了@smichr的建议,对其进行了一些调整,并将其写入了一个函数中。希望我涵盖了所有重要的事情。下面是函数

# 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