3DQD.py 技術ドキュメント

プログラムの動作

3DQD.py は、量子ドットにおける電子のエネルギー準位計算および関連する物理関数のプロットを行うPythonスクリプトです。主に以下の3つのモードで動作します。

  1. エネルギー準位計算 (cal モード): 指定された有効質量と半径を持つ球対称ポテンシャル井戸モデルにおける電子のエネルギー準位を計算します。量子ドットの半径 \(R\) と電子の有効質量 \(m_{eff}\) を用いて、球Bessel関数の零点からエネルギー準位を導出し、結果を標準出力に表示します。

  2. 球Bessel関数プロット (plot モード): 指定された次数 \(l\) の球Bessel関数 \(j_l(x)\) のグラフを描画します。同時に、それらの関数の零点もグラフ上にマークして視覚化します。

  3. 水素原子の動径波動関数プロット (plotH モード): 水素原子の動径波動関数 \(R_{nl}(r)\) をプロットします。一般化されたラゲール多項式を用いて計算され、グラフとして表示されます。

本プログラムは、量子力学における球対称ポテンシャル問題の基礎的な理解を助けることを目的としています。

原理

1. 量子ドットのエネルギー準位計算 (cal モード)

無限に深い球対称ポテンシャル井戸モデルにおける量子ドットの電子のエネルギー準位 \(E_{nl}\) は、次の式で与えられます。

\[E_{nl} = \frac{\hbar^2 k_{nl}^2}{2 m_{eff} m_e}\]

ここで、

  • \(\hbar\) はディラック定数(換算プランク定数)

  • \(m_{eff}\) は電子の有効質量(自由電子質量 \(m_e\) に対する比率)

  • \(m_e\) は自由電子質量

  • \(k_{nl}\) は波数ベクトル

波数ベクトル \(k_{nl}\) は、量子ドットの半径 \(R\) と球Bessel関数 \(j_l(x)\)\(n\) 番目の零点 \(\alpha_{nl}\) を用いて次のように表されます。

\[k_{nl} = \frac{\alpha_{nl}}{R}\]

したがって、エネルギー準位は \(\alpha_{nl}\) を求めることで計算されます。

\[E_{nl} = \frac{\hbar^2 \alpha_{nl}^2}{2 m_{eff} m_e R^2}\]

プログラムでは、get_bessel_zeros 関数が scipy.special.spherical_jn 関数(球Bessel関数)の零点を数値的に探索します。零点探索は、get_zeros 関数によって、指定された探索範囲内で関数値の符号反転を検出し、その後、ニュートン法に似た反復的な数値解法を用いて高い精度で零点を見つけます。

2. 球Bessel関数のプロット (plot モード)

球Bessel関数 \(j_l(x)\) は、球座標におけるヘルムホルツ方程式の動径成分の解として現れる特殊関数です。本プログラムでは scipy.special.spherical_jn(l, x) を用いて計算し、そのグラフと零点を視覚的に表示します。これにより、量子ドットのエネルギー準位が球Bessel関数の零点に強く関連していることを理解しやすくなります。

3. 水素原子の動径波動関数のプロット (plotH モード)

水素原子の動径波動関数 \(R_{nl}(r)\) は、主量子数 \(n\) と軌道角運動量量子数 \(l\) によって特徴づけられ、次のような一般的な形式で表されます。

\[R_{nl}(r) = C_{nl} \left(\frac{2Zr}{na_0}\right)^l e^{-\frac{Zr}{na_0}} L_{n-l-1}^{2l+1}\left(\frac{2Zr}{na_0}\right)\]

ここで、

  • \(C_{nl}\) は規格化定数

  • \(Z\) は原子番号

  • \(a_0\) はボーア半径

  • \(L_{n-l-1}^{2l+1}(x)\) は一般化されたラゲール多項式

プログラムでは scipy.special.genlaguerre(n-l-1, 2*l+1) を使用して一般化されたラゲール多項式を計算し、水素原子の動径波動関数の形状をプロットします。

必要な非標準ライブラリとインストール方法

3DQD.py の実行には、以下の非標準ライブラリが必要です。

  • numpy: 数値計算を効率的に行うための基本的なライブラリ。

  • scipy: 科学技術計算のためのライブラリ。特に scipy.special.spherical_jn (球Bessel関数) と scipy.special.genlaguerre (一般化されたラゲール多項式) を使用します。

  • matplotlib: グラフの描画に使用します。

これらのライブラリは、以下の pip コマンドでインストールできます。

pip install numpy scipy matplotlib

必要な入力ファイル

3DQD.py は、外部の入力ファイルを必要としません。すべての設定(量子ドットの有効質量、半径、プロット範囲など)は、プログラムのソースコード内に直接記述されているか、コマンドライン引数でモードが指定されます。

生成される出力ファイル

本プログラムは、以下の種類の出力を生成します。

  • cal モード: 計算された量子ドットのエネルギー準位は、標準出力(コンソール)にテキスト形式で表示されます。ファイルとして保存されることはありません。出力には、各準位の量子数 (\(n\), \(l\))、総量子数 (\(n+l\))、エネルギー値 (eV)、および対応する球Bessel関数の零点 \(\alpha_{nl}\) とその二乗値が含まれます。

  • plot モード: matplotlib を用いて、球Bessel関数のグラフがGUIウィンドウに表示されます。このグラフは、自動的にファイルとして保存されることはありません。ユーザーは表示されたウィンドウから手動で画像を保存できます。

  • plotH モード: matplotlib を用いて、水素原子の動径波動関数のグラフがGUIウィンドウに表示されます。このグラフも、自動的にファイルとして保存されることはありません。ユーザーは表示されたウィンドウから手動で画像を保存できます。

