nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

デルタ関数のエンタングルメントを完備関係式で断つ?

例えば球面調和関数

 \displaystyle
\begin{align}
\delta( \hat{\bf r} - \hat{\bf r}' )
    &= \delta( \hat{\bf r}' - \hat{\bf r} ) \\
    &= \sum_L Y_{L} ( \hat{\bf r} ) Y^*_L ( \hat{\bf r}' ) 
    = \sum_L Y^*_{L} ( \hat{\bf r} ) Y_L ( \hat{\bf r}' ) \\
    &= \sum_L Y_{L} ( \hat{\bf r}' ) Y^*_L ( \hat{\bf r} ) 
    = \sum_L Y^*_{L} ( \hat{\bf r}' ) Y_L ( \hat{\bf r} ) 
\end{align}

これはある意味 \hat{\bf r},\, \hat{\bf r} エンタングルメントを断ったと言えるか?
添字が一個なので、ベクトルに拡張すれば、

 \displaystyle
\begin{align}
\delta( \hat{\bf r} - \hat{\bf r}' )
 = \left(
        Y_{L_1} ( \hat{\bf r} ), Y_{L_2} ( \hat{\bf r} ), \cdots
    \right)
    \left(
        \begin{array}{c}
            Y^*_{L_1}( \hat{\bf r}' ) \\ Y^*_{L_2}( \hat{\bf r}' ) \\ \vdots
        \end{array}
    \right)
 = \left(
        Y^*_{L_1} ( \hat{\bf r} ), Y^*_{L_2} ( \hat{\bf r} ), \cdots
    \right)
    \left(
        \begin{array}{c}
            Y_{L_1}( \hat{\bf r}' ) \\ Y_{L_2}( \hat{\bf r}' ) \\ \vdots
        \end{array}
    \right) \\
 = \left(
        Y_{L_1} ( \hat{\bf r}' ), Y_{L_2} ( \hat{\bf r}' ), \cdots
    \right)
    \left(
        \begin{array}{c}
            Y^*_{L_1}( \hat{\bf r} ) \\ Y^*_{L_2}( \hat{\bf r} ) \\ \vdots
        \end{array}
    \right)
 = \left(
        Y^*_{L_1} ( \hat{\bf r}' ), Y^*_{L_2} ( \hat{\bf r}' ), \cdots
    \right)
    \left(
        \begin{array}{c}
            Y_{L_1}( \hat{\bf r} ) \\ Y_{L_2}( \hat{\bf r} ) \\ \vdots
        \end{array}
    \right)
\end{align}

よって、ある種の行列化によって変数分離が可能である。ポイントは、もともと行列ではなくただの数だったので、「左に横ベクトル・右に縦ベクトル」の順番は変更出来ないという点である。
あまりエンタングルメントについて詳しくない(というか無知に等しい)が、エンタングルメントを断つ(解す)とは多分こういうことなのかと。
上では非局所相関を局所相関の積で表すというようなことをしたわけだが、この結果を用いると、いわゆる多重極展開と呼ばれる、動径成分と立体角成分に分ける展開が可能になる。
(これもある種のエンタングルメント解しか?)

 \displaystyle
\begin{align}
F( r, \hat{\bf r} )
    &= \int F( r, \hat{\bf r}' ) \delta( \hat{\bf r} - \hat{\bf r}' ) d \hat{\bf r}'
    = \int F( r, \hat{\bf r}' ) \sum_L Y_{L} ( \hat{\bf r} ) Y^*_L ( \hat{\bf r}' ) d \hat{\bf r}' \\
    &= \sum_L \left( \int F( r, \hat{\bf r}' ) Y^*_L ( \hat{\bf r}' ) d \hat{\bf r}' \right) Y_{L}( \hat{\bf r} ) 
    \equiv \sum_L f_L( r ) Y_{L}( \hat{\bf r} ) \\
    &= \left(
        f_{L_1}( r ), f_{L_2}( r ), \cdots
    \right)
    \left(
        \begin{array}{c}
            Y_{L_1}( \hat{\bf r} ) \\ Y_{L_2}( \hat{\bf r} ) \\ \vdots
        \end{array}
    \right)
\end{align}

これは「連続量の相関を離散量の話に置き換える」と言えるだろうか?
ちなみに逆もおそらく可能(離散量の相関を連続量の話に置き換える)。

 \displaystyle
\begin{align}
\delta_{ L, L' }
    &= \int d \hat{\bf r} Y^*_L( \hat{\bf r} ) Y_{L'}( \hat{\bf r} ) \\
g_{N L}
    &= \sum_{L'} g_{NL'} \delta_{L' L}
    = \sum_{L'} g_{N L'} \int d \hat{\bf r} Y^*_{L'}( \hat{\bf r} ) Y_{L}( \hat{\bf r} ) \\
    &= \int d \hat{\bf r} \left( \sum_{L'} g_{N L'} Y^*_{L'}( \hat{\bf r} ) \right) Y_{L}( \hat{\bf r} )
    \equiv \int d \hat{\bf r} G_{N}( \hat{\bf r} ) Y_{L}( \hat{\bf r} )
\end{align}

連続と離散の絡み合いは楽しいので、もっと深めて行きたい。

Gaunt積分のまとめ

Gaunt積分の自分的メモ。
Clebsch–Gordan coefficients - Wikipedia
3-j symbol - Wikipedia

Gaunt積分(多分一般的な呼び名ではない。が、自分の分野ではよく出てくる。)
 \displaystyle
\begin{align}
 & \int d\hat{\bf r} \, Y^*_{ l_3 m_3 }(\hat{\bf r}) Y_{ l_1 m_1 }(\hat{\bf r}) Y_{ l_2 m_2 }(\hat{\bf r}) \\
 & \quad = \sqrt{ \frac{ (2 l_1 + 1 ) ( 2 l_2 + 1 ) }{ 4 \pi ( 2 l_3 + 1 ) } }
        < l_1,0;l_2,0|l_3,0 > < l_1,m_1;l_2,m_2|l_3,m_3 >
\\
 & \quad = (-1)^{ m_3 } \sqrt{ \frac{ (2 l_1 + 1 ) ( 2 l_2 + 1 ) ( 2 l_3 + 1 ) }{ 4 \pi } }
        \left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ 0 & 0 & 0 \end{array} \right)
        \left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ m_1 & m_2 & - m_3 \end{array} \right)
\end{align}

Gaunt係数(Wikipediaとかに載っているのはこっち。)
 \displaystyle
\begin{align}
 & \int d\hat{\bf r} \, Y_{ l_1 m_1 }(\hat{\bf r}) Y_{ l_2 m_2 }(\hat{\bf r}) Y_{ l_3 m_3 }(\hat{\bf r}) \\
 & \quad = \sqrt{ \frac{ (2 l_1 + 1 ) ( 2 l_2 + 1 ) ( 2 l_3 + 1 ) }{ 4 \pi } }
        \left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ 0 & 0 & 0 \end{array} \right)
        \left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ m_1 & m_2 & m_3 \end{array} \right)
\end{align}

Clebsh-Gordan係数と3j記号の関係
 \displaystyle
\begin{align}
 < l_1,m_1;l_2,m_2|l_3,m_3 > =
        (-1)^{ l_1 - l_2 } (-1)^{ m_3 } \sqrt{ 2 l_3 + 1 }
        \left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ m_1 & m_2 & - m_3 \end{array} \right)
\end{align}

3j記号の列の交換
 \displaystyle
\begin{align}
\left( \begin{array}{ccc}  l_1 & l_2 & l_3 \\ m_1 & m_2 & m_3 \end{array} \right)
    &= (-1)^{ l_1 + l_2 + l_3 } \left( \begin{array}{ccc}  l_2 & l_1 & l_3 \\ m_2 & m_1 & m_3 \end{array} \right)
\\
    &= (-1)^{ l_1 + l_2 + l_3 } \left( \begin{array}{ccc}  l_1 & l_3 & l_2 \\ m_1 & m_3 & m_2 \end{array} \right)
\end{align}

行列要素を視覚的にチェックする方法

行列要素をなんとか可視化したくて、三次元プロット散布図で表現してみた。
Pythonでデータを可視化するmatplotlib初級(3D散布図編) - しぷぜん

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

N = 20
row = range( N )
column = range( N )

X, Y = np.meshgrid( row, column )
X = X.reshape( N * N )
Y = Y.reshape( N * N )

fig = plt.figure()
ax = fig.add_subplot( 111, projection='3d' )
for i in range(3):
    matrix_reshape_1d = np.random.rand( N * N )
    # default marker size = 20
    ax.scatter( X, Y, [i] * ( N * N ), s = matrix_reshape_1d * 20. )
plt.show()

f:id:koideforest:20180501190738p:plain

例えば行列全体が時間に依存していて、それの時間発展を見たい時には良さそう。
複素数の場合には、色で位相を表現することになると思うが、色は配列で渡せないので、一点一点をいちいちプロットしないと行けない気がする。行列サイズが大きいと、おそらく途中で限界が来るだろう。

Legendre多項式の直交性を python (scipy) で確かめる

いつもnumpyの多項式の使い方を忘れるので、Legendre多項式の直交関係式で練習する。
ルジャンドル多項式 - Wikipedia


\displaystyle
\int^{1}_{-1} P_{ l' }( x ) \, P_{ l }( x ) \, dx = \frac{ 2 }{ 2 l + 1 } \delta_{ l' l }

scipy.special.legendreでLegendre多項式を作ると、poly1dというタイプの関数が帰ってくるので、そのままxを代入できる(下記リンク or サンプルスクリプト参照)。
scipy.special.legendre — SciPy v1.0.0 Reference Guide
numpy.poly1d — NumPy v1.14 Manual

積分は一次元積分のquadを使用。
Python SciPy : SciPy の積分関数の基本的使い方 | org-技術

from scipy.special import legendre
from scipy.integrate import quad

def Plx( l, x ):
    # legendre( l ) >>> poly1d([ ... ])
    # poly1d([ ... ])( x ) >>> float
    return legendre( l )( x )

def orthogonal_relation( lp, l ):
    # quad >>> ( result, error )
    return quad( lambda x: Plx( lp, x ) * Plx( l, x ), -1., 1. ) [0]

if __name__ == '__main__'
    for lp in range( 5 ):
        for l in range( 5 ):
            print( 'lp, l = ', lp, l )
            print ( 'numerical', orthogonal_relation( lp, l ) )
            if lp == l:
                print( 'analytical', 2. / ( 2 * l + 1. ) )
            else:
                print( 'analytical', 0. )

sympyの虚数単位を通常に戻してnumpyが使えるようにする

sympy moduleを一部使ってゴニョゴニョ計算させて、それを元にnumpy moduleで処理(例えば逆行列計算)させようとした時に虚数単位が引っかかって怒られることがあった。
sympyの代数表記を数値表記に戻す方法として"N()"や"~.evalf()"があるが、これではsympyの虚数単位"I"は通常python上で扱われる"j"に戻らない。
戻すためには、"complex()"を使う必要がある。
ちなみに、Clebsh-Gordan係数のような関数丸ごとがobjectとしてsympy上で扱われている場合、"~.doit()"で一度崩してあげる必要がある。
つまり、"complex( ~.doit() )"のような感じ。

Sympyのウェブマニュアルには一箇所だけ"complex()"が出てきて、後は"N()"とか別のを使っているので、流し読みしていると見つからなかった。
Numerical evaluation — SymPy 1.2 documentation
検索機能って本当大事ですね。

追記
例えば"N()"や"evalf()"で数値化したものが実数だったとして、それに"+1j"で虚数を足すと、sympyの虚数単位"I"に変換されてしまう。
そのため、実数だと分かっている場合には、"float()"で通常の実数にし、そのあとで"+1j"を足すことが必要。

平方根の行列表現

平方根を評価するのに、級数展開以外のもので何か無いか考えた時に、虚数の行列表現を思い出した。

とりあえず \sqrt{2}に対応する行列を求めたい。
つまり、二乗したら単位行列に2をかけたものを返す行列を考える。

 \displaystyle
\begin{align}
\left(
\begin{array}{cc}
2 & 0 \\
0 & 2
\end{array}
\right)
=
\left(
\begin{array}{cc}
a & b \\
c & d
\end{array}
\right)^2
=
\left(
\begin{array}{cc}
a^2 + bc & b ( a + d ) \\
c ( a + d ) & d^2 + bc
\end{array}
\right)
\end{align}

ここで非対角成分を消すために b = c = 0としてしまうと、 a^2=d^2=\sqrt{2}となって全く面白くない。
そのため a + d=0の時の行列を探す。
この時、 bc = 2 - a^2 という条件しか出て来ないため、一意には決まらないことがわかる。
とりあえず、 a = 0, c = 1 を課せば、

 \displaystyle
\begin{align}
\left(
\begin{array}{cc}
0 & 2 \\
1 & 0
\end{array}
\right)
\end{align}

 \sqrt{2}に対応した行列になる。
 b cを入れ替えた転置の表式でも二乗して同じ値になる。
もし仮に a = 1とした時には、

 \displaystyle
\begin{align}
\left(
\begin{array}{cc}
1 & 1 \\
1 & -1
\end{array}
\right)
=
\left(
\begin{array}{cc}
1 & 0 \\
0 & -1
\end{array}
\right)
+
\left(
\begin{array}{cc}
0 & 1 \\
1 & 0
\end{array}
\right)
=
\sigma_3 + \sigma_1
\end{align}

となり、Pauli行列の和で思わず書き直したくなる形になる。

 aが二乗の形で bcが担う寄与を引いてくれているので、例えば \sqrt{ x^2+x+1 }

 \displaystyle
\begin{align}
\left(
\begin{array}{cc}
x & x+1 \\
1 & -x
\end{array}
\right)
\end{align}

と、全ての項を一次の形で表すことが出来る。

級数展開と行列表現が行き来出来るようになると楽しそうに思う。

ローレンツブーストとローレンツ収縮

名前的に非常にややこしい。ブーストするのか収縮するのかどっちかにして欲しいところである。

ざっくり言えば、

  • ローレンツブースト:観測者(静止系)に対して、運動している系の座標軸は運動方向に伸びる(時間軸も同時に影響を受ける)。
  • ローレンツ収縮:(ローレンツブーストの結果)静止系から見て、運動している物体は縮んで見える。

であろう。

ポイントは、

  • 与えられた(固定する)パラメータが、観測者(静止系)と運動系のどちらに属するものか

と思われる。

一次元系に話を絞る。
静止系( x(t), t )と速度 vで運動している運動系 ( x'( t' ), t' )を考える。
ローレンツ因子を  \gamma = 1 / \sqrt{ 1 - v^2/c^2 } と定義しておく(したがって \gamma > 1 )。

観測者を静止系に取る(つまり、あんまり何も考えなくて良い場合)。
ロケット(運動系)の x'座標は、観測者(静止系)のパラメータ x, tを使って(基準にして)、

 \displaystyle x' = \gamma( x - v t )

と与えられる。
座標が伸びていることをわかり易くする為、静止系から見て v_0で運動しているガンダムを別に考える( v_0は静止系に属するパラメータ)。
観測者、ロケット、そしてガンダム t = t' = 0 の時に原点に居たとする。
つまり、t秒後には観測者(静止系)から見てガンダム ( v_0 t, t ) に居ることになる。
この時に、ロケット(運動系)からガンダムはどう見えるかと、

 \displaystyle x' = \gamma( v_0 t - v t ) = \gamma ( v_0 - v ) t

であり、 \gamma > 1であるから、非相対論(ガリレイ変換)に比べて差が大きくなっていることがわかる。
これはローレンツブーストによって座標が伸びた帰結である。

(ちなみに、「観測者(ロケット)から見たら」というのは x (x')の値がどうなるか、ということを言っている。)

で、これだけ見ると何でもかんでも(ロケットから見ると)長くなるように思ってしまうが、ロケット上でのパラメータが基準となるものは逆になる。
「観測者のパラメータを基準に取った時、ロケットから見ると長さが長くなる」ということは、例えば、「ロケット上から見たロケットの長さ L'は、観測者から見ると短い長さ L( < L' ) に見える」ということと同義である。
(ロケットが地上から宇宙に「加速して」飛び立つということを考え始めると一般相対論の範疇なので、ロケットが速度を持つ過程は省略するが、)元々のロケットの長さは作成時に L'と決まっていて、ロケットが飛んでいる時でも「ロケット上から見たら」長さは L'である。
一方で、止まっている観測者から見ると、(ユニットを分離したり、先端が凹んだりしない限り)変わらないはずのロケットの長さが Lに縮んで見えてしまう。
これが「ローレンツ収縮」と言っていることである。
この場合には、そもそも観測者からは縮んで見えているので、そこからロケットでは伸びて見えると言っても、結局は元の長さで見えるというだけの話である。

静止系と運動系、どちらのパラメータを固定するべきかで見え方が変わるので、非常にややこしい。。。