
在科学界,数据可视化和理论设计起着非常重要的作用。 诸如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)
fracx\左(y+x\右)2
str = "x/(2*k_1+x^2)"
fracx2 cdotk1+x2
异构元素数组:
m = [2//3 "e^(-c*t)" 1+3im; :(x/(x+k_1)) "gamma(n)" :(log10(x))] latexify(m)
\左[\开始arrayccc frac23&e−c cdott&1+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
\左[\开始arraycccu11&u12&u13u21&u22&u23u31&u32和u33\结束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 left(u22− fracu12 cdotu21u11 right) cdot left(u33− fracu13 cdotu31u11− frac\左(u23− fracu13 cdotu21u11 right) cdot left(u32− fracu12 cdotu31u11 right)u22− 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 left(u21 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对于符号代数仍然有更复杂和有趣的解决方案,我们一定会在下一次处理。