LoginSignup
35
18

More than 3 years have passed since last update.

Juliaで記号同士の計算がしたい~猫や犬の行列をかけて、猫で微分してみる

Last updated at Posted at 2019-11-13

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

添え字同士の掛け算もできます。

35
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
18