как печатать производные более компактно (нижняя запись) - PullRequest
0 голосов
/ 23 апреля 2020

В настоящее время я немного борюсь с выходом из 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))

он печатает

Default output

Я хочу получить это так, однако

Desired output

для повышения читабельности. Кто-нибудь знает, как этого добиться? Я довольно новичок в SymPy и очень хотел бы получить этот вывод.

Жду ваших ответов!

EDIT1:

Я принял предложения @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)

, которая показывает Edited functiuons output

1 Ответ

1 голос
/ 23 апреля 2020

Производное (как и все объекты 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

Получение их - это определенный порядок, однако, требуется изменить соответствующий принтер. См., Например, здесь .

...