【Julia言語おすすめパッケージ】Symbolics.jlを試してみる
Juliaの数式処理パッケージSymbolics.jl
を試してみます。
ドキュメントは↓です
パッケージの宣言
using Symbolics
変数の宣言
@variables x
\begin{equation} \left[ \begin{array}{c} x \ \end{array} \right] \end{equation}
数式を表現してみる
TEX形式の数式が出力されます。
f(x) = exp(-x^2/2) f(x)
\begin{equation} e^{ - 0.5 x^{2}} \end{equation}
数の代入
実数まで計算されてしまいます。
g(x) = substitute(f(x),Dict([x => 1])) g(x)
\begin{equation} 0.6065306597126334 \end{equation}
記号の代入
問題なく実行されます。
@variables y g(y) = substitute(f(x),Dict([x => y^2])) g(y)
\begin{equation} e^{ - 0.5 y^{4}} \end{equation}
数式の和の処理
特に何も宣言しなくしてもある程度数式は簡略化してくれるようです。
(x+1) + (x+2) + (x+3)
\begin{equation} 6 + 3 x \end{equation}
数式の積の処理
簡略化されますが展開はされません。
(x+1) * (x+2) * (x+3)
\begin{equation} \left( 1 + x \right) \left( 2 + x \right) \left( 3 + x \right) \end{equation}
数式の簡略化その1
数式の簡略化はsimplify
を使用します。
展開はされません。
simplify((x+1) * (x+2) * (x+3))
\begin{equation} \left( 1 + x \right) \left( 2 + x \right) \left( 3 + x \right) \end{equation}
数式の簡略化その2
expand = true
にすることで展開されるようです。
simplify((x+1) * (x+2) * (x+3);expand=true)
\begin{equation} 6 + x^{3} + 11 x + 6 x^{2} \end{equation}
数式の簡略化その3
実数にまで簡略化できるものはそうしてくれるようですね。
z = sin(x)^2 + cos(x)^2
\begin{equation} \cos^{2}\left( x \right) + \sin^{2}\left( x \right) \end{equation}
simplify(z)
\begin{equation} 1 \end{equation}
数式の簡略化その4
逆に、因数分解 はしてくれないようです。
B = 2x + 2y simplify(B)
\begin{equation} 2 x + 2 y \end{equation}
数式を解く その1
数式を解くのはsolve_for
なのですが、定義されていないというエラーがでました。
eqs = 2x + 2y ~ 1 var = x solve_for(eqs,var)
UndefVarError: solve_for not defined
Stacktrace:
[1] top-level scope at In[105]:3
[2] include_string(::Function, ::Module, ::String, ::String) at .\loading.jl:1091
数式を解く その2
代わりにSymbolics.solve_for
で、数式をx
について解くことができました。
eqs = 2x + 2y ~ 1 var = x Symbolics.solve_for(eqs,var)
\begin{equation} 0.5 - y \end{equation}
数式を解く その3
Symbolics.solve_for
で連立方程式も解けるようです。
eqs = [ 2x + 2y ~ 1, x + 3y ~ 5] var = [x,y] Symbolics.solve_for(eqs,var)
\begin{equation} \left[ \begin{array}{c} -1.75 \ 2.25 \ \end{array} \right] \end{equation}
数式を解く その4
非線形方程式は解くことができないようです。
eqs = 2x^2 + 2y ~ 1 var = x Symbolics.solve_for(eqs,var)
AssertionError: isaffine(ex, [var])
Stacktrace:
[1] A_b(::Equation, ::Num, ::Bool) at src\linear_algebra.jl:71
[2] solve_for(::Equation, ::Num; simplify::Bool, check::Bool) at src\linear_algebra.jl:88
[3] solve_for(::Equation, ::Num) at src\linear_algebra.jl:88
[4] top-level scope at In[108]:3
[5] include_string(::Function, ::Module, ::String, ::String) at .\loading.jl:1091
Symbolics.jlはSympyと違い、Juliaネイティブの数式処理システムです。まだまだ開発が続いているようですので、これからも頻繁にチェックしていきたいと思います。
短いですが今回は以上になります。