朱莉娅在乳胶


在科学界,数据可视化和理论设计起着非常重要的作用。 诸如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能够显示LaTeX格式的方程式(通过MathJax ),但这不适用于常规线。 因此,LaTeXStrings包定义:


  • LaTeXString类( String的子类型),其工作方式类似于字符串(用于索引,转换等),但在IJulia中自动显示为文本/乳胶。
  • 字符串宏L"..."L"""..."""允许您输入LaTeX方程式而不会转义反斜杠和美元符号(如果省略它们,则会为您添加美元符号)。

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


乳胶化


功能更强大的软件包是Latexify指南 )。 它旨在从julia对象生成LaTeX数学。 该软件包使用Julia的同源性将表达式转换为LaTeX格式的字符串。 Latexify.jl提供了用于转换许多不同的Julia对象的函数,包括:


  • 表达方式
  • 弦乐
  • 数字(包括有理数和复数),
  • 来自SymEngine.jl的符号表达式,
  • 来自微分方程的参数化函数和反应网络
    以及所有受支持类型的数组。

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

 fracx\左y+x\右2


 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) 

\左[\开arrayccc frac23ec cdott1+3 textiti fracxx+k1 Gamma\左n\右 log10\左x\右\结array\右]


您可以指定一个显示公式的函数,并将其以Habr可以理解的形式复制到缓冲区中:


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

 fracx\左y+x\右2


 <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是一个提供符号计算的软件包,您可以使用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 

\左[\开arraycccu11u12u13u21u22u23u31u32u33\结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 \\ \结束{array} \ right] \结束{equation} $$显示$$


全矩阵计算:


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

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


但是通过如此简单的链,您可以找到行列式并将其发送给Habr


 u |> det |> habr 

u11 cdot leftu22 fracu12 cdotu21u11 right cdot leftu33 fracu13 cdotu31u11 frac\左u23 fracu13 cdotu21u11 right cdot leftu32 fracu12 cdotu31u11 rightu22 fracu12 cdotu21u11\正


递归! 逆矩阵的计算方式可能类似:


 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}} \右)} {u_ {11} \ cdot \左(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 {\左(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}}}}对)} {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}} \右) } \ right)} {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}} \ 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}} \右)\ 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 {\左(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)\ 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)} {\左(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}} \右)\ cdot \左(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 {\左(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 \左(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \ right)} {\左(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}} \ 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 {\左(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 {\左(u_ {23}-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)\ cdot \左(u_ {32}-\ frac {u_ {12} \ cdot u_ {31}} {u_ {11}} \右}} { \左(u_ {22}-\压裂{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}} \右)\ 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_ {23 }-\ frac {u_ {13} \ cdot u_ {21}} {u_ {11}} \右)} {\左(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}} \ 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}} \右)} {u_ {11} \ cdot \左(u_ {22}-\ frac {u_ {12} \ cdot u_ {21}} {u_ {11}} \右)}} {u_ {33}-\ frac {u_ {13} \ cdot u_ {31}} {u_ {11}}-\ frac {\左(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 {\左(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}}} \右)}&\左(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,请将第二度减负(逆矩阵的平方)
顺便说一下,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


顺便说一句,Julia不仅可以使用公式,还可以使用LaTeX'a的图形 。 并且,如果您安装了MikTex并已经下载了pgfplots ,则可以使用适当的环境与Julia交朋友,这将使您有机会构建直方图,三维图,带有轮廓的误差和浮雕,然后将其集成到LaTeX文档中。


都是公式,而没有符号计算:Julia对于符号代数仍然有更复杂和有趣的解决方案,我们一定会在下一次处理。

Source: https://habr.com/ru/post/zh-CN448096/


All Articles