仮想計算機構

IT業界と無縁な派遣社員のブログ

箱の中の自由粒子を可視化する

前提

この記事では固有関数の可視化を行います。数式などは小出昭一郎『量子力学(Ⅰ)』の2章5節にしたがいます。

時間を含まないシュレーディンガー方程式

\{-\frac{\hbar^2}{2m}\nabla^2+V(r)\}\varphi(r) = \epsilon\varphi(r)

に対し、

  • \varphi : 固有関数、\epsilon : 固有値
  • V(r)=0
  • 縦横高さがそれぞれ a,b,c である箱の外では\varphi(r)=0
  • \varphi(r)=\varphi(x,y,z)=X(x)Y(y)Z(z) と書ける

とします。

方程式を解くと固有関数は


\varphi (r)=\sqrt\frac{8}{abc}\sin (\frac{\pi}{a}n_x x)\sin (\frac{\pi}{b}n_y y)\sin (\frac{\pi}{c}n_z z)


0\leq x \leq a\\
0\leq y \leq b\\
0\leq z \leq c

となります。

(n_x,n_y,n_z) は量子数といって整数の組になり、量子数が固有関数、固有値を決定します。可視化したいのは固有関数です。3次元空間に値を取るので、そのまま可視化するのが難しいです。やり方としては z の値を変化させながら、\varphi(x,y,z) の値を等高線で表示する方法をとります。サイズ a\times b \times c の箱の断面を z 軸方向に沿ってみていく感じですね。本記事では、一貫して a=b=c=1 とします。

プログラム

可視化にはSageMathを使います。

def free_particle(a,b,c,nx,ny,nz):
    x,y = var('x,y')

    dz = 0.03
    nframe = len([z for z in sxrange(0,c,dz)])

    g1 = [contour_plot(sqrt(8/a/b/c)*sin(pi*nx*x/a)*sin(pi*ny*y/b)*sin(pi*nz*z/c), 
          (x,0,a), (y,0,b),colorbar=True,contours=[j for j in sxrange(-1.5,1.5,0.1) ]) for z in sxrange(0,c,dz)]

    g2 = [text("sin(pi*nz*z/c)",(c*0.7,0.8),bounding_box={'boxstyle':'round', 'fc':'w'})
         +plot(sin(pi*nz*x/c), (0,c))
         +point((z,sin(pi*nz*z/c)),size=70,rgbcolor="red") for z in sxrange(0,c,dz)]

    g_list = [graphics_array((g2[i],g1[i])) for i in range(nframe)]

    return g_list

上記のプログラムを main.sage として保存し、SageShell を立ち上げます。

(n_x,n_y,n_z) = (2,3,1) の場合

さっそく main.sage にて定義した関数 free_particle を使います。

sage: load("main.sage")
sage: l = free_particle(1,1,1,2,3,1)

この関数はグラフィックスオブジェクトのリストを返します。リストの要素ひとつひとつがアニメーションを構成する画像に対応しています。下記のように要素を参照すれば、アニメーションのある瞬間を見ることができます。

sage: l[0]
/opt/sagemath-9.2/local/lib/python3.7/site-packages/sage/plot/contour_plot.py:208: UserWarning: No contour levels were found within the data range.
  linewidths=linewidths, linestyles=linestyles)
Launched png viewer for Graphics Array of size 1 x 2

f:id:riverta1992:20201216211938p:plain

図が2つあります。左図は z の変化を表しています。この画像では z=0 です。c=1 としたので z は 0 から 1 まで変化します。また、右図はxy平面における固有関数の値を等高線で表したものになります。z=0 のときは固有関数の定義より \varphi=0 になるので、平面上のどの点も灰色(つまり0)です。

z が変化するとxy平面の見え方はどう変わるのでしょうか。さっそくやってみます。

sage: animate(l)
/opt/sagemath-9.2/local/lib/python3.7/site-packages/sage/plot/contour_plot.py:208: UserWarning: No contour levels were found within the data range.
  linewidths=linewidths, linestyles=linestyles)
Launched gif viewer for Animation with 34 frames

f:id:riverta1992:20201215225002g:plain

わりときれいなアニメーションができました。xy平面がくっきりと6つの領域にわかれています(厳密な言い方ではないです)。6というのはもちろん n_x\times n_y = 6 に由来するものですね。高校数学が分かっていればイメージしやすいかと思います。

(n_x,n_y,n_z) = (2,3,2) の場合

sage: l = free_particle(1,1,1,2,3,2)
sage: animate(l)
/opt/sagemath-9.2/local/lib/python3.7/site-packages/sage/plot/contour_plot.py:208: UserWarning: No contour levels were found within the data range.
  linewidths=linewidths, linestyles=linestyles)
Launched gif viewer for Animation with 34 frames

f:id:riverta1992:20201215225045g:plain