【问题标题】:how to print derivatives more compactly (subscript notation)如何更紧凑地打印导数(下标符号)
【发布时间】: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


    【解决方案1】:

    导数(像所有 SymPy 对象一样)有参数——有时被命名——你可以用那些对你有用的东西来做。在这种情况下,它看起来像用字母替换函数,而作为复合符号的导数变量就是你想要的。这是一个可以根据需要进行调整的尝试:

    >>> 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
    

    获取它们是一个特定的顺序,但是,需要更改关联的打印机。例如,请参阅here

    【讨论】:

    • 感谢您的回复!我确实检查了您的程序并进行了测试。我也想拥有逗号,表示偏导数(因为我可能会使用张量)。我修改了您的行,以便在这种情况下输出 (Derivative(u(t, x), t), 'u_{,t}') 而不是 (Derivative(u(t, x), t), 'u_t')。然而,SymPy 现在打印出具有总微分的方程。我想我可以以某种方式禁用此行为?
    • 抱歉,我不确定您所说的“禁用”是什么意思。你在看什么,不想看什么?
    • 我的想法是用逗号作为下标来表示偏微分。尽管如此,我的问题是dreps 没有排序,并且sympify 不支持逗号字符subsript。我解决了这个问题。请看一下我的主要帖子的编辑。我根据您的想法编写了一个函数,它应该涵盖大多数情况。不过,非常感谢您的启发!
    • :-) 看起来不错。我打算建议使用 Symbo 而不是纯字符串。 (我几乎从不使用字符串,但从你的帖子中得到了启发。)我希望其他人发现你的函数很有用。
    猜你喜欢
    • 2021-02-15
    • 2022-07-18
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多