SymEngine.jl
何かの数式の計算をする際に、記号同士の計算自体もJuliaにやらせたい、そんなときもあると思います。
例えば、行列と行列を掛け算した後に数字を代入したいとか。
これをやるパッケージとしてSymEngine.jlがありますので、紹介したいと思います。
https://github.com/symengine/SymEngine.jl
バージョン
Julia 1.2
インストール
インストールはいつものように、]を押してパッケージモードにしてから、
add SymEngine
とすればできます。
使い方
こんな感じのことができます。
記号の定義
using SymEngine
🐱 = symbols(:🐱)
🐶 = symbols(:🐶)
猫と犬を記号として定義します。これを使ってランダムな要素を持つ行列:
A = rand([🐶,🐱],3,3)
を定義すると、
3×3 Array{Basic,2}:
🐶 🐶 🐶
🐶 🐱 🐶
🐱 🐶 🐱
ができます。
同様に、🍚と🍘を定義して、その行列も定義すると
🍚 = symbols(:🍚)
🍘 = symbols(:🍘)
B = rand([🍚,🍘],3,3)
3×3 Array{Basic,2}:
🍚 🍚 🍚
🍘 🍘 🍚
🍘 🍘 🍘
となります。
この行列Aと行列Bをかけてみましょう。
C = A*B
3×3 Array{Basic,2}:
🐱*🍘 + 🐶*🍘 + 🐶*🍚 🐱*🍘 + 🐶*🍘 + 🐶*🍚 🐱*🍚 + 🐶*🍘 + 🐶*🍚
2*🐱*🍘 + 🐱*🍚 2*🐱*🍘 + 🐱*🍚 🐱*🍘 + 2*🐱*🍚
🐱*🍚 + 2*🐶*🍘 🐱*🍚 + 2*🐶*🍘 🐱*🍚 + 🐶*🍘 + 🐶*🍚
となります。記号で計算ができていますね。
代入
ここで、🍚や🍘に数字を代入してみましょう。
c = subs.(C,🍘 .=>2.0)
3×3 Array{Basic,2}:
2.0*🐱 + 2.0*🐶 + 🐶*🍚 2.0*🐱 + 2.0*🐶 + 🐶*🍚 2.0*🐶 + 🐱*🍚 + 🐶*🍚
4.0*🐱 + 🐱*🍚 4.0*🐱 + 🐱*🍚 2.0*🐱 + 2*🐱*🍚
4.0*🐶 + 🐱*🍚 4.0*🐶 + 🐱*🍚 2.0*🐶 + 🐱*🍚 + 🐶*🍚
ちゃんと数字が入りました。
ここで、subsというのは、
subs( 🐱*🍘 + 🐶*🍘 + 🐶*🍚,🍘 =>2.0)
のような使い方をする記号に数字などを代入する関数です。行列だったので.をつけて一気に演算してみました。
また、猫を犬に変えることもできて、
c = subs.(C,🐱 .=> 🐶)
3×3 Array{Basic,2}:
2*🐶*🍘 + 🐶*🍚 2*🐶*🍘 + 🐶*🍚 🐶*🍘 + 2*🐶*🍚
2*🐶*🍘 + 🐶*🍚 2*🐶*🍘 + 🐶*🍚 🐶*🍘 + 2*🐶*🍚
2*🐶*🍘 + 🐶*🍚 2*🐶*🍘 + 🐶*🍚 🐶*🍘 + 2*🐶*🍚
ができます。
微分
微分もできてしまいます。
d = diff.(C,🐱)
3×3 Array{Basic,2}:
🍘 🍘 🍚
2*🍘 + 🍚 2*🍘 + 🍚 🍘 + 2*🍚
🍚 🍚 🍚
行列要素
行列要素を定義することも簡単にできます。
例えば、
Cat = [symbols("🐱_$i$j") for i in 1:3, j in 1:4]
Dog = [symbols("🐶_$i$j") for i in 1:3, j in 1:4]
とすると、
3×4 Array{Basic,2}:
🐱_11 🐱_12 🐱_13 🐱_14
🐱_21 🐱_22 🐱_23 🐱_24
🐱_31 🐱_32 🐱_33 🐱_34
3×4 Array{Basic,2}:
🐶_11 🐶_12 🐶_13 🐶_14
🐶_21 🐶_22 🐶_23 🐶_24
🐶_31 🐶_32 🐶_33 🐶_34
添え字をつけることができます。
さらに、
Cat*transpose(Dog)
とすれば、
3×3 Array{Basic,2}:
🐶_11*🐱_11 + 🐶_12*🐱_12 + 🐶_13*🐱_13 + 🐶_14*🐱_14 … 🐶_31*🐱_11 + 🐶_32*🐱_12 + 🐶_33*🐱_13 + 🐶_34*🐱_14
🐶_11*🐱_21 + 🐶_12*🐱_22 + 🐶_13*🐱_23 + 🐶_14*🐱_24 🐶_31*🐱_21 + 🐶_32*🐱_22 + 🐶_33*🐱_23 + 🐶_34*🐱_24
🐶_11*🐱_31 + 🐶_12*🐱_32 + 🐶_13*🐱_33 + 🐶_14*🐱_34 🐶_31*🐱_31 + 🐶_32*🐱_32 + 🐶_33*🐱_33 + 🐶_34*🐱_34
添え字同士の掛け算もできます。