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