N-T-Fit-semi_FEA.py 技術ドキュメント
プログラムの動作
N-T-Fit-semi_FEA.py は、Free Electron Approximation (FEA) に基づいて半導体のホール効果測定データ(キャリア濃度、移動度、電気伝導率、ホール係数)を温度の関数として解析するためのPythonスクリプトです。主な機能は以下の通りです。
シミュレーション (
simモード): 与えられた半導体パラメータ(有効質量、バンドギャップ、ドナー準位と濃度、アクセプター準位と濃度など)に基づき、フェルミ準位、電子濃度、正孔濃度、ホール係数などの温度依存性をシミュレートします。測定データがある場合は、それらと比較してグラフ表示し、活性化エネルギーも計算します。キャリア濃度フィッティング (
fit,fit_e,fit_hモード): 測定されたキャリア濃度 \(N\) の温度依存性を、非線形最小二乗法を用いてフィッティングします。fit: 電子と正孔の二重キャリアモデルを用いて \(N = |n_e - n_h|\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。fit_h: 正孔のみの単一キャリアモデルを用いて \(N = n_h\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。fit_e: 電子のみの単一キャリアモデルを用いて \(N = n_e\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。
ホール係数フィッティング (
fit_RHモード): 測定されたホール係数 \(R_H\) の温度依存性を、非線形最小二乗法を用いてフィッティングします。電子と正孔の二重キャリアモデルを使用し、散乱因子 \(r\) を考慮します。このモードではtkMobilityクラスで定義された移動度モデルが使用されます。
本プログラムは、半導体の電子構造や欠陥準位を評価するために、ホール効果測定データと理論モデルを比較する強力なツールを提供します。
原理
本プログラムは、Free Electron Approximation (FEA) に基づく半導体統計の計算と、scipyライブラリによる非線形最小二乗最適化を組み合わせています。
1. 半導体統計
半導体中のキャリア濃度は、フェルミ・ディラック統計に基づき、バンド内の状態密度 \(D(E)\) とフェルミ準位 \(E_F\) を用いて計算されます。
伝導帯の電子濃度 \(n_e\): $\(n_e = \int_{E_C}^{\infty} D_C(E) f(E, E_F, T) dE\)$
価電子帯の正孔濃度 \(n_h\): $\(n_h = \int_{-\infty}^{E_V} D_V(E) (1 - f(E, E_F, T)) dE\)\( ここで、\)f(E, E_F, T)\( はフェルミ・ディラック分布関数で、次のように定義されます。 \)\(f(E, E_F, T) = \frac{1}{1 + \exp\left(\frac{E - E_F}{k_B T}\right)}\)\( \)k_B\( はボルツマン定数、\)T$ は絶対温度です。
FEAでは、状態密度は有効質量 \(m^*\) を用いて以下のように表されます。
伝導帯の状態密度 \(D_C(E)\): $\(D_C(E) = \frac{1}{2\pi^2} \left(\frac{2 m_e^*}{\hbar^2}\right)^{3/2} \sqrt{E - E_C}\)$
価電子帯の状態密度 \(D_V(E)\): $\(D_V(E) = \frac{1}{2\pi^2} \left(\frac{2 m_h^*}{\hbar^2}\right)^{3/2} \sqrt{E_V - E}\)\( ここで、\)E_C\( は伝導帯底、\)E_V\( は価電子帯頂上、\)\hbar\( はディラック定数、\)m_e^\( は電子の有効質量、\)m_h^$ は正孔の有効質量です。
2. 不純物準位のイオン化
ドナー準位 \(E_D\) とアクセプター準位 \(E_A\) のイオン化状態も考慮されます。
アクセプターがイオン化している確率 \(f_{A^-}\): $\(f_{A^-}(E_A, E_F, T) = \frac{1}{1 + g_A \exp\left(\frac{E_A - E_F}{k_B T}\right)}\)\( \)g_A$ はアクセプター準位の縮退度です。
ドナーがイオン化している確率 \(f_{D^+}\): $\(f_{D^+}(E_D, E_F, T) = \frac{1}{1 + g_D \exp\left(\frac{E_F - E_D}{k_B T}\right)}\)\( \)g_D$ はドナー準位の縮退度です。
イオン化されたアクセプター濃度 \(N_A^-\) とドナー濃度 \(N_D^+\) は、それぞれの全濃度 \(N_A\), \(N_D\) と上記確率を用いて \(N_A^- = N_A f_{A^-}\)、\(N_D^+ = N_D f_{D^+}\) となります。
3. 電荷中性条件とフェルミ準位の決定
半導体全体の電荷中性条件は以下のように表されます。 $\(n_e + N_A^- = n_h + N_D^+\)\( この条件を満たすように、二分法などの数値計算手法を用いてフェルミ準位 \)E_F$ が決定されます。
4. ホール係数 \(R_H\)
ホール係数 \(R_H\) は、キャリアの濃度、移動度、散乱因子に依存します。
単一キャリアモデル: 電子のみの場合: \(R_H = - \frac{r_e}{e n_e}\) 正孔のみの場合: \(R_H = \frac{r_h}{e n_h}\) ここで \(e\) は素電荷、\(r_e, r_h\) はそれぞれ電子、正孔のホール因子です。
二重キャリアモデル: 電子と正孔の両方が寄与する場合のホール係数 \(R_H\) は、それぞれのキャリアの濃度 \(n_e, n_h\)、移動度 \(\mu_e, \mu_h\)、ホール因子 \(r_e, r_h\) を用いて計算されます。 $\(R_H = \frac{n_h r_h \mu_h^2 - n_e r_e \mu_e^2}{e (n_h \mu_h + n_e \mu_e)^2}\)\( `fit` モードでは \)r_e=r_h=0.5\( に固定されますが、`fit_RH` モードでは `mobility.rfac` に基づいてホール因子が決定されます。ホール因子 \)r_H\( は、キャリア散乱機構に依存し、緩和時間 \)\tau(E) = \tau_0 E^s\( の指数 \)s\( に応じて値が変わります(例えば、\)s=-1/2\( (音響フォノン散乱) で \)r_H \approx 1.18$)。
5. 最適化アルゴリズム
フィッティングには scipy.optimize.minimize 関数が使用されます。目的関数は、測定データとモデル計算値の間の二乗誤差(通常は対数スケールでの誤差)の合計 \(S^2\) です。
$\(S^2 = \frac{1}{N_{data}-1} \sum_{i} \left( \ln(Y_{obs,i} + \epsilon) - \ln(Y_{cal,i} + \epsilon) \right)^2\)\(
ここで \)Y_{obs,i}\( は観測値、\)Y_{cal,i}\( は計算値、\)\epsilon$ は対数計算時のゼロ除算を避けるための微小定数です。
最適化アルゴリズムとして、Nelder-Mead、Powell、CG (Conjugate Gradient)、BFGS、Newton-CG、Trust-NCG、Dogleg、L-BFGS-B、TNC、COBYLA、SLSQP、Trust-Constr、Trust-Exact、Trust-Krylov などが選択可能です(プログラムコードでは 'nelder-mead' がデフォルト)。
必要な非標準ライブラリとインストール方法
本プログラムを実行するには、以下の非標準ライブラリが必要です。
numpy: 数値計算
matplotlib: グラフ描画
scipy: 最適化機能 (
scipy.optimize.minimize)openpyxl: Excelファイル (
.xlsx) の読み込み(直接インポートされていませんが、tkTransport.read_Hall_excelが内部で利用する可能性があります)tklib: カスタムライブラリ(半導体統計、移動度モデル、ファイルI/Oなど)
これらのライブラリは pip コマンドでインストールできます。tklib については特別な設定が必要です。
# numpy, matplotlib, scipy, openpyxl のインストール
pip install numpy matplotlib scipy openpyxl
# tklib の設定
# tklib はカスタムライブラリであるため、手動でPythonの検索パスに追加する必要があります。
# 通常は、`c:/tkProg/tklib/python` や `d:/tkProg/tklib/python` のようなディレクトリに
# tklibライブラリのソースコードを配置し、Pythonスクリプトからそのパスを追加します。
# プログラムコード中に以下の行があるため、tklibがこれらのパスに存在することが期待されます。
# sys.path.append("c:/tkProg/tklib/python")
# sys.path.append("d:/tkProg/tklib/python")
# したがって、tklibのインストールは、該当するディレクトリにtklibのPythonモジュールを
# 配置する作業となります。
必要な入力ファイル
本プログラムは、ホール効果測定データを含むExcelファイル (.xlsx) またはCSVファイル (.csv) を入力として期待します。
ファイルには、以下のヘッダーを持つ列が含まれている必要があります。
T: 温度 (K)N: キャリア濃度 (cm\(^{-3}\))mu: 移動度 (cm\(^2\)/(V\(\cdot\)s))sigma: 電気伝導率 (S/cm)RH: ホール係数 (cm\(^3\)/C) -fit_RHモードまたはsimモードで必要
ファイル例 (example.xlsx または example.csv):
T |
N |
mu |
sigma |
RH |
|---|---|---|---|---|
300 |
1.00E+18 |
200 |
32.0 |
6.25E-03 |
350 |
1.20E+18 |
180 |
34.6 |
5.21E-03 |
400 |
1.50E+18 |
160 |
38.4 |
4.17E-03 |
... |
... |
... |
... |
... |
生成される出力ファイル
プログラムの実行モードに応じて、以下のファイルが生成または更新されます。
パラメータファイル (
[infile_body].in): 入力ファイル名 (infile) の本体部分(拡張子を除く)に.inが付加されたファイルが、最適化された半導体パラメータ(有効質量、バンドギャップ、ドナー・アクセプター準位と濃度、散乱因子など)とプログラム設定を保存するために生成されます。フィッティングモードの場合、最適化後にこのファイルが更新されます。パラメータバックアップファイル (
[infile_body].in.bak):.inファイルの更新前に、既存の.inファイルがある場合はその内容が.in.bakファイルにバックアップされます。データ出力CSVファイル (
[infile_body]-EFT-[mode].csv): 入力ファイル名から生成されたファイル名に-EFT-[mode].csvが付加されたCSVファイルが、シミュレーションまたはフィッティングの結果として生成されます。このファイルには、以下のデータ列が含まれます。T: 温度 (K)1000/T: 逆温度 (1000/K)EF(eV): フェルミ準位 (eV)Ne,obs(cm-3): 測定キャリア濃度 (cm\(^{-3}\))Ne,fin: 計算された電子濃度 (cm\(^{-3}\)) (最終値)Nh,fin: 計算された正孔濃度 (cm\(^{-3}\)) (最終値)NA-,fin: イオン化アクセプター濃度 (cm\(^{-3}\)) (最終値)ND+,fin: イオン化ドナー濃度 (cm\(^{-3}\)) (最終値)RH,fin: 計算されたホール係数 (cm\(^3\)/C) (最終値)Ns,fin: 計算された正味キャリア濃度 \(|n_e - n_h|\) (cm\(^{-3}\)) (最終値)mu(Hall)(cm2/Vs): 測定移動度 (cm\(^2\)/(V\(\cdot\)s))mu,fin: 計算された移動度 (cm\(^2\)/(V\(\cdot\)s)) (最終値)FH,e: 電子のホール因子FH,h: 正孔のホール因子Ne,Hall: ホール測定から導出される電子濃度Nh,Hall: ホール測定から導出される正孔濃度 (fitモードではFH,e,FH,h,Ne,Hall,Nh,Hallは出力されません)
コマンドラインでの使用例 (Usage)
Usage: Variables in () are optional
python N-T-Fit-semi_FEA.py mode (file args)
(i) python N-T-Fit-semi_FEA.py sim infile(.xlsx) EC EA NA ED ND
Plot N-T with simulated data
ex: python N-T-Fit-semi_FEA.py sim infile.xlsx 1.1 0.05 1e17 1.05 1e16
(ii) python N-T-Fit-semi_FEA.py fit|fit_h|fit_e|fit_RH infile(.xlsx) EC EA NA ED ND (Eb a1 a2)
Fit to N-mu-T data
mode = fit : Fit to Ns = 1/eRH by two-carrier (hole-electron) model. Scattering factor is fixed to r = 0.5
fit_h : Fit to Nh by single-carrier model. Scattering factor is fixed to r = 0.5
fit_e : Fit to Ne by single-carrier model. Scattering factor is fixed to r = 0.5
fit_RH: Fit to RH by two-carrier (hole-electron) model with scattering factor
ex: python N-T-Fit-semi_FEA.py fit infile.xlsx 1.1 0.05 1e17 1.05 1e16
引数の説明:
mode: 実行モードを指定します。sim: シミュレーションモードfit: キャリア濃度 \(N=|n_e-n_h|\) を二重キャリアモデルでフィッティング (r=0.5固定)fit_h: キャリア濃度 \(N=n_h\) を正孔単一キャリアモデルでフィッティング (r=0.5固定)fit_e: キャリア濃度 \(N=n_e\) を電子単一キャリアモデルでフィッティング (r=0.5固定)fit_RH: ホール係数 \(R_H\) を二重キャリアモデルでフィッティング (散乱因子rを考慮)
infile(.xlsx): 入力データファイル名 (ExcelまたはCSV)。EC: 伝導帯底のエネルギー (eV)。EA: アクセプター準位のエネルギー (価電子帯頂上EV=0.0からの相対値, eV)。NA: アクセプター濃度 (cm\(^{-3}\))。ED: ドナー準位のエネルギー (価電子帯頂上EV=0.0からの相対値, eV)。ND: ドナー濃度 (cm\(^{-3}\))。(Eb a1 a2): オプションの移動度モデルパラメータ。コード中ではtkMobilityクラスで使用される可能性のあるパラメータですが、デフォルトのtkMobility設定では直接コマンドラインで指定されることはありません。
コマンドラインでの具体的な使用例
ここでは、sample.xlsxという入力ファイルが存在し、それにT, N, mu, sigma, RHの列が含まれていると仮定します。
例1: シミュレーションモード
sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでキャリア濃度、ホール係数などの温度依存性をシミュレートします。
python N-T-Fit-semi_FEA.py sim sample.xlsx 1.1 0.05 1e17 1.05 1e16
実行結果の説明:
プログラムは指定されたパラメータを用いて、温度 \(T\) に対するフェルミ準位 \(E_F\)、電子濃度 \(n_e\)、正孔濃度 \(n_h\)、ホール係数 \(R_H\) などの温度依存性を計算します。
コンソールには、初期パラメータでの計算結果と活性化エネルギーの分析結果が出力されます。
sample.inファイルが生成(または更新)され、初期設定とシミュレーションパラメータが保存されます。sample-EFT-sim.csvファイルが生成され、計算されたすべての温度依存データ(\(T\), \(E_F\), \(n_e\), \(n_h\), \(R_H\), ホール因子など)が保存されます。matplotlibによりグラフウィンドウがポップアップ表示され、測定データ(N, mu)とシミュレーション結果(\(n_e\), \(n_h\), \(|n_s|\))が比較表示されます。また、Hall因子とフェルミ準位、活性化エネルギーの温度依存性もプロットされます。ユーザーがEnterキーを押すとプログラムが終了します。
例2: キャリア濃度フィッティングモード (fit)
sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでキャリア濃度 \(N\) を二重キャリアモデルでフィッティングします。ここでは、アクセプター準位 \(E_A\) と濃度 \(N_A\) を最適化対象とします(dos.optid設定に依存しますが、この例ではEAとNAが最適化されると仮定します)。
python N-T-Fit-semi_FEA.py fit sample.xlsx 1.1 0.05 1e17 1.05 1e16
実行結果の説明:
プログラムは
sample.xlsxから測定データ (T, N, mu, sigma) を読み込みます。初期パラメータでのキャリア濃度の温度依存性が計算され、コンソールに出力されます。
matplotlibのグラフウィンドウが表示され、初期パラメータでの計算結果が測定データと共にプロットされます。
scipy.optimize.minimizeを用いた非線形最小二乗フィッティングが開始され、最適化の進行状況(イテレーションごとのパラメータ値とS2値)がコンソールに出力されます。フィッティング中に、
cparams.graphupdateinterval(デフォルト10) 回のイテレーションごとにグラフが更新され、現在のフィッティング結果がリアルタイムで表示されます。最適化が完了すると、コンソールに最終的な最適化されたパラメータ値と最小二乗誤差 \(S^2\) が表示されます。
sample.inファイルが更新され、最適化されたパラメータが保存されます。sample-EFT-fit.csvファイルが生成され、測定データとフィッティング結果が保存されます。最終的なフィッティング結果を示すグラフが更新され、ユーザーがEnterキーを押すとプログラムが終了します。
例3: ホール係数フィッティングモード (fit_RH)
sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでホール係数 \(R_H\) を二重キャリアモデルでフィッティングします。
python N-T-Fit-semi_FEA.py fit_RH sample.xlsx 1.1 0.05 1e17 1.05 1e16
実行結果の説明:
fitモードと同様に、sample.xlsxから測定データ (T, N, mu, sigma, RH) を読み込みます。初期パラメータでのキャリア濃度、ホール係数などの温度依存性が計算され、コンソールに出力されます。
fitモードと同様に、グラフウィンドウが表示され、初期プロットの後、最適化の進行に応じてグラフが更新されます。fitモードとは異なり、最適化の目的関数はホール係数 \(R_H\) の二乗誤差に基づきます。最適化完了後、コンソールに最終的なパラメータと \(S^2\) が出力されます。
sample.inファイルが更新され、最適化されたパラメータが保存されます。sample-EFT-fit_RH.csvファイルが生成され、測定データとフィッティング結果に加え、Hall因子やホール測定から導出されるキャリア濃度なども保存されます。最終グラフが表示され、ユーザーがEnterキーを押すとプログラムが終了します。