コマンドラインでの使用例 (Usage)

3DQD.py は、コマンドライン引数で実行モードを指定します。

基本的な実行コマンドの形式は以下の通りです。

python 3DQD.py [mode]

ここで [mode] は以下のいずれかです。

  • cal: 量子ドットのエネルギー準位を計算し、標準出力に表示します。

  • plot: 球Bessel関数 \(j_l(x)\) をプロットします。

  • plotH: 水素原子の動径波動関数 \(R_{nl}(r)\) をプロットします。

[mode] が指定されない場合、デフォルトで cal モードが実行されます。

コマンドラインでの具体的な使用例

1. エネルギー準位計算モード (cal)

量子ドットのエネルギー準位を計算します。有効質量 0.067 me、半径 5 nm で計算されます(プログラム内部の定数)。

実行コマンド:

python 3DQD.py cal

実行結果 (例):

Energy levels for quantum sphere
  effective mass: 0.067 me
  radius: 5.0 nm
Zero points:
l=0: [3.1415926535, 6.283185307, 9.4247779605]
l=1: [4.4934094579, 7.7252518368, 10.9041216508]
l=2: [5.7634591965, 9.0950133481, 12.3229406085]
l=3: [6.9877708518, 10.4171249911, 13.6980230571]
l=4: [8.1825603709, 11.6987625841, 15.0402099308]
l n l+n  E(orb)
0 1 1    E(1s)=   0.31688972 eV  alpha_1_0=   3.14159265   alpha_1_0^2=  9.86960440
1 1 2    E(1p)=   0.64771638 eV  alpha_1_1=   4.49340946   alpha_1_1^2= 20.19072879
2 1 3    E(1d)=   1.07727409 eV  alpha_1_2=   5.76345920   alpha_1_2^2= 33.21731631
0 2 2    E(2s)=   1.26755887 eV  alpha_2_0=   6.28318531   alpha_2_0^2= 39.47841760
3 1 4    E(1f)=   1.66649298 eV  alpha_1_3=   6.98777085   alpha_1_3^2= 48.82894569
1 2 3    E(2p)=   2.13289053 eV  alpha_2_1=   7.72525184   alpha_2_1^2= 59.68953151
4 1 5    E(1g)=   2.45781682 eV  alpha_1_4=   8.18256037   alpha_1_4^2= 66.95420542
2 2 4    E(2d)=   3.17937397 eV  alpha_2_2=   9.09501335   alpha_2_2^2= 82.72927233
0 3 3    E(3s)=   3.63001859 eV  alpha_3_0=   9.42477796   alpha_3_0^2= 88.82643950
3 2 5    E(2f)=   4.10091845 eV  alpha_2_3=  10.41712499   alpha_2_3^2=108.51651581
1 3 4    E(3p)=   4.63069176 eV  alpha_3_1=  10.90412165   alpha_3_1^2=118.89977873
4 2 6    E(2g)=   5.78765471 eV  alpha_2_4=  11.69876258   alpha_2_4^2=136.85025983
2 3 5    E(3d)=   6.06836412 eV  alpha_3_2=  12.32294061   alpha_3_2^2=151.85960416
see https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E9%87%8F%E5%AD%90%E5%8A%9B%E5%AD%A6%E2%85%A0%2F%E7%90%83%E5%AF%BE%E7%A7%B0%E4%BA%95%E6%88%B8%E5%9E%8B%E3%83%9D%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB for the definitions of quantum numbers

2. 球Bessel関数プロットモード (plot)

球Bessel関数 \(j_l(x)\)\(l=0\) から \(l=3\) までプロットし、零点を表示します。

実行コマンド:

python 3DQD.py plot

実行結果:

プログラム実行後、matplotlibによるグラフウィンドウが開き、球Bessel関数とそれぞれの零点がプロットされたグラフが表示されます。コンソールには、零点探索のデバッグ情報と見つかった零点のリストが表示されます。

zeros: l= 0 [3.1415926535, 6.283185307, 9.4247779605]
zeros: l= 1 [4.4934094579, 7.7252518368, 10.9041216508]
zeros: l= 2 [5.7634591965, 9.0950133481, 12.3229406085]
zeros: l= 3 [6.9877708518, 10.4171249911, 13.6980230571]

(グラフウィンドウの画像はここには表示できませんが、タイトル「Spherical Bessel Function \(j_l(kr)\)」を持つグラフが表示されます。)

3. 水素原子の動径波動関数プロットモード (plotH)

水素原子の動径波動関数 \(R_{nl}(r)\)\(n=1\) から \(n=3\) までプロットします。

実行コマンド:

python 3DQD.py plotH

実行結果:

プログラム実行後、matplotlibによるグラフウィンドウが開き、水素原子の動径波動関数がプロットされたグラフが表示されます。

(グラフウィンドウの画像はここには表示できませんが、タイトル「Radial Wave Function \(R_{20}(r)\) for Hydrogen Atom」を持つグラフが表示されます。)