fortran66のブログ

fortran について書きます。

【メモ帳】暇つぶしに Julia で Camplbell-Baker-Hausdorff 計算してみる

Camplbell-Baker-Hausdorff の公式

Camplbell-Baker-Hausdorff の公式という割に、実際の展開式を導いたのはソ連の Dynkin らしいので、この名でいいのかとも思いますが、アカと間違えられて FBI に通報されても困るので、長い物には巻かれましょうw

exp(A)exp(B) = exp(C) の時、C=A+B+[A, B]/2 + ([A,[A,B]]-[B,[A,B]])/12 + [B,[A,[A, B]]]/24+...

Julia 言語での行列積・行列 exp

Julia 言語の行列の積 X*Y は Fortran での matmul(X, Y) になっており、exp(X) も数学的な定義に従って exp のべき展開での行列積になっており、Fortran での行列要素の exp(x_ij) ではないので、これを利用してCamplbell-Baker-Hausdorff の公式に適当な行列を入れて計算して見ることにします。

A=[1 1 
   1 1]
2×2 Array{Int64,2}:
 1  1
 1  1
B = [2 1
     1 2]/10
2×2 Array{Float64,2}:
 0.2  0.1
 0.1  0.2
f(x, y)=x*y-y*x
f (generic function with 1 method)
f(A, B)
2×2 Array{Float64,2}:
 0.0  0.0
 0.0  0.0
exp(A)* exp(B)
2×2 Array{Float64,2}:
 5.53968  4.43451
 4.43451  5.53968
exp(A+B+f(A,B)/2)
2×2 Array{Float64,2}:
 5.53968  4.43451
 4.43451  5.53968
A=[1 1 
   1 0]/10
2×2 Array{Float64,2}:
 0.1  0.1
 0.1  0.0
f(A, B)
2×2 Array{Float64,2}:
  0.0   0.01
 -0.01  0.0 
exp(A)* exp(B)
2×2 Array{Float64,2}:
 1.37607   0.26518
 0.252291  1.24676
exp(A+B+f(A,B)/2+(f(A, f(A, B))-f(B, f(A, B)))/12)
2×2 Array{Float64,2}:
 1.37607  0.265202
 0.25227  1.24676 
exp(A+B+f(A,B)/2+(f(A, f(A, B))-f(B, f(A, B)))/12 -(f(B, f(A, f(A, B))))/24  )
2×2 Array{Float64,2}:
 1.37607   0.26518
 0.252292  1.24676

行列 A, B が可換の時は、当然ながら C=A+B で exp(A)exp(B)=exp(A+B) が成り立ちます。

非可換の時は A, B を 0.1 のオーダーにしたので、交換子は 0.01 のオーダーで、四次の項まで取ることで小数点以下5桁くらいまで一致するようです。まぁそんなものかなという気のする結果ではあります。

Julia 言語では 行列積の関数も適当に書けるので、確かに楽だなと思います。プロトタイプ向きなのがよく分かります。