Ne_T_fit.py 技術ドキュメント
プログラムの動作
Ne_T_fit.py は、半導体の温度依存性キャリア濃度(電子濃度 \(N_e(T)\))をシミュレーションし、実験データにフィッティングするためのPythonプログラムです。主に以下の3つのモードで動作します。
readモード: CSV/TSVまたはExcelファイルから実験データを読み込み、その内容を標準出力に表示し、温度 \(T\) または \(1000/T\) に対して \(N_e\) をプロットします。simモード: ユーザーが指定した物理パラメータ(バンドギャップ \(E_g\)、ドナー・アクセプター準位と濃度、有効質量など)に基づいて、理論的な \(N_e(T)\) カーブを計算し、プロットします。必要に応じて既存の実験データを重ねて表示することも可能です。fitモード: 実験データ(\(T\) と \(N_e\) のペア)に最もよく合うように、半導体の物理パラメータ(\(E_g\), \(E_D\), \(E_A\), \(N_D\), \(N_A\))を最適化(フィッティング)します。フィッティングにはデフォルトでNelder–Mead法が使用され、最適化されたパラメータの値、その不確かさ(標準誤差、共分散、相関)、およびフィッティングの診断情報が提供されます。また、フィッティング結果と実験データをプロットし、モデルの予測バンドも表示します。
このプログラムは、半導体材料の電気特性を決定する際に、温度依存性のキャリア濃度測定結果から、バンドギャップ、ドーピング濃度、ドナー/アクセプター準位エネルギーといった基礎的な物理パラメータを抽出する課題を解決します。
原理
Ne_T_fit.py は、半導体におけるキャリア統計の基本的な物理法則に基づいて \(N_e(T)\) を計算します。
有効状態密度 (Effective Density of States) 伝導帯 (Conduction Band) の有効状態密度 \(N_c\) および価電子帯 (Valence Band) の有効状態密度 \(N_v\) は、温度 \(T\) と電子および正孔の有効質量 \(m_e^*, m_h^*\) を用いて以下のように計算されます。 $\(N_c = 2 \left( \frac{m_e^* m_e k T}{2 \pi \hbar^2} \right)^{3/2} \cdot 10^{-6}\)\( \)\(N_v = 2 \left( \frac{m_h^* m_e k T}{2 \pi \hbar^2} \right)^{3/2} \cdot 10^{-6}\)\( ここで \)m_e\( は自由電子質量、\)k\( はボルツマン定数、\)\hbar\( はディラック定数です。\)10^{-6}\( は単位を \)m^{-3}\( から \)cm^{-3}$ に変換するための係数です。プログラムでは、
m_eを自由電子質量、me_effとmh_effをそれぞれ電子と正孔の有効質量比として使用します。フェルミ・ディラック積分 (Fermi-Dirac Integral) キャリア濃度計算には、1/2次フェルミ・ディラック積分 \(F_{1/2}(\eta)\) が用いられます。 $\(F_{1/2}(\eta) = \int_0^\infty \frac{x^{1/2}}{1 + \exp(x - \eta)} dx\)\( ここで \)\eta = (E_F - E_c)/(k_B T)\( または \)(E_v - E_F)/(k_B T)\( です。 プログラムでは `F_half` 関数でこの積分を数値的に計算します。計算速度向上のため、\)\eta$ の値が量子化されてキャッシュされますが、数値微分を行う際には一時的にキャッシュを無効化することで精度を確保します。
電子濃度 \(N_e\) と正孔濃度 \(N_h\) フェルミ準位 \(E_F\)、伝導帯端 \(E_c\)、価電子帯端 \(E_v\) を用いて、電子濃度 \(N_e\) と正孔濃度 \(N_h\) は以下のように計算されます。 $\(N_e = N_c \frac{2}{\sqrt{\pi}} F_{1/2}\left(\frac{E_F - E_c}{k_B T}\right)\)\( \)\(N_h = N_v \frac{2}{\sqrt{\pi}} F_{1/2}\left(\frac{E_v - E_F}{k_B T}\right)\)\( ここで \)k_B T\( は `KbT_const * T` で計算されます。`KbT_const` は \)k/e\( (ボルツマン定数 / 素電荷) であり、これにより \)E_F, E_c, E_v$ がeV単位で扱われる場合、エネルギー比が適切にeV/eVとして計算されます。
イオン化ドナー \(N_D^+\) とイオン化アクセプター \(N_A^-\) ドナー準位の深さ \(E_D\) (伝導帯端 \(E_c\) からの下向きのエネルギー差) とアクセプター準位の深さ \(E_A\) (価電子帯端 \(E_v\) からの上向きのエネルギー差) を用いて、イオン化ドナー濃度 \(N_D^+\) とイオン化アクセプター濃度 \(N_A^-\) が計算されます。 \(g_D, g_A\) はそれぞれドナー、アクセプターの縮退度です。 $\(N_D^+ = N_D \left(1 - \frac{1}{1 + g_D \exp\left(\frac{E_c - E_D - E_F}{k_B T}\right)}\right)\)\( \)\(N_A^- = N_A \frac{1}{1 + g_A \exp\left(\frac{E_F - (E_v + E_A)}{k_B T}\right)}\)$ プログラムでは
special.expit(x)関数 (1 / (1 + exp(-x))) を用いて数値的な安定性を保ちながら計算されます。フェルミ準位 \(E_F\) の決定 半導体中のキャリア濃度は、電荷中性条件によって決定されるフェルミ準位 \(E_F\) に依存します。電荷中性条件は以下のように表されます。 $\(N_h - N_e + N_D^+ - N_A^- = 0\)\( プログラムは `solve_Ef` 関数でこの方程式を `scipy.optimize.brentq` を用いて数値的に解き、\)E_F$ を決定します。探索範囲は自動的に拡張されます。
フィッティングアルゴリズム
fitモードでは、実験で観測された電子濃度 \(N_{e,obs}\) とモデルによって計算された電子濃度 \(N_{e,model}\) との差の二乗和を最小化します。目的関数は \(N_e\) の \(\log_{10}\) 値の残差二乗和として定義されます。 $\(RSS = \sum_i \left( \log_{10}(N_{e,model}(T_i)) - \log_{10}(N_{e,obs}(T_i)) \right)^2\)\( `scipy.optimize.minimize` 関数が使用され、デフォルトの最適化手法はNelder–Mead法です。物理的な制約(\)E_g > 0\(, \)N_D > 0\( など)に違反するパラメータセットに対しては大きなペナルティが課せられます。ドナー・アクセプター濃度 \)N_D, N_A\( は、最適化の収束性を向上させるために \)\log_{10}$ 空間で扱われます。パラメータの不確かさ推定 最適化されたパラメータの不確かさは、数値ヤコビアン \(J\) を用いて推定されます。共分散行列 \(\mathrm{Cov}(\theta)\) は以下の関係で近似されます。 $\(\mathrm{Cov}(\theta) \approx s^2 (J^T J)^{-1}\)\( ここで \)s^2 = RSS / (N-M)\( は残差の分散、\)N\( はデータ点数、\)M\( は自由パラメータ数です。ヤコビアン \)J\( は `numerical_jacobian` 関数で中央差分法により計算されます。この際、`F_half` 関数のキャッシュは一時的に無効化され、数値精度の高い微分計算を可能にします。\)\log_{10}$ 空間で最適化されたパラメータの標準誤差は、誤差伝播の法則に従って物理空間の標準誤差に変換されます。
診断と提案 フィット結果の共分散行列や相関行列を分析し、フィッティングが不安定なパラメータ(例: 相関が強い、相対誤差が大きい)を特定します。これにより、ユーザーに対してどのパラメータを固定すべきか、あるいは制約を加えるべきかといった、フィッティング改善のためのヒントを提案します。
必要な非標準ライブラリとインストール方法
Ne_T_fit.py の実行には、以下のPythonライブラリが必要です。
numpy: 数値計算pandas: データ処理、特にCSVやExcelファイルの読み込みmatplotlib: 結果のプロットscipy: 数値積分、最適化、特殊関数(expit)
これらのライブラリは、pip コマンドを使用してインストールできます。
pip install numpy pandas matplotlib scipy
必要な入力ファイル
--mode read および --mode fit では、実験データを含む入力ファイルが必要です。
プログラムはCSV (.csv, .tsv) またはExcelファイル (.xls, .xlsx, .xlsm) をサポートします。
ファイル形式: CSV/TSV または Excel
ヘッダー: データにはヘッダー行が必要です。
列の指定:
温度データ:
--temp_colオプション (デフォルト: 0列目)キャリア濃度データ:
--ne_colオプション (デフォルト: 3列目、すなわち4列目)
Excelシート:
--sheetオプションでシート名を指定できます (デフォルト: 最初のシート)。データ構造: 少なくとも温度とキャリア濃度を含む2列以上のデータ。欠損値 (NaN) は自動的に除外されます。
例 (CSV形式):
T,Ne
300,1.2e17
350,1.8e17
400,2.5e17
450,3.2e17
500,4.0e17
この例では、T 列が0列目、Ne 列が1列目になります。
デフォルトの設定 (--temp_col 0 --ne_col 3) を使用する場合、Ne が4列目にあるファイルを準備する必要があります。
生成される出力ファイル
--mode fit でプログラムを実行すると、以下のJSON形式のファイルが生成される可能性があります。
フィット結果パラメータファイル (
--save <filename.json>で指定, デフォルト:[入力ファイル名]_params.json)内容: フィットによって最適化された物理パラメータ(
Eg,ED,EA,ND,NA,me,mh)とその値、およびフィッティングに使用された温度範囲 (Tfitmin,Tfitmax)、固定されたパラメータ (fix) が保存されます。例:
{ "Eg": 1.121234, "ED": 0.045678, "EA": 0.000000, "ND": 1.2345e+17, "NA": 1.0000e+15, "me": 1.08, "mh": 0.55, "Tfitmin": 50.0, "Tfitmax": 600.0, "fix": ["EA", "Eg", "NA"] }
診断出力ファイル (
--diag_save <filename.json>で指定, デフォルト:[入力ファイル名]_diagnostics_opt.json)内容: フィッティングの信頼性や安定性を評価するための詳細な診断情報が保存されます。これには、自由パラメータの推定値、標準誤差、共分散行列、相関行列、残差分散、および共分散行列と \(J^T J\) 行列の固有値分解の結果が含まれます。
固定候補提案ファイル (
--suggest_save <filename.json>で指定, デフォルト:[入力ファイル名]_fix_suggestions.json)内容: フィッティングの安定性を改善するために、固定を推奨されるパラメータのリストと、その理由(例: 相対誤差が大きい、他のパラメータとの強い相関がある、最も不確かな固有ベクトル方向への寄与が大きい)がJSON形式で保存されます。
コマンドラインでの使用例 (Usage)
プログラムの基本的な使用方法は以下の通りです。
python Ne_T_fit.py --help
出力例:
usage: Ne_T_fit.py [-h] [--input INPUT] [--sheet SHEET] [--temp_col TEMP_COL] [--ne_col NE_COL]
[--mode {read,sim,fit}] [--Eg EG] [--me ME] [--mh MH] [--ND ND] [--NA NA]
[--ED ED] [--EA EA] [--Tmin TMIN] [--Tmax TMAX] [--nT NT] [--Nmin NMIN]
[--Nmax NMAX] [--method METHOD] [--fix FIX] [--Tfitmin TFITMIN]
[--Tfitmax TFITMAX] [--band_sigma BAND_SIGMA] [--jac_relstep JAC_RELSTEP]
[--jac_absstep JAC_ABSSTEP] [--diag_save DIAG_SAVE] [--suggest_save SUGGEST_SAVE]
[--save SAVE] [--load LOAD]
Hall carrier density Ne(T) simulator / fitting (Nelder–Mead default)
options:
-h, --help show this help message and exit
--input INPUT 入力ファイル名 (CSV or Excel)
--sheet SHEET Excel sheet name (default: first sheet)
--temp_col TEMP_COL 温度列(0開始) [default: 0]
--ne_col NE_COL キャリア濃度列(0開始) [default: 3 (=4th col)]
--mode {read,sim,fit}
read: データ表示/プロット, sim: 計算, fit: パラメータフィット
--Eg EG Bandgap [eV]
--me ME Electron effective mass / m0
--mh MH Hole effective mass / m0
--ND ND Donor density [cm^-3]
--NA NA Acceptor density [cm^-3]
--ED ED Donor ionization energy below Ec [eV]
--EA EA Acceptor ionization energy above Ev [eV]
--Tmin TMIN Min Temperature [K]
--Tmax TMAX Max Temperature [K]
--nT NT Number of temperature points (sim without data)
--Nmin NMIN Plot Min Density [cm^-3]
--Nmax NMAX Plot Max Density [cm^-3]
--method METHOD Optimization method for fit mode (default: nelder-mead)
--fix FIX 固定するパラメータ名をカンマ区切りで指定 (例: EA,NA,Eg). 対象: ED,ND,EA,NA,Eg.
既定ではEA,NAは固定。
--Tfitmin TFITMIN フィットに使う最小温度[K] (default -1e100)
--Tfitmax TFITMAX フィットに使う最大温度[K] (default +1e100)
--band_sigma BAND_SIGMA
誤差帯の幅 (nsigma). default 1.0 (±1σ)
--jac_relstep JAC_RELSTEP
数値微分の相対ステップ
--jac_absstep JAC_ABSSTEP
数値微分の絶対ステップ
--diag_save DIAG_SAVE
診断出力(JSON)ファイル名
--suggest_save SUGGEST_SAVE
固定候補提案(JSON)ファイル名
--save SAVE fit結果保存ファイル (json)
--load LOAD 初期値読込ファイル (json)
コマンドラインでの具体的な使用例
ここでは、test_data.csv という名前の入力ファイルが存在することを前提とします。
T,Ne_data
50,1.00E+16
100,1.50E+16
150,2.00E+16
200,3.00E+16
250,4.50E+16
300,6.00E+16
350,8.00E+16
400,1.00E+17
450,1.20E+17
500,1.50E+17
550,1.80E+17
600,2.00E+17
上記の例では、--temp_col 0 --ne_col 1 を指定する必要があります。
例1: 実験データを読み込み、プロットする (read モード)
test_data.csv ファイルを読み込み、その内容をターミナルに表示し、温度に対するキャリア濃度をプロットします。
python Ne_T_fit.py --mode read --input test_data.csv --temp_col 0 --ne_col 1
実行結果の説明:
プログラムは test_data.csv の内容をPandas DataFrameとして表示し、その後、新しいウィンドウで温度 \(T\) に対する電子濃度 \(N_e\) のプロット(\(\log_{10}\) スケール)を表示します。プロットは実験データの点のみを示します。
例2: シミュレーションを実行し、プロットする (sim モード)
指定した物理パラメータで \(N_e(T)\) カーブをシミュレーションし、プロットします。既存の test_data.csv を重ねて表示します。
python Ne_T_fit.py --mode sim --input test_data.csv --temp_col 0 --ne_col 1 \
--Eg 1.12 --ND 5e16 --ED 0.045 --NA 1e14 --EA 0.05 \
--Tmin 50 --Tmax 600 --nT 100 --Nmin 1e15 --Nmax 1e18
実行結果の説明:
指定された Eg, ND, ED などのパラメータに基づいて、50Kから600Kまでの温度範囲で電子濃度 \(N_e(T)\) が計算されます。結果は \(1000/T\) に対する \(N_e\) のプロットとして表示され、test_data.csv の実験データも重ねて表示されます。これにより、モデルがどの程度実験データと一致しているかを視覚的に確認できます。
例3: データをフィッティングし、結果を保存・プロットする (fit モード)
test_data.csv のデータに対してフィッティングを実行します。この例では Eg, NA, EA を固定し、ED, ND を自由パラメータとしてフィッティングします。フィット結果のパラメータを fit_params.json に、診断情報を fit_diagnostics.json に保存します。
python Ne_T_fit.py --mode fit --input test_data.csv --temp_col 0 --ne_col 1 \
--Eg 1.12 --ED 0.04 --ND 1e16 --NA 1e14 --EA 0.05 \
--fix Eg,NA,EA \
--save fit_params.json --diag_save fit_diagnostics.json \
--suggest_save fit_suggestions.json \
--Tfitmin 100 --Tfitmax 500
実行結果の説明: プログラムは、まずフィッティングに使用されるデータ点数と温度範囲を表示します。次に、初期パラメータと固定パラメータのリストを表示し、Nelder-Mead法による最適化を開始します。最適化の進捗(反復回数、目的関数値など)がターミナルに出力されます。
最適化が完了すると、以下の情報が出力されます。
フィット結果のサマリー: 最適化の成功・失敗、目的関数の最終値、フィットされた各パラメータの値が表示されます。
不確かさの推定: 自由パラメータの標準誤差が \(\log_{10}\) 空間と物理空間の両方で表示されます。
診断情報: 共分散行列、相関行列、およびこれらの固有値分解の結果が表示され、パラメータ間の相関やフィッティングの不安定な方向に関する詳細な情報が提供されます。
パラメータ固定の提案: フィッティングの安定性を改善するために、固定を検討すべきパラメータのヒントが提示されます。
最終的に、フィットされたモデルの \(N_e(T)\) カーブと実験データ、およびモデルの予測バンドが \(1000/T\) に対する \(N_e\) のプロットとして表示されます。フィットされたパラメータは fit_params.json に、詳細な診断情報は fit_diagnostics.json に、固定候補の提案は fit_suggestions.json に保存されます。