
In der wissenschaftlichen Gemeinschaft spielen Datenvisualisierung und theoretisches Design eine sehr wichtige Rolle. Tools, die LaTeX- Befehle implementieren, wie Markdown und MathJax, werden häufig für die bequeme und schöne Darstellung von Formeln verwendet.
Für Julia gibt es auch eine Reihe von Paketen, mit denen Sie die LaTeX- Syntax verwenden können. In Verbindung mit den Mitteln der symbolischen Algebra erhalten wir ein leistungsstarkes Werkzeug für die Handhabung von Formeln.
Laden Sie alles herunter und verbinden Sie es, was Sie heute brauchen
using Pkg Pkg.add("Latexify") Pkg.add("LaTeXStrings") Pkg.add("SymEngine") using Latexify, LaTeXStrings, Plots, SymEngine
LaTeXStrings
LaTeXStrings ist ein kleines Paket, mit dem LaTeX-Gleichungen einfach in Julia-String-Literale eingegeben werden können. Wenn Sie in Julia reguläre Zeichenfolgen verwenden, um ein Zeichenfolgenliteral mit eingebetteten LaTeX-Gleichungen einzugeben, müssen Sie alle umgekehrten Schrägstriche und Dollarzeichen manuell vermeiden: Beispielsweise wird $ \alpha^2 $
\$\\alpha^2\$
. Obwohl IJulia LaTeX-formatierte Gleichungen (über MathJax ) anzeigen kann, funktioniert dies nicht mit regulären Linien. Daher definiert das LaTeXStrings-Paket:
- Die
LaTeXString
Klasse (ein Subtyp von String
), die wie ein String funktioniert (zum Indizieren, Konvertieren usw.), in IJulia jedoch automatisch als Text / Latex angezeigt wird. - String-Makros
L"..."
und L"""..."""
denen Sie LaTeX-Gleichungen eingeben können, ohne sich von Backslashes und Dollarzeichen zu lösen (und die Dollarzeichen für Sie hinzufügen, wenn Sie sie weglassen).
S = L"1 + \alpha^2"
Die REPL gibt Folgendes aus :
"\$1 + \\alpha^2\$"
und Jupyter wird Folgendes anzeigen:
Die Indizierung funktioniert wie normale Zeilen:
S[4:7] "+ \\a"
Solche Linien können beim Entwerfen von Diagrammen nützlich sein.
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")

Latexifizieren
Ein funktionaleres Paket ist Latexify ( Guide ). Es wurde entwickelt, um LaTeX-Mathematik aus Julia-Objekten zu generieren. Dieses Paket verwendet Julias Homologie, um Ausdrücke in Zeichenfolgen im LaTeX-Format zu konvertieren. Latexify.jl bietet Funktionen zum Konvertieren einer Reihe verschiedener Julia-Objekte, darunter:
- Ausdrücke
- Saiten
- Zahlen (einschließlich rational und komplex),
- Symbolische Ausdrücke aus SymEngine.jl,
- Parametrisierte Funktionen und Reaktionsnetzwerke aus DifferentialEquations.jl
sowie Arrays aller unterstützten Typen.
ex = :(x/(y+x)^2)
str = "x/(2*k_1+x^2)"
Array heterogener Elemente:
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]
Sie können eine Funktion angeben, die Formeln anzeigt und sie in der für Habr verständlichen Form in den Puffer kopiert:
function habr(formula) l = latexify(formula) res = "\$\$display\$$l\$display\$\$\n" clipboard(res) return l end habr(ex)
<p>$<!-- math>$$display$$\frac{x}{\left( y + x \right)^{2}}$$display$$</math -->$</p>
Denken Sie daran
latexify("x/y") |> display
latexify("x/y") |> print
$\frac{x}{y}$
Symengine
SymEngine ist ein Paket, das symbolische Berechnungen bereitstellt, die Sie in Ihrem Jupyter mit Latexify visualisieren können.
Sie können Zeichen in Zeilen und Anführungszeichen ( quote
) angeben:
julia> a=symbols(:a); b=symbols(:b) b julia> a,b = symbols("ab") (a, b) julia> @vars ab (a, b)
Definieren Sie die Matrix und zeigen Sie sie schön an
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]
Angenommen, wir haben Vektoren
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
die vektor-multipliziert werden muss
using LinearAlgebra × = cross latexify(J×h, transpose = true)
$$ Anzeige $$ \ begin {Gleichung} \ left [\ begin {Array} {c} J_ {y} \ cdot h_ {z} \\ - J_ {x} \ cdot h_ {z} \\ 0 \\ \ Ende {Array} \ rechts] \ Ende {Gleichung} $$ Anzeige $$
Vollmatrixberechnungen:
dJ = C*(u*J.^3)×h latexify( dJ, transpose = true) habr(ans)
$$ Anzeige $$ \ begin {Gleichung} \ 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} \ rechts) \ cdot \ Omega_ {b}} {\ Omega_ {l}} \\ 0 \\ \ Ende {Array} \ rechts] \ Ende {Gleichung} $$ Anzeige $$
aber mit einer so einfachen Kette können Sie die Determinante finden und an Habr senden
u |> det |> habr
Rekursiv! Die inverse Matrix wird wahrscheinlich auf ähnliche Weise berechnet:
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) } \ rechts) \ cdot \ links (u_ {23} - \ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \ rechts)} {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}}}} rechts)} {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}} \ rechts)}} {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}} \ rechts)} {\ links (u_ {22} - \ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \ rechts) \ cdot \ links (u_ {33} - \ frac {u_ {13} \ cdot u_ {31}} {u_ {11}} - \ frac {\ left (u_ {23} - \ frac {u_ {13} \ cdot u_ {21 }} {u_ {11}} \ rechts) \ cdot \ links (u_ {32} - \ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \ rechts)} {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 Punkt \ links (u_ {32} - \ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \ rechts)} {u_ {22} - \ frac {u_ {12} \ cdot u_ { 21}} {u_ {11}}} \ right) ^ {- 1} \\ \ end {array} \ right] $$ display $$
Wenn Sie Matjax in Ihrem Browser verletzen möchten, setzen Sie minus den zweiten Grad (das Quadrat der inversen Matrix).
SymEngine berücksichtigt übrigens Derivate:
dJ[1] |> habr
diff(dJ[1], J[1]) |> habr
Julia kann übrigens nicht nur Formeln verwenden, sondern auch Grafiken von LaTeX 'a. Wenn Sie MikTex installiert und pgfplots bereits heruntergeladen haben , können Sie sich in der entsprechenden Umgebung mit Julia anfreunden, um Histogramme, dreidimensionale Diagramme, Fehler und Reliefs mit Konturen zu erstellen und diese dann in das LaTeX-Dokument zu integrieren.
Das ist alles mit Formeln, aber nicht mit symbolischen Berechnungen: Julia hat noch komplexere und interessantere Lösungen für die symbolische Algebra, mit denen wir uns beim nächsten Mal definitiv befassen werden.