QD3D.py ドキュメント
概要
本スクリプト QD3D.py は、量子ドット (Quantum Dot) におけるエネルギー準位計算および関連関数のプロットスクリプトです。
詳細説明
本スクリプトは、球対称ポテンシャル井戸モデルを用いた量子ドットのエネルギー準位を計算し、その結果を表示する機能、および関連する物理関数(球Bessel関数や水素原子の動径波動関数)をプロットする機能を提供します。
calモードでは、指定された有効質量と半径を持つ量子ドットの電子のエネルギー準位を、球Bessel関数の零点を用いて計算します。plotモードでは、球Bessel関数のグラフを描画し、その零点を視覚化します。plotHモードでは、水素原子の動径波動関数を描画します。
コマンドライン引数により実行モードを選択できます。
関連リンク
3DQD_usage量子力学I/球対称井戸型ポテンシャル: 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
量子力学I/3次元調和振動子: https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E9%87%8F%E5%AD%90%E5%8A%9B%E5%AD%A6%E2%85%A0%2F%EF%BC%93%E6%AC%A1%E5%85%83%E8%AA%BF%E5%92%8C%E6%8C%AF%E5%8B%95%E5%AD%90#fe164113
非標準ライブラリ
本スクリプトの実行には以下の非標準ライブラリが必要です。
numpyscipy(scipy.special,scipy.optimize)matplotlib(matplotlib.pyplot)
定数
本スクリプト内で定義されている定数を以下に示します。
url(str): 球対称井戸型ポテンシャルに関するURL。初期値:
"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"
me(float): 電子の質量(kg)。初期値:
9.10938356e-31
hbar(float): 換算プランク定数(J・s)。初期値:
1.0545718e-34
eV(float): 1電子ボルトのジュール換算値(J/eV)。初期値:
1.60218e-19
lstr(list[str]): 軌道角運動量量子数lに対応する記号(s,p,dなど)のリスト。初期値:
['s', 'p', 'd', 'f', 'g', 'h', 'l']
グローバル変数
本スクリプト内で定義されているグローバル変数を以下に示します。これらの変数はコマンドライン引数によって上書きされる可能性があります。
meff(float): 電子の有効質量。自由電子質量meに対する比率。初期値:
0.067
R(float): 量子ドットの半径(m)。初期値:
5e-9
Z(int): 水素原子の動径波動関数プロット時に使用される原子番号。初期値:
1
mode(str): スクリプトの実行モード。初期値:
"cal"
コマンドライン引数
スクリプトは以下のコマンドライン引数を解析します。
第1引数: 実行モード (
``mode``)。sys.argv[1]が存在する場合、グローバル変数modeをその値に設定します。例:
cal,plot,plotH
第2引数: 量子ドットの半径 (
``R``)。sys.argv[2]が存在する場合、その値をfloat型に変換し、1.0e-9を掛けてメートル単位に変換してグローバル変数Rに設定します。入力はナノメートル単位が想定されます。
第3引数: 電子の有効質量 (
``meff``)。sys.argv[3]が存在する場合、その値をfloat型に変換してグローバル変数meffに設定します。
第4引数: 原子番号 (
``Z``)。sys.argv[4]が存在する場合、その値をfloat型に変換してグローバル変数Zに設定します。
関数
get_zeros(func, xmin=0.0, xmax=10.0, dx=0.1, eps=1.0e-10, nmaxiter=50, h=1.0e-10, dump=1.0, print_level=0)
概要
関数の零点を計算します。
詳細説明
与えられた関数 func の指定された区間 [xmin, xmax] 内における零点を探索します。零点の探索には、関数値の符号反転を検出した後、ニュートン法に似た数値的な手法を使用します。各ステップで接線近似を用いて次点の推定を行い、指定された収束条件 eps または最大反復回数 nmaxiter に達するまで繰り返します。
引数
func(callable): 零点を探す関数。引数を1つ取るcallableオブジェクト。xmin(float): 探索範囲の最小値。デフォルト値:
0.0
xmax(float): 探索範囲の最大値。デフォルト値:
10.0
dx(float): 初期探索におけるステップサイズ。デフォルト値:
0.1
eps(float): 零点探索の収束判定に用いる許容誤差。デフォルト値:
1.0e-10
nmaxiter(int): ニュートン法系反復の最大回数。デフォルト値:
50
h(float): 数値微分の計算に使用する微小な差分。デフォルト値:
1.0e-10
dump(float): ニュートン法におけるステップサイズの調整係数(ダンプファクター)。1.0は標準的なステップサイズ。デフォルト値:
1.0
print_level(int): デバッグ情報の出力レベル。0で非表示、1で表示。デフォルト値:
0
戻り値
list[float]: 見つかった零点のリスト。
get_bessel_zeros(l, xmin=0.0, xmax=10.0, dx=0.1, print_level=0)
概要
球Bessel関数 j_l(x) の零点を計算します。
詳細説明
指定された次数 l の球Bessel関数 scipy.special.spherical_jn(l, x) を対象として、get_zeros() 関数を用いて零点を探索します。
引数
l(int): 球Bessel関数の次数 (軌道角運動量量子数)。xmin(float): 探索範囲の最小値。デフォルト値:
0.0
xmax(float): 探索範囲の最大値。デフォルト値:
10.0
dx(float): 初期探索におけるステップサイズ。デフォルト値:
0.1
print_level(int): デバッグ情報の出力レベル。get_zeros()関数に渡されます。デフォルト値:
0
戻り値
list[float]: 球Bessel関数の零点のリスト。
energy_level(meff, R, n, l, zeros)
概要
球対称量子井戸(量子ドット)のエネルギー準位を計算します。
詳細説明
無限に深い球対称ポテンシャル井戸モデルに基づき、与えられた量子数 n と l に対応するエネルギー準位を計算します。エネルギーは、球Bessel関数の零点 ``alpha_nl`` を用いて以下の式で求められます。
ここで ``k_nl = alpha_nl / R`` です。
E_{nl} = \frac{\hbar^2 k_{nl}^2}{2 m_{eff} m_e}
引数
meff(float): 電子の有効質量 (自由電子質量meに対する比率)。R(float): 量子ドットの半径 (m)。n(int): 主量子数 (1から始まる)。球Bessel関数のn番目の零点に対応。l(int): 軌道角運動量量子数。zeros(list[list[float]]): 球Bessel関数の零点のリスト。zeros[l][n-1]の形式で零点にアクセスします。
戻り値
tuple[float, float] or tuple[None, None]: 計算されたエネルギー準位 (eV) と対応する球Bessel関数の零点``alpha_nl``のタプル。零点が見つからない場合は(None, None)を返します。
cal()
概要
量子球のエネルギー準位を計算し、結果を標準出力に表示します。
詳細説明
設定された有効質量 meff と半径 R を持つ量子球(量子ドット)に対し、指定された範囲の主量子数 n と軌道角運動量量子数 l について、そのエネルギー準位を計算します。まず get_bessel_zeros() を用いて球Bessel関数の零点を取得し、次に energy_level() を用いて各準位のエネルギーを計算します。計算結果はエネルギーの低い順にソートされ、各準位の情報(量子数、エネルギー、零点値)が標準出力に出力されます。
戻り値
None: なし
plot_spherical_bessel(lmax, rmax, rmesh=500)
概要
球Bessel関数 j_l(x) をプロットします。
詳細説明
0 から lmax までの次数 l について、球Bessel関数 j_l(x) を 0 から rmax までの区間で計算し、matplotlib を用いてグラフを描画します。各関数の零点も get_bessel_zeros() を使用して計算し、グラフ上にマークします。グラフウィンドウが表示されます。
引数
lmax(int): プロットする球Bessel関数の最大次数 (l)。rmax(float): r軸の最大値。rmesh(int): r軸のデータポイント数。デフォルト値:
500
戻り値
None: なし
plot_H(nmax, rmax)
概要
水素原子の動径波動関数 R_nl(r) をプロットします。
詳細説明
水素原子の動径波動関数 R_nl(r) を、主量子数 n と軌道角運動量量子数 l の組み合わせに対して計算し、matplotlib を用いてグラフを描画します。genlaguerre() 関数(一般化されたラゲール多項式)を用いて計算が行われます。プロットされる動径 r の範囲は 0 から 20 まで(ボーア半径 a0 単位)です。なお、rmax 引数は現在の実装ではプロット範囲に影響を与えません。グラフウィンドウが表示されます。
引数
nmax(int): プロットする主量子数nの最大値。nは1からnmaxまで。rmax(float): (未使用) r軸の最大値として想定される値(ボーア半径a0単位)。
戻り値
None: なし
main()
概要
スクリプトのメイン実行関数。
詳細説明
コマンドライン引数 sys.argv[1] の値に基づいて、実行モードを決定します。
'cal'モードではcal()関数を呼び出し、量子球のエネルギー準位計算と表示を実行します。'plot'モードではplot_spherical_bessel()関数を呼び出し、球Bessel関数のプロットを実行します。'plotH'モードではplot_H()関数を呼び出し、水素原子の動径波動関数のプロットを実行します。
上記以外のモードが指定された場合はエラーメッセージを標準出力に表示し、スクリプトを終了します。
戻り値
None: なし
スクリプトの実行方法と入出力仕様
本スクリプト QD3D.py は、if __name__ == '__main__': ブロックで実行モードを決定し、対応する関数を呼び出します。
実行方法
基本的な実行コマンドは以下の通りです。
python QD3D.py <mode> [R_nm] [meff_ratio] [Z_atomic_number]
<mode>: 必須。実行モードを指定します (例:cal,plot,plotH)。[R_nm]: オプション。量子ドットの半径をナノメートル単位で指定します。calモードでのみ有効です。[meff_ratio]: オプション。電子の有効質量比率を指定します。calモードでのみ有効です。[Z_atomic_number]: オプション。原子番号を指定します。plotHモードでのみ有効ですが、コードからは使用されている箇所が確認できません。
入力
本スクリプトは、ファイルからの入力は受け付けません。全ての入力はコマンドライン引数を通じて行われます。
出力
実行モードによって出力が異なります。
calモード:量子ドットのエネルギー準位計算結果が標準出力に出力されます。
出力される情報には、有効質量、半径、球Bessel関数の零点、各準位の量子数 (
l,n,l+n)、エネルギー (eV)、対応する零点``alpha_n_l``とその2乗値が含まれます。
plotモード:球Bessel関数
j_l(kr)のグラフがmatplotlibのウィンドウに表示されます。グラフには、各次数
lの関数と、その零点がマークされます。零点の計算過程におけるデバッグ情報が標準出力に出力される場合があります (
print_levelが1の場合)。
plotHモード:水素原子の動径波動関数
R_nl(r)のグラフがmatplotlibのウィンドウに表示されます。
不正なモードが指定された場合:
エラーメッセージ
"Error: Invalid mode=<mode>"が標準出力に出力され、スクリプトが終了します。