システムとモデリング

modelica, Julia, Design Structure Matrix, SysML, 他モデリング全般について。

【Julia言語おすすめパッケージ】Symbolics.jlを試してみる

Juliaの数式処理パッケージSymbolics.jlを試してみます。

github.com

ドキュメントは↓です

symbolics.juliasymbolics.org

パッケージの宣言

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

逆に、因数分解  2(x+y) はしてくれないようです。

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ネイティブの数式処理システムです。まだまだ開発が続いているようですので、これからも頻繁にチェックしていきたいと思います。

短いですが今回は以上になります。