ラテックスのジュリア







科学界では、データの視覚化と理論設計が非常に重要な役割を果たします。 MarkdownやMathJaxなどのLaTeXコマンドを実装するツールは、数式の便利で美しい表示によく使用されます。







Juliaには、 LaTeXの構文を使用できるパッケージのセットもあり、シンボリック代数の手段と組み合わせて、数式を処理するための強力なツールを取得します。







今日必要なものをすべてダウンロードして接続する



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





LaTeXStrings



LaTeXStringsは、 Julia文字列リテラルにLaTeX方程式を簡単に入力できるようにする小さなパッケージです。 Juliaで通常の文字列を使用してLaTeX方程式が埋め込まれた文字列リテラルを入力する場合、すべてのバックスラッシュとドル記号を手動で回避する必要があります。たとえば、 $ \alpha^2 $



\$\\alpha^2\$



と記述されます。 さらに、IJuliaは( MathJaxを介して)LaTeX形式の方程式を表示できますが、これは通常の行では機能しません。 したがって、LaTeXStringsパッケージは以下を定義します。









 S = L"1 + \alpha^2"
      
      





REPLは次を出力します







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





Jupyterは以下を表示します:











1+ alpha2







インデックスは通常の行のように機能します。







 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")
      
      











ラテックス化



より機能的なパッケージはLatexifyGuide )です。 juliaオブジェクトからLaTeX数学を生成するように設計されています。 このパッケージは、ジュリアの相同性を使用して、式をLaTeX形式の文字列に変換します。 Latexify.jlは、次のようなさまざまなJuliaオブジェクトを変換するための関数を提供します。









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









 fracx lefty+x right2







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









 fracx2 cdotk1+x2







異種要素の配列:







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









 left[ beginarrayccc frac23ec cdott1+3 textiti fracxx+k1\ガ\左n\右 log10\左x\右 endarray\右]







数式を表示し、Habrが理解できる形式でバッファーにコピーする関数を指定できます。







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









 fracx lefty+x right2







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





覚えておいてください







 latexify("x/y") |> display
      
      









 fracxy







 latexify("x/y") |> print
      
      





$\frac{x}{y}$









Symengine



SymEngineは、Latexifyを使用してJupyterで視覚化できるシンボリック計算を提供するパッケージです。

行と引用符で文字を指定できます( quote



):







 julia> a=symbols(:a); b=symbols(:b) b julia> a,b = symbols("ab") (a, b) julia> @vars ab (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[ beginarraycccu11u12u13u21u22u23u31u32u33 endarray 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} $$表示$$







完全なマトリックス計算:







 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} \右)\ 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} \右)\ cdot \ Omega_ {b}} {\ Omega_ {l}} \\ 0 \\ \ end {array} \ right] \ end {equation} $$ display $$







ここでは、このような単純なチェーンを使用して、行列式を見つけてHabrに送信できます。







 u |> det |> habr
      
      









u11 cdot leftu22 fracu12 cdotu21u11 right cdot leftu33 fracu13 cdotu31u11 frac leftu23 fracu13 cdotu21u11\右 cdot\左u32 fracu12 cdotu31u11\右u22 fracu12 cdotu21u11\右







再帰的! 逆行列はおそらく同様の方法で計算されます:







 u^-1 |> habr
      
      





ネタバレ

$$表示$$ \左[\ 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}} \右)} {u_ {11} \ cdot \左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右) } \右)\ cdot \左(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)} {u_ {33}-\ frac {u_ {13 } \ cdot u_ {31}} {u_ {11}}-\ frac {\ left(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \ right)\ cdot \左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} {u_ {22}-\ frac {u_ {12} \ cdot u_ { 21}} {u_ {11}}}}右)} {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}} \右)} {u_ {11} \ cdot \左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右) } \右)} {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}} \右)} {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}} \右)} {u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} } \右)} \右)} {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}} \右)\ cdot \左(u_ {33}-\ frac {u_ {13} \ cdot u_ {31}} {u_ {11}}-\ frac {\左(u_ {23 }-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \ right)\ cdot \ left(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} { u_ {11}} \右)} {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}} \右)} {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}} \右)} {u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}}} \右)} } {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)\右)\ cdot \ left(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)} {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}} \右)} {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}} \右)\ cdot \左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} { \左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右)\ cdot \左(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}} \右)} {u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}}} \右)}} {u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}}}&\ frac {-\左(u_ {23 }-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \ right)} {\ left(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} { u_ {11}} \右)\ 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}} \右)} {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}} \右)} {u_ {11} \ cdot \左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右)}} {u_ {33}-\ frac {u_ {13} \ cdot u_ {31}} {u_ {11}}-\ frac {\ left(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)\ cdot \左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} { u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}}}}&\ frac {-\左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} {\左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右)\ cdot \左(u_ {33}-\ frac {u_ {13} \ cdot u_ {31}} {u_ {11}}-\ frac {\ left(u_ {23}-\ frac {u_ {13} \ cdot u_ {21 }} {u_ {11}} \右)\ cdot \左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} {u_ {22} -\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}}} \ right)}&\ left(u_ {33}-\ frac {u_ {13} \ cdot u_ {31}} { u_ {11}}-\ frac {\左(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)\ c ドット\左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右)} {u_ {22}-\ frac {u_ {12} \ cdot u_ { 21}} {u_ {11}}} \ right)^ {-1} \\ \ end {array} \ right] $$表示$$







ブラウザでMatjaxを傷つけたい場合は、マイナス2次(逆行列の2乗)を入れます

ところで、SymEngineは派生物を考慮します:







 dJ[1] |> habr
      
      









 frachz cdot leftu21 cdotJ3x+u22 cdotJ3y+u23 cdotJ3z\右 cdot Omegab Omegal







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









 frac3 cdotJ2x cdothz cdotu21 cdot Omegab Omegal







ちなみに、ジュリアは数式だけでなく、LaTeX 'aのグラフィックも使用できます。 また、 MikTexをインストールしてpgfplotsを既にダウンロードしている場合は、適切な環境を使用して、ジュリアと友達になれます。これにより、ヒストグラム、3次元グラフ、エラーのある輪郭を作成し、LaTeXドキュメントに統合することができます。







それはすべて数式であり、シンボリック計算ではありません。ジュリアには、シンボリック代数のより複雑で興味深い解決策がまだあります。








All Articles