📜 ⬆️ ⬇️

Julia in latex


In the scientific community, data visualization and theory design play a very important role. For convenient and beautiful presentation of formulas, tools that implement LaTeX -commands, such as Markdown and MathJax, are often used.


For Julia, there is also a set of packages that allows you to use the syntax LaTeX 'a, and in conjunction with the means of symbolic algebra, we get a powerful tool for operating formulas.


Download and connect everything you need for today


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

LaTeXStrings


LaTeXStrings is a small package that makes it easy to enter LaTeX equations in string literals in the Julia language. When using ordinary strings in Julia, to enter a string literal with embedded LaTeX equations, you must manually avoid all backslashes and dollar signs: for example, $ \alpha^2 $ is written \$\\alpha^2\$ . In addition, although IJulia is capable of displaying LaTeX formatted equations (via MathJax ), this will not work with regular strings. Therefore, the LaTeXStrings package defines:



 S = L"1 + \alpha^2" 

The REPL will be released:


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

and Jupyter will display:


1+ alpha2


Indexing works like normal strings:


 S[4:7] "+ \\a" 

Such lines can be useful in the design of graphs.


 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


A more functional package is Latexify ( Guide ). It is designed to generate LaTeX mathematics from julia objects. This package uses Julia's homology to convert expressions to strings in the LaTeX format. Latexify.jl provides functions for converting a number of different Julia objects, including:



 ex = :(x/(y+x)^2) #  latexify(ex) 

 fracx left(y+x right)2


 str = "x/(2*k_1+x^2)" #  latexify(str) 

 fracx2 cdotk1+x2


An array of different types of elements:


 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]


You can set a function that displays formulas and copies them to the buffer in a format understandable to Habr:


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

 fracx left(y+x right)2


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

It should be borne in mind


 latexify("x/y") |> display 

 fracxy


 latexify("x/y") |> print 

$\frac{x}{y}$


SymEngine


SymEngine is a package that provides symbolic calculations that can be visualized in your Jupyter using Latexify.
You can set characters by strings and quotes ( quote ):


 julia> a=symbols(:a); b=symbols(:b) b julia> a,b = symbols("ab") (a, b) julia> @vars ab (a, b) 

Set the matrix and display it beautifully.


 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]


Suppose we have a vector


 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 

which should be multiplied vectorially


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


Full matrix calculations:


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


but with such a simple chain you can find a determinant and send it to Habr


 u |> det |> habr 

u11 cdot left(u22 fracu12 cdotu21u11 right) cdot left(u33 fracu13 cdotu31u11 frac left(u23 fracu13 cdotu21u11 right) cdot left(u32 fracu12 cdotu31u11 right)u22 fracu12 cdotu21u11 right)


Recursive! The inverse matrix is ​​likely to be calculated in a similar way:


 u^-1 |> habr 

Spoiler

$$ 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}}} \ rig ht)}} {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) \ c dot \ 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 $$


If you want to hurt your browser Matjack, put a minus second degree (square of the inverse matrix)
By the way, SymEngine considers derivatives:


 dJ[1] |> habr 

 frachz cdot left(u21 cdotJx3+u22 cdotJy3+u23 cdotJz3 right) cdot Omegab Omegal


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

 frac3 cdotJx2 cdothz cdotu21 cdot Omegab Omegal


By the way, Julia can use not only formulas from LaTeX 'a, but also graphs . And if you have installed MikTex and have already downloaded pgfplots , then using the appropriate environment you can make friends with Julia, which will make it possible to build histograms, three-dimensional graphics, errors and reliefs with isolines, and then integrate it into the LaTeX document.


This is all with the formulas, but not with symbolic calculations: Julia still has more complex and interesting solutions for symbolic algebra, with which we will definitely look at it next time.


')

Source: https://habr.com/ru/post/448096/


All Articles