【Python】電子波束の生成方法
重ね合わせの方法:ガウス分布
前回、自由粒子に対するシュレディンガー方程式の解となる平面波について解説したね。そして、エネルギーによって波数や角振動数が決まることも示したね。シュレディンガー方程式は線形方程式なので、実は異なるエネルギーの平面波は任意に重ね合わせることができるよ。これは 重ね合わせの原理 って呼ばれるよ。つまり任意の平面波を重ね合わせた波動関数
$$
\psi(x,t)= \frac{1}{\sqrt{L}} \sum\limits_{n}c_n \,e^{ ik_nx - i\omega_n t }
$$
も元の方程式を必ず満たすわけだね。$${c_n}$$は各波数の平面波の重ね合わせの割合を表す複素数(以後、波数分布と呼ぶことにします)で、規格化条件$${\sum\limits_{n} |c_n|^2 = 1}$$ を満たすとするよ。$${L}$$は数値計算を行う際に便利なために導入する系の大きさだよ。これを導入して波数を
$$
k_n = \frac{ 2\pi }{ L }\, n \ \ (n=0, \pm1, \pm2, \cdots )
$$
と定義することで、波動関数が規格化条件 $${\int_{0}^L|\psi(x,t)|^2dx=1}$$を満たすことも簡単に計算できるね。
次に $${c_n}$$ の具体的な形について考えるね。$${c_n}$$は重ね合わせの割合を表すので規格化条件を満たせばどんな値でも構いません。ここでは最もよく利用されるガウス分布(正規分布)
$$
c_n =c_0\, e^{-\left(\frac{ k_n - \bar{k} }{2\sigma} \right)^2} = c_0\exp \left[ -\left(\frac{ k_n - \bar{k} }{2\sigma} \right)^2 \right]
$$
を採用するね。$${k_n - \bar{k}}$$でピーク値 $${c_n = c_0}$$ となり、両側で指数関数的に減少する分布とるよ。分布の幅を決めるのが $${\sigma}$$ で、$${| k_n - \bar{k} | = 2\sigma}$$ のときに分布の値がピークの$${e^{-1}}$$倍になるね。
このガウス分布がよく利用されるのは数学的に扱いが容易であることと、量子力学的には後に示す不確定性原理と非常に密接に関係があるからだね。
平面波を重ね合わせた波動関数の空間分布:ガウス波束
波数分布$${c_n}$$がガウス分布で与えられた場合の波動関数を実際に見てみるよ。
$$
\psi(x,t)= \frac{c_0}{\sqrt{L}} \sum\limits_{n} \,e^{ ik_nx - i\omega_n t }\exp \left[ -\left(\frac{ k_n - \bar{k} }{2\sigma} \right)^2 \right]
$$
上図は時刻$${t=0}$$における、エネルギー$${\bar{E} = 1.0 , 10.0[{\rm eV}]}$$に対応する$${\bar{k}}$$を与えたときの波動関数の空間分布だよ。波数分布をガウス分布とした場合、波動関数はなんとガウス分布を包絡線とする波数$${k=\bar{k}}$$の平面波になるよ。包絡線は
$$
|\psi(x,0)| \propto e^{-\sigma^2x^2}
$$
だよ。このように波数分布をガウス分布として生成した包絡線がガウス分布の波動関数はガウス波束と呼ばれるよ。ガウス波束の幅は指数部から $${1/\sigma}$$ となるため、$${\sigma}$$が大きいほどガウス波束の幅が狭くなることを意味するね。波数分布の幅が $${2\sigma}$$ だったため、波数分布の幅とガウス波束の幅は積が定数(2)で互いに反比例であることがわかります。つまり、波数分布を狭くするとガウス波束は広がり、反対に波数分布を広げるとガウス波束は狭くなることを意味するよ。ちなみに、ガウス波束の幅は中心波数の大きさには依存しないよ。
それにしても、$${k=\bar{k}}$$を中心に様々な波数の平面波を重ね合わせているにも関わらず、位相として中心波数だけが現れるのは非常に興味深いね。次回は、このガウス波束の運動について解説するよ。
プログラムソース:Python
上記のガウス波束の空間分布を計算するプログラムソースを以下に示すよ。もし良かったら試してみてくださーい!
#################################################################
## ガウス波束の空間分布
#################################################################
import numpy as np
import matplotlib.pyplot as plt
#図全体
fig = plt.figure(figsize=(15, 8))
#全体設定
plt.rcParams['font.family'] = 'Times New Roman' #フォント
plt.rcParams['font.size'] = 24 #フォントサイズ
plt.rcParams["mathtext.fontset"] = 'cm' #数式用フォント
#カラーリストの取得
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
#虚数単位
I = 0.0 + 1.0j
#################################################################
## 物理定数
#################################################################
#プランク定数
h = 6.62607015 * 1.0E-34
hbar = h / (2.0 * np.pi)
#電子の質量
me = 9.1093837015 * 1.0E-31
#電子ボルト
eV = 1.602176634 * 1.0E-19
#################################################################
## 物理系の設定
#################################################################
#波束の中心エネルギー
E_bar = 10.0 * eV
#重ね合わせの数
NK = 500
#ガウス分布の幅
sigma = 1.0 / ( 1.25 * 10**-9 )
#波数の間隔
dk = 10.0 * sigma / NK
#ガウス分布の中心
k_bar = np.sqrt( 2.0 * me * E_bar / hbar**2)
#空間分割サイズ
dx = 1.0 * 10**-9
#空間分割数
NX = 500
#計算区間
x_min = -5.0 * dx
x_max = 5.0 * dx
#ガウス波束の値を計算する関数
def Psi( x, t ):
#波動関数値の初期化
psi = x * (0.0 + 0.0j)
#各波数ごとの寄与を足し合わせる
for kn in range(NK):
#各波数を取得
k = k_bar + dk * (kn - NK/2)
#波数から各振動数を取得
omega = hbar / (2.0 * me) * k**2
#平面波を足し合わせる
psi += np.exp(I * k * x ) * np.exp(- I * omega * t) * np.exp( -( (k - k_bar) / (2.0 * sigma) )**2 )
return psi
#基準となる振幅を取得
psi_abs = abs(Psi( 0, 0 ))
#座標点配列の生成
x = np.linspace(x_min, x_max, NX)
#時刻t=0の波動関数を取得
psi = Psi( x, 0 )
#波動関数の規格化
psi /= psi_abs
#グラフの描画(波動関数)
plt.title( u"ガウス波束", fontsize=20, fontname="Yu Gothic", fontweight=1000 )
plt.xlabel( r"$ x [{\rm nm} ] $", fontsize=30 )
plt.ylabel( r"$ \psi(x,0) $", fontsize=30 )
#罫線の描画
plt.grid(which = "major", axis = "x", alpha = 0.8, linestyle = "-", linewidth = 1)
plt.grid(which = "major", axis = "y", alpha = 0.8, linestyle = "-", linewidth = 1)
#描画範囲を設定
plt.xlim([x_min/dx, x_max/dx])
plt.ylim([-1.1, 1.1])
#グラフの描画
plt.plot(x/dx, psi.real, linestyle='solid', linewidth = 5)
plt.plot(x/dx, psi.imag, linestyle='solid', linewidth = 5)
plt.plot(x/dx, abs(psi), linestyle='solid', linewidth = 5)
#余白の調整
plt.subplots_adjust(left = 0.1, right = 0.98, bottom=0.15, top = 0.95)
#################################################################
## ガウス分布の描画
#################################################################
fig_gaussian = plt.figure(figsize=(15, 8))
#波数の計算範囲
k_min = k_bar - dk * NK / 2.0
k_max = k_bar + dk * NK / 2.0
#波数座標点配列の生成
k = np.linspace(k_min, k_max, NK)
#正規分布
c_n = np.exp( -((k - k_bar) / (2.0 * sigma))**2 )
#グラフの描画(固有関数)
plt.title( u"ガウス分布(正規分布)", fontsize=20, fontname="Yu Gothic", fontweight=1000)
plt.xlabel(r"$ (k_n - \bar{k})/\sigma $", fontsize=30)
plt.ylabel(r"$ c_n/c_0 $", fontsize=30)
#罫線の描画
plt.grid(which = "major", axis = "x", alpha = 0.8, linestyle = "-", linewidth = 1)
plt.grid(which = "major", axis = "y", alpha = 0.8, linestyle = "-", linewidth = 1)
#描画範囲を設定
plt.xlim([(k_min- k_bar)/sigma, (k_max- k_bar)/sigma])
plt.ylim([0, 1.05])
#波数分布グラフの描画
plt.plot((k-k_bar)/sigma, c_n, linestyle='solid', linewidth = 5)
#グラフの表示
plt.show()