nano_exit

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

散乱振幅からサイトT行列を復元する。

実験結果か何かで、散乱振幅 f( \theta )の角度分布が得られているとする。
ここからサイト T行列を復元する方法を考える。
サイト T行列が求まれば、そこからArgand diagramを作って、(準)共鳴準位があるとかないとか、追加で情報が得られる(もし角度分布のエネルギー依存性まで測っていればの話だが、、、)。
サイト T行列のArgand diagramは前回紹介した方法が使える。
koideforest.hatenadiary.com

散乱振幅は、以下の形で与えられる。

\displaystyle
f( \theta ) = \sum_l ( 2 l + 1 ) t_l P_l( \cos \theta )

 P_l( \cos \theta ) はLegendre多項式である。
Legendre多項式には、直交性が成り立つ。それは以前の記事で確認した。
koideforest.hatenadiary.com

したがって、


\displaystyle
\int^1_{-1} d( \cos \theta ) f( \theta ) P_l( \cos \theta )
  = \sum_{l'} ( 2 l' + 1 ) t_{l'} \int^1_{-1} d( \cos \theta ) P_{l'}( \cos \theta ) P_{l}( \cos \theta )  
\\
\displaystyle
  = \sum_{l'} ( 2 l' + 1 ) t_{l'} \frac{ 2 }{ 2 l + 1 } \delta_{ l l' }
  = 2 t_l
\\
\displaystyle
\therefore
t_l = \frac{ 1 }{ 2 } \int^1_{-1} d( \cos \theta ) f( \theta ) P_l( \cos \theta )
  = \frac{ 1 }{ 2 } \int^1_{-1} dx \, f( \cos^{-1}( x ) ) \, P_l( x )

例えば、角運動量 l = 2のサイト T行列 t_2のみからなる散乱振幅の角度分布は次のようになる。
f:id:koideforest:20180831011856p:plain

当たり前であるが、思いっ切り P_2( \cos \theta ) の形である。
この時、 t_2 = 0.1234 + 0.5678 i と適当に設定したが、導出した式からちゃんと t_2が復元されることが以下のソースで確認出来る。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import legendre
from scipy.integrate import quad

def Plx( l, x ):
    return legendre( l )( x )

cp_f = 1.
t_2 = 0.1234 + 0.5678j
f = lambda theta: cp_f * ( 2 * 2 + 1 ) * t_2 * Plx( 2, np.cos( theta ) )
thetas = np.linspace( 0., 2. * np.pi, 100 )

fig = plt.figure( figsize = ( 4.72, 4.72 ) )
ax = fig.add_subplot( 1, 1, 1, polar = True )
ax.plot( thetas, abs( f( thetas ) ) )
plt.show()
#plt.savefig( 'scattering_amplitude_2.png' )
#plt.close()

r0 = quad( lambda x: np.real( f( np.arccos( x ) ) * Plx( 0, x ) ), -1, 1 )[ 0 ] / ( 2 * cp_f )
i0 = quad( lambda x: np.imag( f( np.arccos( x ) ) * Plx( 0, x ) ), -1, 1 )[ 0 ] / ( 2 * cp_f )
print( r0, i0 )
# 0.0, 0.0

r2 = quad( lambda x: np.real( f( np.arccos( x ) ) * Plx( 2, x ) ), -1, 1 )[ 0 ] / ( 2 * cp_f )
i2 = quad( lambda x: np.imag( f( np.arccos( x ) ) * Plx( 2, x ) ), -1, 1 )[ 0 ] / ( 2 * cp_f )
print( r2, i2 )
# 0.1234, 0.5678