EF-T-semiconductor.py 技術ドキュメント
プログラムの動作
本プログラム EF-T-semiconductor.py は、非縮退半導体のフェルミ準位(\(E_F\))の温度依存性を二分法を用いて計算します。計算されたフェルミ準位、電子密度、正孔密度、イオン化アクセプタ密度、およびイオン化ドナー密度の温度に対する変化を標準出力に表形式で表示し、さらに matplotlib を使用してグラフとして可視化します。これにより、半導体の電気的特性が温度によってどのように変化するかを分析することが目的です。
原理
このプログラムは、半導体中の電荷中性条件を満たすフェルミ準位を、指定された温度範囲で二分法(Bisection method)によって探索します。
半導体における電荷中性条件は、以下の式で表されます。
ここで、各項は以下の数式で定義されます。
電子密度 (\(N_e\)): 伝導帯の電子濃度を示します。 $\(N_e = N_c \exp\left(-\frac{(E_c - E_F)e}{k_B T}\right)\)$
正孔密度 (\(N_h\)): 価電子帯の正孔濃度を示します。 $\(N_h = N_v \exp\left(-\frac{(E_F - E_v)e}{k_B T}\right)\)$
イオン化アクセプタ密度 (\(N_A^-\)): アクセプタ準位が電子を受け取り、負に帯電した状態の濃度を示します。 $\(N_A^- = N_A f(E_A, E_F, T)\)$
イオン化ドナー密度 (\(N_D^+\)): ドナー準位が電子を放出し、正に帯電した状態の濃度を示します。 $\(N_D^+ = N_D (1 - f(E_D, E_F, T))\)$
上記の式で使用されるフェルミ・ディラック関数 \(f(E, E_F, T)\) は以下で定義されます。
各記号は以下の物理量と定数を表します。
\(e\): 電気素量 (\(1.60218 \times 10^{-19}\) \(C\))
\(k_B\): ボルツマン定数 (\(1.380658 \times 10^{-23}\) \(J K^{-1}\))
\(E_v\): 価電子帯上端エネルギー (eV)
\(E_c\): 伝導帯下端エネルギー (eV)
\(N_v\): 価電子帯有効状態密度 (\(cm^{-3}\))
\(N_c\): 伝導帯有効状態密度 (\(cm^{-3}\))
\(E_A\): アクセプタ準位 (eV)
\(N_A\): アクセプタ密度 (\(cm^{-3}\))
\(E_D\): ドナー準位 (eV)
\(N_D\): ドナー密度 (\(cm^{-3}\))
\(T\): 温度 (K)
\(E_F\): フェルミ準位 (eV)
プログラムは、電荷中性条件を \(F(E_F) = N_e + N_A^- - N_h - N_D^+ = 0\) という方程式として定式化し、この方程式の根を二分法で求めます。二分法では、まず \(E_F\) の初期探索範囲として \(E_v - 1.0\) eV から \(E_c + 1.0\) eV を設定し、この範囲の両端で \(F(E_F)\) の符号が異なることを確認します。その後、中間点における \(F(E_F)\) の符号を評価しながら探索範囲を繰り返し半分に狭め、フェルミ準位の収束精度 (\(eps = 1.0 \times 10^{-5}\)) に達するまで計算を続行します。
必要な非標準ライブラリとインストール方法
本プログラムの実行には、以下のPython非標準ライブラリが必要です。
numpy: 数値計算(特に指数関数expなどの数学関数)を効率的に行うためのライブラリ。matplotlib: 計算結果をグラフとして可視化するためのライブラリ。
これらのライブラリは、Pythonのパッケージインストーラである pip コマンドを使用してインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。
pip install numpy matplotlib
必要な入力ファイル
本プログラムは外部入力ファイルを必要としません。 半導体パラメータ(\(E_A, N_A, E_D, N_D, E_c, N_v, N_c\))はプログラムの冒頭でデフォルト値が設定されており、必要に応じてコマンドライン引数としてこれらの値を指定して実行することができます。
生成される出力ファイル
本プログラムは、計算結果を以下の形式で出力します。
標準出力 (コンソール): 各温度におけるフェルミ準位 \(E_F\)、電子密度 \(N_e\)、正孔密度 \(N_h\)、イオン化アクセプタ密度 \(N_A^-\)、イオン化ドナー密度 \(N_D^+\) の数値データが、表形式でターミナルに出力されます。
出力例:
Solution of EF by bisection method Ev=0.000000 Ec=1.000000 eV Nv=1.200000e+19 Nc=2.100000e+18 cm-3 NA=1.000000e+15 cm-3 EA=0.050000 eV ND=1.000000e+16 cm-3 ED=0.950000 eV T(K) EF(eV) Ne(cm-3) Nh(cm-3) NA+(cm-3) ND-(cm-3) 50.0000 0.063428 1.3207e+12 1.6882e+02 1.0000e+15 1.0000e+15 60.0000 0.076115 1.2750e+12 1.3282e+03 1.0000e+15 1.0000e+15 ...
グラフウィンドウ:
matplotlibを使用して、以下の2つのサブプロットを含むグラフウィンドウがインタラクティブに表示されます。EF vs. T: 温度 \(T\) (K) に対するフェルミ準位 \(E_F\) (eV) の変化を示すプロット。価電子帯上端 \(E_v\) と伝導帯下端 \(E_c\) のエネルギーレベルが赤色の線で示されます。
キャリア密度 vs. 1000/T: 逆温度 \(1000/T\) (\(K^{-1}\)) に対する電子密度 \(N_e\)、正孔密度 \(N_h\)、イオン化アクセプタ密度 \(N_A^-\)、イオン化ドナー密度 \(N_D^+\) の対数スケールプロット。
これらのグラフは、ユーザーがコンソールでEnterキーを押すまで表示され続けます。プログラムによってファイルとして保存されることはありません。
コマンドラインでの使用例 (Usage)
本プログラムは、コマンドライン引数を使用して半導体パラメータをカスタマイズして実行できます。引数を指定しない場合は、プログラムに組み込まれたデフォルト値が使用されます。
基本的な実行コマンドは以下の形式です。
python EF-T-semiconductor.py [EA] [NA] [ED] [ND] [Ec] [Nv] [Nc]
各引数とその意味は以下の通りです(全てfloat型の数値として指定します)。
EA: アクセプタ準位 (eV)NA: アクセプタ密度 (\(cm^{-3}\))ED: ドナー準位 (eV)ND: ドナー密度 (\(cm^{-3}\))Ec: 伝導帯下端エネルギー (eV)Nv: 価電子帯有効状態密度 (\(cm^{-3}\))Nc: 伝導帯有効状態密度 (\(cm^{-3}\))
コマンドラインでの具体的な使用例
以下に、具体的な半導体パラメータをコマンドライン引数として指定してプログラムを実行する例と、その実行結果の概要を示します。
実行コマンド:
python EF-T-semiconductor.py 0.05 1.0e15 0.95 1.0e16 1.0 1.2e19 2.1e18
このコマンドは、以下のパラメータを設定してシミュレーションを実行します。
\(E_A = 0.05\) eV
\(N_A = 1.0 \times 10^{15}\) \(cm^{-3}\)
\(E_D = 0.95\) eV
\(N_D = 1.0 \times 10^{16}\) \(cm^{-3}\)
\(E_c = 1.0\) eV
\(N_v = 1.2 \times 10^{19}\) \(cm^{-3}\)
\(N_c = 2.1 \times 10^{18}\) \(cm^{-3}\)
実行結果:
標準出力: コマンドの実行後、ターミナルには設定された半導体パラメータと、\(T=50\) K から \(T=1000\) K までの各温度におけるフェルミ準位および各種キャリア密度が表形式で出力されます。出力の最後の行は、ユーザーにEnterキーの入力を促すメッセージが表示されます。
Solution of EF by bisection method Ev=0.000000 Ec=1.000000 eV Nv=1.200000e+19 Nc=2.100000e+18 cm-3 NA=1.000000e+15 cm-3 EA=0.050000 eV ND=1.000000e+16 cm-3 ED=0.950000 eV T(K) EF(eV) Ne(cm-3) Nh(cm-3) NA+(cm-3) ND-(cm-3) 50.0000 0.063428 1.3207e+12 1.6882e+02 1.0000e+15 1.0000e+15 60.0000 0.076115 1.2750e+12 1.3282e+03 1.0000e+15 1.0000e+15 ... 990.0000 0.448530 2.4239e+18 2.4239e+18 1.6053e+15 1.6053e+15 1000.0000 0.448530 2.4411e+18 2.4411e+18 1.6053e+15 1.6053e+15 Press ENTER to exit>>
この出力は、指定された半導体における低温から高温までのキャリア挙動を示し、フェルミ準位が温度によってどのように変化するかが数値で確認できます。
グラフウィンドウ: 上記の数値出力と同時に、
matplotlibによってグラフウィンドウがポップアップ表示されます。左側のグラフでは、温度が上昇するにつれてフェルミ準位 \(E_F\) が価電子帯上端 \(E_v\) から伝導帯下端 \(E_c\) の中間付近へと変化していく様子が視覚的に表示されます。
右側のグラフでは、逆温度に対する電子密度、正孔密度、イオン化アクセプタ密度、イオン化ドナー密度が対数スケールでプロットされ、異なる温度領域でのこれらのキャリア濃度の相対的な大きさとその変化傾向を直感的に把握できます。 このグラフは、コンソールでEnterキーを押すまで表示されたままになります。