جوليا في اللاتكس


في الأوساط العلمية ، يلعب تصور البيانات وتصميم النظريات دورًا مهمًا للغاية. غالبًا ما يتم استخدام الأدوات التي تنفذ أوامر LaTeX ، مثل Markdown و MathJax ، في تقديم صيغ مريحة وجميلة للصيغ.


بالنسبة لجوليا ، هناك أيضًا مجموعة من الحزم تتيح لك استخدام بناء جملة LaTeX ، وبالتزامن مع وسائل الجبر الرمزي ، نحصل على أداة قوية للتعامل مع الصيغ.


قم بتنزيل وربط كل ما تحتاجه لهذا اليوم


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

LaTeXStrings


LaTeXStrings عبارة عن حزمة صغيرة تسهل إدخال معادلات LaTeX بأحرف سلسلة جوليا الحرفية. عند استخدام سلاسل منتظمة في 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 سيعرض:



تعمل الفهرسة مثل الخطوط العادية:


 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. يوفر Latexify.jl وظائف لتحويل عدد من كائنات جوليا المختلفة ، بما في ذلك:


  • التعبيرات
  • الخط،
  • الأرقام (بما في ذلك العقلانية والمعقدة) ،
  • التعبيرات الرمزية من SymEngine.jl ،
  • ParameterizedFunctions و ReactionNetworks من DifferentialEquations.jl
    وكذلك صفائف من جميع الأنواع المدعومة.

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


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


مجموعة من العناصر غير المتجانسة:


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

\ left [\ start {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]


يمكنك تعيين الوظيفة لعرض الصيغ ونسخها إلى المخزن المؤقت في النموذج الذي يمكن فهمه لـ Habr:


 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> 

ضع في اعتبارك


 latexify("x/y") |> display 


 latexify("x/y") |> print 

$\frac{x}{y}$


SymEngine


SymEngine هي حزمة توفر حسابات رمزية يمكنك تصورها في Jupyter باستخدام Latexify.
يمكنك تحديد الحروف في السطور والاقتباسات ( 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 [\ start {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) 

عرض $$ $$ \ بداية {المعادلة} \ اليسار [\ بدء {صفيف} {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) 

عرض $$ $$ \ بدء {المعادلة} \ اليسار [\ بدء {صفيف} {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} $$ عرض $$


ولكن مع مثل هذه السلسلة البسيطة ، يمكنك العثور على المحدد وإرسالها إلى Habr


 u |> det |> habr 


Rekursivnenko! ربما يتم حساب المصفوفة العكسية بطريقة مماثلة:


 u^-1 |> habr 

المفسد

عرض $$ $ \ left [\ start {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) \ 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)} {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}}} \ \ اليمين)} } {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}} \ يمين)}} {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] $$ عرض $$


إذا كنت ترغب في إصابة متصفح Matjax بالمتصفح ، فضع علامة ناقص من الدرجة الثانية (مربع المصفوفة العكسية)
بالمناسبة ، تعتبر SymEngine المشتقات:


 dJ[1] |> habr 


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


بالمناسبة ، لا تستطيع جوليا استخدام الصيغ فقط ، ولكن أيضًا الرسومات من LaTeX 'a. إذا قمت بتثبيت MikTex وقمت بالفعل بتنزيل pgfplots ، ثم باستخدام البيئة المناسبة ، يمكنك تكوين صداقات مع Julia ، والتي ستوفر الفرصة لإنشاء مدرج تكراري ورسوم بيانية ثلاثية الأبعاد وأخطاء وتخفيفات مع ملامح ، ثم دمجها في مستند LaTeX.


كل هذا مع الصيغ ، ولكن ليس مع الحسابات الرمزية: لا يزال لدى جوليا حلول أكثر تعقيدًا وإثارة للاهتمام للجبر الرمزي ، والتي سنتعامل معها بالتأكيد في وقت ما في المرة القادمة.

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


All Articles