【发布时间】:2020-08-06 16:28:35
【问题描述】:
目前,我对 SymPy 的输出有点吃力。默认情况下,通过执行以下操作(假设使用 Jupyter Notebook):
from sympy import *
t, x = symbols('t x')
u = Function('u')(t, x)
display(Eq(I*u.diff(t) + u.diff(x,x) + abs(u)**2*u))
打印出来
我想要这样,但是
为了增加可读性。有谁知道如何实现这一目标?我对 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)
【问题讨论】:
标签: python printing latex output sympy