Джулия в латексе

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


В научной среде очень важную роль играет визуализация данных и оформление теории. Для удобного и красивого представления формул часто используются инструменты реализующие LaTeX-команды, например Markdown и MathJax.


Для Джулии также существует набор пакетов позволяющих использовать синтаксис LaTeX 'a, а в связке с средствами символьной алгебры мы получаем мощный инструмент для оперирования формулами.


Скачиваем и подключаем всё что нужно на сегодня


using Pkg
Pkg.add("Latexify")
Pkg.add("LaTeXStrings")
Pkg.add("SymEngine")

using Latexify, LaTeXStrings, Plots, SymEngine

LaTeXStrings


LaTeXStrings небольшой пакет, облегчающий ввод уравнений LaTeX в строковых литералах на языке Julia. При использовании обычных строк в Julia для ввода строкового литерала со встроенными уравнениями LaTeX необходимо вручную избегать всех обратных слешей и знаков доллара: например, $ \alpha^2 $ пишется \$\\alpha^2\$. Кроме того, хотя IJulia способна отображать отформатированные уравнения LaTeX (через MathJax), с обычными строками такое не сработает. Посему, пакет LaTeXStrings определяет:


  • Класс LaTeXString (подтип String), который работает как строка (для индексации, преобразования и т. д.), Но автоматически отображается как текст / латекс в IJulia.
  • Строковые макросы L"..." и L"""...""", которые позволяют вводить уравнения LaTeX без экранирования от обратной косой черты и знаков доллара (и которые добавляют для вас знаки доллара, если вы их опускаете).

S = L"1 + \alpha^2"

В REPL выйдет:


"\$1 + \\alpha^2\$"

а Jupyter отобразит:


$ 1 + \alpha^2$


Индексация работает как с обычными строками:


S[4:7]

"+ \\a"

Такие строки могут быть полезны при оформлении графиков


x = [-3:0.1:3...]
y1 = x .^2
α = 10
y2 = x .^4 / α;

plot(x,y1, lab = "\$x^2_i\$")
plot!(x,y2, lab = L"x^4_i/\alpha")


Latexify


Более функциональным пакетом является Latexify (Руководство). Он предназначен для генерации математики LaTeX из объектов julia. Этот пакет использует гомологичность Джулии для преобразования выражений в строки в формате LaTeX. Latexify.jl предоставляет функции для преобразования ряда различных объектов Julia, в том числе:


  • Выражения,
  • Строки,
  • Numbers (включая рациональные и комплексные),
  • Символические выражения из SymEngine.jl,
  • ParameterizedFunctions и ReactionNetworks из DifferentialEquations.jl
    а также массивы всех поддерживаемых типов.

ex = :(x/(y+x)^2) # выражение
latexify(ex)

$ \frac{x}{\left( y + x \right)^{2}}$


str = "x/(2*k_1+x^2)" # строка
latexify(str)

$\frac{x}{2 \cdot k_{1} + x^{2}}$


Массив разнотипных элементов:


m = [2//3 "e^(-c*t)" 1+3im; :(x/(x+k_1)) "gamma(n)" :(log10(x))]
latexify(m)

$ \left[ \begin{array}{ccc} \frac{2}{3} & e^{ - c \cdot t} & 1+3\textit{i} \\ \frac{x}{x + k_{1}} & \Gamma\left( n \right) & \log_{10}\left( x \right) \\ \end{array} \right] $


Можно задать функцию выводящую формулы и копирующую их в буфер в виде понятном для Хабра:


function habr(formula)
    l = latexify(formula)
    res = "\$\$display\$$l\$display\$\$\n"
    clipboard(res)
    return l
end

habr(ex)

$\frac{x}{\left( y + x \right)^{2}}$


<p>$<!-- math>$$display$$\frac{x}{\left( y + x \right)^{2}}$$display$$</math -->$</p>

Следует иметь ввиду


latexify("x/y") |> display

$\frac{x}{y}$


latexify("x/y") |> print

$\frac{x}{y}$


SymEngine


SymEngine — пакет предоставляющий символьные вычисления, которые можно визуализировать в вашем Jupyter с помощью Latexify.
Можно задавать символы строками и котировками (quote):


julia> a=symbols(:a); b=symbols(:b)
b

julia> a,b = symbols("a b")
(a, b)

julia> @vars a b
(a, b)

Зададим матрицу и красиво отобразим ее


u = [symbols("u_$i$j") for i in 1:3, j in 1:3]

3×3 Array{Basic,2}:
 u_11  u_12  u_13
 u_21  u_22  u_23
 u_31  u_32  u_33

u |> habr

$ \left[ \begin{array}{ccc} u_{11} & u_{12} & u_{13} \\ u_{21} & u_{22} & u_{23} \\ u_{31} & u_{32} & u_{33} \\ \end{array} \right] $


Предположим у нас вектора


C = symbols("Ω_b/Ω_l")
J  = [symbols("J_$i") for i in ['x','y','z'] ]
h  = [0, 0, symbols("h_z")]

3-element Array{Basic,1}:
   0
   0
 h_z

которые надо векторно помножить


using LinearAlgebra
× = cross

latexify(J×h, transpose = true)

$$display$$\begin{equation} \left[ \begin{array}{c} J_{y} \cdot h_{z} \\ - J_{x} \cdot h_{z} \\ 0 \\ \end{array} \right] \end{equation} $$display$$


Полноценные матричные вычисления:


dJ = C*(u*J.^3)×h
latexify( dJ, transpose = true)
habr(ans)

$$display$$\begin{equation} \left[ \begin{array}{c} \frac{h_{z} \cdot \left( u_{21} \cdot J_{x}^{3} + u_{22} \cdot J_{y}^{3} + u_{23} \cdot J_{z}^{3} \right) \cdot \Omega_{b}}{\Omega_{l}} \\ \frac{ - h_{z} \cdot \left( u_{11} \cdot J_{x}^{3} + u_{12} \cdot J_{y}^{3} + u_{13} \cdot J_{z}^{3} \right) \cdot \Omega_{b}}{\Omega_{l}} \\ 0 \\ \end{array} \right] \end{equation} $$display$$


а вот такой нехитрой цепочкой можно найти детерминант и отправить его на Хабр


u |> det |> habr

$u_{11} \cdot \left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)$


