数学の具体的な計算にPython(SymPy)を使って、数学もPython(SymPy)も同時に学んでしまいましょう。今回はPython(SymPy)を使って非可換な積の計算をしてみたいと思います。今回のハイライトとしてBaker-Campbell-Hausdorffの公式について調べてみます。
非可換な積
数学や物理学の問題では対象の積(かけ算)が非可換であるような、つまり積の順序を交換すると答えが変わるような対象を扱うことが必要になることがあります。代表的な例としては行列の演算があげられるでしょう。2つの行列
に対し
import sympy as sp A = sp.Matrix([[0,1],[1,0]]) B = sp.Matrix([[1,0],[0,-1]]) A*B-B*A
より
であり
となることがわかります。
ここでは具体的に行列を考えましたが、より抽象的に非可換な積を考察する場合にも、SymPyは力を発揮してくれます。
SymPyにおける非可換積
対象 に非可換な積が備わっている場合、SymPyでは以下のように入力します。
sp.var("X, Y", commutative=False)
実際、このようにすると
sp.expand((X+Y)**2)
より
となって、積の順序の情報が保持されていることがわかります。
非可換積の公式
積の順序を保持した計算は、たとえば(行列や演算子の計算で有用な)公式
などを確認する場合などに有用です。実際
sp.var("X, Y, Z", commutative=False) def C(X1, X2): return X1*X2-X2*X1 sp.expand(C(X,Y*Z)-C(X,Y)*Z-Y*C(X,Z))
から公式の成立が確認できます。
指数関数
非可換な対象についても「指数関数」が級数展開
によって定義されます。注意が必要なのは、非可換な積をもつ対象の和が引数になったとき、いわゆる「指数法則」がもはや一般には成り立たなくなっていることです。つまり
です。この左辺と右辺とを関係づけるのが、本記事のテーマにもなっているBaker-Campbell-Hausdorffの公式です。これは少し後回しにして、まずウォーミングアップ的な計算をみていきましょう。
随伴作用
対象 に非可換な積が備わっているとき、次の公式が成り立ちます。
ここで随伴作用 は逐次的に
によって定義します。ただし
とします。この公式が正しいことを(数学的な証明ではありませんが)確認してみます。いま として次数勘定のための(可換な)パラメタ を導入しましょう。左辺
を について展開して、 の各次数の係数をゼロ次からいくつかあげてみます:
sp.var("t") sp.series(sp.exp(t*X)*Y*sp.exp(-t*X), t, 0, 4)
から
と求まります。他方、右辺
において、随伴作用を逐一計算すると
def Ad(Z): return sp.expand(X*Z-Z*X) Ad(Y)
Ad(Ad(Y))
Ad(Ad(Ad(Y)))
から
と計算されます。数因子の階乗を合わせて、 の3次までの展開式で公式
が成り立っていることがわかります。もちろんこれは数学的な証明ではありませんが、公式の成立を実感するうえで面白い考察だと思います。計算機の威力を発揮して展開の6次の係数でも公式が成り立っていることをみてみましょう(手計算では大変ですね)
L6 = sp.series(sp.exp(t*X)*Y*sp.exp(-t*X), t, 0, 7).coeff(t, 6) R6 = 1/sp.factorial(6)*Ad(Ad(Ad(Ad(Ad(Ad(Y)))))) sp.simplify(L6-R6)
から、確かに公式が成り立っていることが実感できます。
Baker-Campbell-Hausdorffの公式
さて、本記事のハイライトとしていよいよBaker-Campbell-Hausdorffの公式(以下BCH公式と略記します)ですが、一般論公式はかなり込み入っています。詳しくはWikipediaなどを参照してください。
Baker–Campbell–Hausdorff formula - Wikipedia
ここではBCH公式が成立していることを確認するために、上でみたのと同様に指数関数を展開してみましょう。まずはBCH公式を述べておきましょう:
としたとき、左辺の は以下のように と の適当な交換子による(無限項の)展開式で与えられます。
ここでも また として次数勘定のためのパラメタ を導入しましょう。BCH公式の左辺の について4次までの展開式と、右辺の4次までの展開式との差をとってみましょう:
del(Z) Z = ( t*X+t*Y+sp.Rational(1,2)*C(t*X,t*Y) +sp.Rational(1,12)*(C(t*X,C(t*X,t*Y))+C(t*Y,C(t*Y,t*X))) -sp.Rational(1,24)*C(t*Y,C(t*X,C(t*X,t*Y))) ) BCH_L4 = sp.series(sp.exp(Z), t, 0, 5) BCH_R4 = sp.series(sp.exp(t*X)*sp.exp(t*Y), t, 0, 5) sp.simplify(BCH_L4-BCH_R4)
(計算に少し時間がかかるかもしれませんが)展開の4次までで公式が成り立っていることがわかります。
キーワード:Python、SymPy、非可換積、Baker-Campbell-Hausdorffの公式