2016-11-19 3 views
1

Я пытаюсь сделать некоторые символические вычисления в SymPy, но я не могу использовать латексную печать и получить графический вывод, который я хочу. Это меня всегда беспокоило и провело несколько часов (возможно, дней), пытаясь улучшить способ настройки печати объектов (в LaTeX, в представлении pprint это хорошо документировано).SymPy print только имя функции

Однако в этом случае я пытаюсь сделать символические вычисления на неопределенной функции psi, которая зависит от x, y, z. Однако эти расчеты подразумевают термины, которые имеют до трех раз завихрение psi * \ vec r.

У меня есть следующий код

init_printing(use_latex=True) 

R = ReferenceFrame(r"E", variables=["x", "y", "z"]) 
psi = Function(r"\psi")(R[0], R[1], R[2]) 
rpsi = (R[0]*R.x + R[1]*R.y + R[2]*R.z)*psi 

Где, в случае, если вы не знакомы с ним, R[i] это я-й переменной (х, у, г) и R.x, R.y и R.z являются унитарные декартовы векторы, созданные в вызове ReferenceFrame (функция от sympy.physics).

Например, если я попытаюсь взглянуть на curl(curl(rpsi, R), R), выход так заполнен «\ psi (x, y, z)» (скомпилирован в латекс и показан как изображение), что утомительно следить за выражение.

Есть ли способ настроить латексную строку, которая скомпилируется (что применимо к другим вычислениям, которые я делаю). Если это невозможно, как решить эту конкретную проблему (то есть независимо от переменных, отображаемых каждый раз при печати функции).

Я использую jupyter с qtconsole.

Приветствия,

ответ

1

Самый простой способ будет создать пользовательскую функцию, которая печатает, как вы хотите. Вы можете добиться этого путем подкласса Function и определения _latex (см. http://docs.sympy.org/latest/modules/printing.html#sympy.printing.latex.LatexPrinter.printmethod).

In [33]: class psi(Function): 
    ....:  def _latex(self, printer): 
    ....:   return r'\psi' 
    ....: 

In [34]: latex(psi(x, y, z)) 
Out[34]: '\\psi' 

Если вы хотите напечатать аргументы, получить доступ к ним с self.args и использовать printer._print (например, обычный принтер будет что-то вроде r'\phi{\left (' + ', '.join(printer._print(i) for i in self.args) + '\right)}').

+0

Большое спасибо. Я знал, что это не может быть так сложно, но через несколько часов в документации и исходном коде я не смог этого сделать. – Sabian

+0

Нам действительно нужны лучшие документы для написания пользовательских принтеров. – asmeurer

Смежные вопросы