Рекурсивненько! Обратная матрица наверно посчитается сходным образом:


u^-1 |> habr

Спойлер

$$display$$ \left[ \begin{array}{ccc} \frac{1 - \frac{u_{12} \cdot \left( \frac{ - u_{21}}{u_{11}} - \frac{\left( \frac{ - u_{31}}{u_{11}} + \frac{u_{21} \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{11} \cdot \left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right)} \right) \cdot \left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right)}{u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} - \frac{u_{13} \cdot \left( \frac{ - u_{31}}{u_{11}} + \frac{u_{21} \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{11} \cdot \left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right)} \right)}{u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}}}}{u_{11}} & \frac{\frac{ - u_{12} \cdot \left( 1 + \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} + \frac{u_{13} \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)}}{u_{11}} & \frac{\frac{ - u_{13}}{u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}}} + \frac{u_{12} \cdot \left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)}}{u_{11}} \\ \frac{\frac{ - u_{21}}{u_{11}} - \frac{\left( \frac{ - u_{31}}{u_{11}} + \frac{u_{21} \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{11} \cdot \left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right)} \right) \cdot \left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right)}{u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}}}}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} & \frac{1 + \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)}}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} & \frac{ - \left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)} \\ \frac{\frac{ - u_{31}}{u_{11}} + \frac{u_{21} \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{11} \cdot \left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right)}}{u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}}} & \frac{ - \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{\left( u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)} & \left( u_{33} - \frac{u_{13} \cdot u_{31}}{u_{11}} - \frac{\left( u_{23} - \frac{u_{13} \cdot u_{21}}{u_{11}} \right) \cdot \left( u_{32} - \frac{u_{12} \cdot u_{31}}{u_{11}} \right)}{u_{22} - \frac{u_{12} \cdot u_{21}}{u_{11}}} \right)^{-1} \\ \end{array} \right] $$display$$


Если хотите сделать больно Матжаксу своего браузера, поставьте минус вторую степень (квадрат обратной матрицы)
Кстати, SymEngine считает производные:


dJ[1] |> habr

$\frac{h_{z} \cdot \left( u_{21} \cdot J_{x}^{3} + u_{22} \cdot J_{y}^{3} + u_{23} \cdot J_{z}^{3} \right) \cdot \Omega_{b}}{\Omega_{l}}$


diff(dJ[1], J[1]) |> habr

$\frac{3 \cdot J_{x}^{2} \cdot h_{z} \cdot u_{21} \cdot \Omega_{b}}{\Omega_{l}}$


К слову, Джулия может использовать из LaTeX 'a не только формулы, но и графики. И если вы установили MikTex и уже скачали pgfplots, то с помощью соответствующего окружения его можно сдружить с Джулией, что предоставит возможность строить гистограммы, трехмерные графики, ошибки и рельефы с изолиниями, а потом это интегрировать в LaTeX документ.


На этом с формулами всё, но не с символьными вычислениями: у Джулии еще есть более сложные и интересные решения для символьной алгебры, с которыми мы обязательно разберемся как-нибудь в следующий раз.

Источник: https://habr.com/ru/post/448096/


Интересные статьи

Интересные статьи

Приветствую вас (лично вас, а не всех кто это читает)! Сегодня мы: Создадим приложение (навык) Алисы с использованием нового (октябрь 2019) сервиса Yandex Cloud Functions. Настроим н...
1С Битрикс: Управление сайтом (БУС) - CMS №1 в России по версии портала “Рейтинг Рунета” за 2018 год. На рынке c 2003 года. За это время БУС не стоял на месте, обрастал новой функциональностью...
Если вы последние лет десять следите за обновлениями «коробочной версии» Битрикса (не 24), то давно уже заметили, что обновляется только модуль магазина и его окружение. Все остальные модули как ...
Один из самых острых вопросов при разработке на Битрикс - это миграции базы данных. Какие же способы облегчить эту задачу есть на данный момент?
Практически все коммерческие интернет-ресурсы создаются на уникальных платформах соответствующего типа. Среди них наибольшее распространение получил Битрикс24.