プログラム kronig_penney.py のドキュメント
1. 概要
kronig_penney.py は、Kronig-Penneyモデルを用いて1次元のバンド計算を実行するPythonスクリプトです。このプログラムは、半導体の電子バンド構造を矩形ポテンシャルでモデル化し、その結果をグラフ表示、バンド図プロット、または波動関数プロットのいずれかのモードで出力します。
2. 非標準ライブラリ
本プログラムは以下の非標準ライブラリを使用しています。
numpy: 数値計算、特に配列操作や数学関数 (sqrt,exp,sin,cos,tan,cosh,sinhなど) のために使用されます。線形代数演算 (numpy.linalgのLA) も利用されます。matplotlib.pyplot: 計算結果をグラフとして可視化するために使用されます。
3. 定数
プログラム内で定義されている物理定数および数学定数は以下の通りです。
pi(float): 円周率 (3.14159265358979323846)pi2(float): 2 *pih(float): プランク定数 (6.6260755e-34 Js)hbar(float): ディラック定数 (1.05459e-34 Js)c(float): 真空中の光速 (2.99792458e8 m/s)e(float): 素電荷 (1.60218e-19 C)e0(float): 真空の誘電率 (8.854418782e-12 C^2 N^-1 m^-2)kB(float): ボルツマン定数 (1.380658e-23 JK^-1)me(float): 電子の質量 (9.1093897e-31 kg)R(float): 気体定数 (8.314462618 J/K/mol)a0(float): ボーア半径 (5.29177e-11 m)
4. グローバル設定
プログラムの動作を制御するグローバル変数は以下の通りです。これらの一部はコマンドライン引数で上書き可能です。
モード設定
mode(str): プログラムの実行モード。デフォルトは'graph'。取りうる値は'graph'(エネルギーとdelta(E)の関係をプロット),'band'(エネルギーバンド構造をプロット),'wf'(波動関数をプロット) です。
結晶定義
a(float): 格子定数 (オングストロームA)。デフォルトは5.4064 A(シリコンSiの値)。
ポテンシャル設定
bwidth(float): ポテンシャル障壁の幅 (A)。デフォルトは0.5 A。bpot(float): ポテンシャル障壁の高さ (eV)。デフォルトは10.0 eV。
graphview()モード設定kg(float): プロットする波数 (pi/a単位)。デフォルトは0.0。Emin(float): エネルギー走査の最小値 (eV)。デフォルトは0.0。Emax(float): エネルギー走査の最大値 (eV)。デフォルトは9.5。nE(int): グラフを表示するエネルギー点の数。デフォルトは51。nEsearch(int): 解を走査するエネルギー点の数。デフォルトはnEと同じ (51)。eps(float): Secant法の収束判定許容誤差。デフォルトは1.0e-8。nmaxiter(int): Secant法の最大繰り返し回数。デフォルトは100。dump(float): Secant法の収束を助けるための微小な値。デフォルトは0.0。
band()モード設定kmin(float): ブロッホ波数kの最小値 (pi/a単位)。デフォルトは-0.5。kmax(float): ブロッホ波数kの最大値 (pi/a単位)。デフォルトは0.5。nk(int):k点の数。デフォルトは21。Erange(listoffloat): プロットするエネルギー範囲[E_min, E_max](eV)。デフォルトは[0.0, 10.0]。nMaxLevel(int): リストに保存する準位の最大数。デフォルトは15。
wf()モード設定xwmin(float): 波動関数を描画するx範囲の最小値 (A)。デフォルトは0.0。xwmax(float): 波動関数を描画するx範囲の最大値 (A)。デフォルトは3.0 * a。nxw(int): 波動関数を描画するx点の数。デフォルトは101。kw(float): 描画する波動関数の波数 (pi/a単位)。デフォルトは0.0。iLevel(int): 描画する波動関数の準位番号 (0から始まるインデックス)。デフォルトは0。
描画設定 (
matplotlib)figsize(tupleoffloat): 図のサイズ (幅, 高さ)。デフォルトは(6, 8)。fontsize(int): 軸ラベルなどのフォントサイズ。デフォルトは12。legend_fontsize(int): 凡例のフォントサイズ。デフォルトは8。
5. コマンドライン引数
プログラムはコマンドライン引数を受け付け、グローバル設定の一部を上書きできます。引数は位置によって解釈されます。
5.1. 基本的な使い方
引数なしで実行すると、デフォルト設定で graph モードが実行されます。
python kronig_penney.py
5.2. 各モードの引数
コマンドライン引数の最初の要素 (sys.argv[1]) は実行モードを指定します。2番目以降の引数はモードによって異なります。
共通引数: 常に以下の順序で指定されます。
mode(str): 実行モード (graph,band, またはwf)。a(float): 格子定数。bwidth(float): ポテンシャル障壁の幅。bpot(float): ポテンシャル障壁の高さ。
graphモードの追加引数:kg(float): プロットする波数。Emin(float): エネルギー走査の最小値。Emax(float): エネルギー走査の最大値。nE(int): グラフを表示するエネルギー点の数。
bandモードの追加引数:kmin(float): ブロッホ波数kの最小値。kmax(float): ブロッホ波数kの最大値。nk(int):k点の数。
wfモードの追加引数:kw(float): 描画する波動関数の波数。iLevel(int): 描画する波動関数の準位番号。xwmin(float): 波動関数を描画するx範囲の最小値。xwmax(float): 波動関数を描画するx範囲の最大値。nxw(int): 波動関数を描画するx点の数。
引数はオプションであり、指定されない場合は対応するグローバル変数のデフォルト値が使用されます。
6. 入出力
6.1. 入力ファイル
本プログラムは入力ファイルを読み込みません。すべての設定はソースコード内のグローバル変数またはコマンドライン引数を通じて行われます。
6.2. 出力ファイル
本プログラムは計算結果をファイルに保存しません。
6.3. 標準出力
プログラムは、初期パラメータ、計算の進行状況(特に find_Elist() 関数でのエネルギー準位の探索結果)、エラーメッセージ、および終了時のプロンプトを標準出力に出力します。
6.4. グラフィック出力
matplotlib.pyplot を使用して計算結果をグラフとして画面に表示します。ユーザーが ENTER キーを押すまでグラフは表示され続けます。
7. 主要関数
7.1. pfloat(str)
概要: 文字列を
float型に安全に変換します。詳細説明: 変換できない場合は
Noneを返します。引数:
str(str): 変換する文字列。
戻り値:
floatまたはNone: 変換されたfloat値、またはNone。
7.2. pint(str)
概要: 文字列を
int型に安全に変換します。詳細説明: 変換できない場合は
Noneを返します。引数:
str(str): 変換する文字列。
戻り値:
intまたはNone: 変換されたint値、またはNone。
7.3. getarg(position, defval=None)
概要: コマンドライン引数を安全に取得します。
詳細説明: 指定された位置の引数が存在しない場合、デフォルト値を返します。
引数:
position(int): 取得する引数の位置(インデックス)。defval(Any, optional): 引数が存在しない場合に返すデフォルト値。デフォルトはNone。
戻り値:
Any: 指定された位置の引数、またはデフォルト値。
7.4. getfloatarg(position, defval=None)
概要: コマンドライン引数を
float型に変換して安全に取得します。詳細説明: 指定された位置の引数が存在しない場合や
floatに変換できない場合、デフォルト値を返します。引数:
position(int): 取得する引数の位置(インデックス)。defval(floatまたはNone, optional): 引数が存在しない場合や変換できない場合に返すデフォルト値。デフォルトはNone。
戻り値:
floatまたはNone: 変換されたfloat値の引数、またはデフォルト値。
7.5. getintarg(position, defval=None)
概要: コマンドライン引数を
int型に変換して安全に取得します。詳細説明: 指定された位置の引数が存在しない場合や
intに変換できない場合、デフォルト値を返します。引数:
position(int): 取得する引数の位置(インデックス)。defval(intまたはNone, optional): 引数が存在しない場合や変換できない場合に返すデフォルト値。デフォルトはNone。
戻り値:
intまたはNone: 変換されたint値の引数、またはデフォルト値。
7.6. round01(x, a)
概要: 数値を区間
[0, a)にマッピングし、周期的なオフセットを計算します。詳細説明:
x = n * a + x0となるようなx0と整数nを計算します。x0は0 <= x0 < aの範囲に収まります。引数:
x(float): マッピング対象の数値。a(float): 周期の幅。
戻り値:
tuple(float,int):xをaで割った余りx0と整数nのタプル。
7.7. usage()
概要: スクリプトの正しい使用方法を標準出力に表示します。
詳細説明: コマンドライン引数の形式といくつかの使用例を示します。
7.8. terminate(message=None)
概要: エラーメッセージを表示してプログラムを終了します。
詳細説明:
usage()関数を呼び出した後、指定されたメッセージ(任意)を表示してプログラムを終了します。引数:
message(strまたはNone, optional): 表示するエラーメッセージ(オプション)。デフォルトはNone。
7.9. pot(x)
概要: 矩形ポテンシャル関数を定義します。
詳細説明:
0 <= x < a - bwidthの範囲ではポテンシャルは0、a - bwidth <= x < aの範囲ではbpotのポテンシャルを返します。周期aを持ちます。グローバル変数a,bwidth,bpotを使用します。引数:
x(float): 位置 (A)。
戻り値:
float: 指定された位置xにおけるポテンシャル値 (eV)。
7.10. build_potential(xmin, xstep, n)
概要: 指定された範囲でポテンシャルプロファイルを作成します。
詳細説明:
xminから開始し、n個の点に対してxstep間隔でポテンシャル値を計算します。引数:
xmin(float): 最初のx座標 (A)。xstep(float):x座標のステップ幅 (A)。n(int): 計算する点の数。
戻り値:
tuple(numpy.ndarray,numpy.ndarray):x座標の配列と対応するポテンシャル値の配列のタプル。
7.11. cal_delta(E, k, w, b, V0)
概要: Kronig-Penneyモデルのエネルギー方程式の左辺
delta(E)を計算します。詳細説明: エネルギー
Eと波数k、ポテンシャルパラメータw、b、V0を用いて、周期的な結晶における電子のエネルギー準位を決定する方程式の値を計算します。delta(E) = cos(ka)となるEが許容エネルギーとなります。引数:
E(float): 電子のエネルギー (eV)。k(float): ブロッホ波数 (単位:pi/a)。w(float): ポテンシャル井戸の幅 (A)。b(float): ポテンシャル障壁の幅 (A)。V0(float): ポテンシャル障壁の高さ (eV)。
戻り値:
float: Kronig-Penneyモデル方程式の左辺の値。
7.12. check_ci(ci, kw, Ei, w, b, V0, eps, IsPrint=0)
概要: 波束係数
ciがKronig-Penneyモデルの境界条件を満たしているか検証します (デバッグ用)。詳細説明: 4つの境界条件式に
ciを代入し、その結果がepsより小さいかを確認します。満たさない場合はエラーで終了します。引数:
ci(listofcomplex): 波動関数の係数リスト。kw(float): ブロッホ波数 (単位:pi/a)。Ei(float): 電子のエネルギー (eV)。w(float): ポテンシャル井戸の幅 (A)。b(float): ポテンシャル障壁の幅 (A)。V0(float): ポテンシャル障壁の高さ (eV)。eps(float): 許容誤差。IsPrint(int, optional): 詳細を出力するかどうかのフラグ (0: なし, 1: あり)。デフォルトは0。
7.13. refine_E(E0, E1, nmaxiter, eps, dump, k, w, b, V0, IsPrint=0)
概要: Secant法を用いてKronig-Penneyモデルの許容エネルギー
Eを高精度化します。詳細説明:
cal_delta(E)=0となるEをSecant法で探索し、収束したエネルギー値を返します。引数:
E0(float): 探索範囲の下限エネルギー (eV)。E1(float): 探索範囲の上限エネルギー (eV)。nmaxiter(int): 最大繰り返し回数。eps(float): 収束判定の許容誤差。dump(float): 収束を助けるための微小な値。k(float): ブロッホ波数 (単位:pi/a)。w(float): ポテンシャル井戸の幅 (A)。b(float): ポテンシャル障壁の幅 (A)。V0(float): ポテンシャル障壁の高さ (eV)。IsPrint(int, optional): 詳細を出力するかどうかのフラグ (0: なし, 1: あり)。デフォルトは0。
戻り値:
tuple(float,float,float) または (None,None,None): 収束したエネルギー (float)、最終的なエネルギー変化 (float)、最終的なdelta値 (float) のタプル。収束しない場合はNoneのタプル。
7.14. find_Elist(Emin, Emax, nEsearch, k, w, b, V0)
概要: 指定されたエネルギー範囲でKronig-Penneyモデルの許容エネルギー準位と対応する係数を見つけます。
詳細説明:
EminからEmaxまでをnEsearch分割してcal_delta(E)の符号反転を探索し、Secant法で厳密なエネルギー値を特定します。同時に波動関数の係数ciも計算します。引数:
Emin(float): 探索するエネルギー範囲の最小値 (eV)。Emax(float): 探索するエネルギー範囲の最大値 (eV)。nEsearch(int): エネルギー範囲の探索ステップ数。k(float): ブロッホ波数 (単位:pi/a)。w(float): ポテンシャル井戸の幅 (A)。b(float): ポテンシャル障壁の幅 (A)。V0(float): ポテンシャル障壁の高さ (eV)。
戻り値:
tuple(listoffloat,listoflistofcomplex): 許容エネルギー準位のリストと、各準位に対応する波動関数係数のリストのタプル。
7.15. cal_wavefunction(ci, x, kw, Ei, w, b, V0)
概要: 指定された係数
ciを用いて、Kronig-Penneyモデルの波動関数Psi(x)を計算します。詳細説明: ブロッホの定理に基づき
Psi(x) = exp(ikx) * u(x)の形式で波動関数を構築します。u(x)は周期関数で、ポテンシャル障壁内外で異なる形を取ります。引数:
ci(listofcomplex): 波動関数の係数リスト。x(float): 波動関数を評価する位置 (A)。kw(float): ブロッホ波数 (単位:pi/a)。Ei(float): 電子のエネルギー (eV)。w(float): ポテンシャル井戸の幅 (A)。b(float): ポテンシャル障壁の幅 (A)。V0(float): ポテンシャル障壁の高さ (eV)。
戻り値:
complex: 位置xにおける複素波動関数の値。
7.16. wf()
概要: Kronig-Penneyモデルにおける波動関数を計算し、プロットします。
詳細説明: グローバル変数
kwとiLevelに対応するエネルギー準位を計算し、その波動関数をxwminからxwmaxの範囲で描画します。ポテンシャルプロファイルも重ねて表示します。描画後、ユーザーの入力(ENTERキー)を待ち、プログラムを終了します。グローバル変数mode,a,bwidth,bpot,nEsearch,nMaxLevel,kw,iLevel,xwmin,xwmax,nxwを使用します。
7.17. band()
概要: Kronig-Penneyモデルのエネルギーバンド構造を計算し、プロットします。
詳細説明: 指定された波数範囲 (
kminからkmax) で複数のk点に対して許容エネルギー準位を計算し、E-k図(バンド構造)をプロットします。描画後、ユーザーの入力(ENTERキー)を待ち、プログラムを終了します。グローバル変数mode,a,bwidth,bpot,kmin,kmax,nk,nEsearch,nMaxLevelを使用します。
7.18. graphview()
概要: Kronig-Penneyモデルの許容エネルギー方程式の
delta(E)関数をプロットします。詳細説明: 特定の波数
kgに対して、エネルギーEの関数としてのcal_delta(E)の値を計算し、グラフ表示します。delta(E)=0となる点が許容エネルギー準位を示します。描画後、ユーザーの入力(ENTERキー)を待ち、プログラムを終了します。グローバル変数mode,a,bwidth,bpot,Emin,Emax,nEを使用します。
7.19. main()
概要: プログラムのエントリポイント。
詳細説明: コマンドライン引数で指定された
modeに応じて、graphview()、band()、またはwf()関数を呼び出します。無効なモードが指定された場合はエラーメッセージを表示して終了します。グローバル変数modeを使用します。
8. 実行例
以下に、各モードでのプログラムの実行例を示します。
8.1. デフォルト設定 (graph モード)
python kronig_penney.py
8.2. graph モードの指定例
python kronig_penney.py graph 5.4064 0.5 10.0 0.0 0.0 9.5 51
8.3. band モードの指定例
python kronig_penney.py band 5.4064 0.5 10.0 -0.5 0.5 21
8.4. wf モードの指定例
python kronig_penney.py wf 5.4064 0.5 10.0 0.0 0 0.0 16.2192 101