Ne_T_fit プログラム仕様

半導体キャリア統計シミュレーター (フィッティングモード付き)

このスクリプトは、半導体内の電子・正孔濃度、イオン化不純物濃度を温度の関数として計算する。 また、実験的なキャリア密度データにモデルをフィッティングする機能も提供する。 フィッティングはネルダー・ミード法をデフォルトとし、ドナー/アクセプターのイオン化エネルギー、濃度、バンドギャップをフィッティングパラメータとして利用する。 ログ空間での最適化とパラメータの不確かさ(共分散、相関、標準誤差)推定もサポートする。

Ne_T_fit.py 技術ドキュメント

F_half(eta: float) float[ソース]

係数 $2/sqrt{pi}$ を含まない1/2次のフェルミ・ディラック積分を計算する。

デフォルトでは高速化のために $eta$ を $10^{-3}$ の精度で量子化し、結果をキャッシュする。 FD_CACHE_DISABLETrue の場合は量子化を行わず、より正確な計算(ただし低速)を行う。 これは特に数値ヤコビアンの計算時に重要となる。

パラメータ:

eta (float) -- 無次元化されたフェルミ準位 $eta = (E_f - E_c) / k_B T$ または $(E_v - E_f) / k_B T$。

戻り値:

フェルミ・ディラック積分 $F_{1/2}(eta)$ の結果。

戻り値の型:

float

NAm(Ef: float, Ev: float, EA: float, NA: float, T: float, g: float = 1.0) float[ソース]

イオン化されたアクセプター密度 $N_A^-$ [cm$^{-3}$] を計算する。

アクセプター準位 $E_A$ は価電子帯端 $E_v$ から $E_A$ [eV] 上にある ($E_A > 0$ でより深い)。 アクセプターのイオン化された状態の占有率 $f_A$ を用い、$N_A^- = N_A f_A$ でイオン化アクセプター密度を算出する。 special.expit を使用してオーバーフローを回避する。

パラメータ:
  • Ef (float) -- フェルミ準位 [eV]。

  • Ev (float) -- 価電子帯端のエネルギー [eV]。

  • EA (float) -- アクセプターのイオン化エネルギー(価電子帯端からの深さ) [eV]。

  • NA (float) -- アクセプターの全密度 [cm$^{-3}$]。

  • T (float) -- 温度 [K]。

  • g (float) -- アクセプターの縮退因子 (デフォルト: 1.0)。

戻り値:

イオン化されたアクセプター密度 $N_A^-$ [cm$^{-3}$]。

戻り値の型:

float

NDp(Ef: float, Ec: float, ED: float, ND: float, T: float, g: float = 1.0) float[ソース]

イオン化されたドナー密度 $N_D^+$ [cm$^{-3}$] を計算する。

ドナー準位 $E_D$ は伝導帯端 $E_c$ から $E_D$ [eV] 下にある ($E_D > 0$ でより深い)。 ドナーの中性占有率 $f_D$ を用い、$N_D^+ = N_D (1 - f_D)$ でイオン化ドナー密度を算出する。 special.expit を使用してオーバーフローを回避する。

パラメータ:
  • Ef (float) -- フェルミ準位 [eV]。

  • Ec (float) -- 伝導帯端のエネルギー [eV]。

  • ED (float) -- ドナーのイオン化エネルギー(伝導帯端からの深さ) [eV]。

  • ND (float) -- ドナーの全密度 [cm$^{-3}$]。

  • T (float) -- 温度 [K]。

  • g (float) -- ドナーの縮退因子 (デフォルト: 1.0)。

戻り値:

イオン化されたドナー密度 $N_D^+$ [cm$^{-3}$]。

戻り値の型:

float

Ne(Ef: float, Ec: float, T: float, Nc: float) float[ソース]

伝導帯における電子濃度 $n$ [cm$^{-3}$] を計算する。

フェルミ準位 $E_f$ と伝導帯端 $E_c$ の相対位置から無次元化されたフェルミ準位 $eta$ を計算し、 フェルミ・ディラック積分を用いて電子濃度を算出する。

パラメータ:
  • Ef (float) -- フェルミ準位 [eV]。

  • Ec (float) -- 伝導帯端のエネルギー [eV]。

  • T (float) -- 温度 [K]。

  • Nc (float) -- 伝導帯の有効状態密度 [cm$^{-3}$]。

戻り値:

電子濃度 $n$ [cm$^{-3}$]。

戻り値の型:

float

Nh(Ef: float, Ev: float, T: float, Nv: float) float[ソース]

価電子帯における正孔濃度 $p$ [cm$^{-3}$] を計算する。

フェルミ準位 $E_f$ と価電子帯端 $E_v$ の相対位置から無次元化されたフェルミ準位 $eta$ を計算し、 フェルミ・ディラック積分を用いて正孔濃度を算出する。

パラメータ:
  • Ef (float) -- フェルミ準位 [eV]。

  • Ev (float) -- 価電子帯端のエネルギー [eV]。

  • T (float) -- 温度 [K]。

  • Nv (float) -- 価電子帯の有効状態密度 [cm$^{-3}$]。

戻り値:

正孔濃度 $p$ [cm$^{-3}$]。

戻り値の型:

float

class Params(Eg: float, ED: float, EA: float, ND: float, NA: float, me: float, mh: float)[ソース]

ベースクラス: object

半導体の物理パラメータを格納するデータクラス。

バンドギャップ、ドナー/アクセプターのイオン化エネルギー、濃度、有効質量といった 主要な物理パラメータをカプセル化する。

EA: float
ED: float
Eg: float
NA: float
ND: float
me: float
mh: float
calc_at_T(T: float, p: Params, args=None) Dict[str, float][ソース]

指定された温度 T と物理パラメータ p におけるキャリア統計関連の値を計算する。

有効状態密度 ($N_c$, $N_v$) を計算し、電荷中性条件を満たすフェルミ準位 ($E_f$) を求め、 そこから電子・正孔濃度、イオン化ドナー・アクセプター濃度を算出する。 結果は辞書形式で返される。

パラメータ:
  • T (float) -- 温度 [K]。

  • p (Params) -- 半導体の物理パラメータ (Params オブジェクト)。

  • args (argparse.Namespace or None) -- コマンドライン引数を格納するオブジェクト(ドナー/アクセプターの縮退因子 gD/gA を取得するために使用)。

戻り値:

計算結果を格納した辞書。キーは "T", "Ef", "n", "p", "NDp", "NAm", "Nc", "Nv"。

戻り値の型:

Dict[str, float]

cov_to_corr(Cov: ndarray) Tuple[ndarray, ndarray][ソース]

共分散行列から相関行列と標準偏差を計算する。

共分散行列 Cov の対角要素から標準偏差を抽出し、それらを用いて相関行列 Corr を計算する。 対角要素は1.0、標準偏差が0の場合は対応する相関値をNaNとする。

パラメータ:

Cov (np.ndarray) -- 共分散行列 (numpy.ndarray)。

戻り値:

相関行列 (numpy.ndarray) と標準偏差の配列 (numpy.ndarray)。

戻り値の型:

Tuple[np.ndarray, np.ndarray]

deltaQ(Ef: float, Ec: float, Ev: float, ED: float, EA: float, ND: float, NA: float, T: float, Nc: float, Nv: float, gD: float = 1.0, gA: float = 1.0) float[ソース]

電荷中性条件の残差 $p - n + N_D^+ - N_A^-$ を計算する。

フェルミ準位 $E_f$ を解くための根を探索する関数。 使用する縮退因子 gD/gA は、$E_f$ の計算時と $N_D^+$/$N_A^-$ の事後評価時で一貫している必要がある。

パラメータ:
  • Ef (float) -- フェルミ準位 [eV]。

  • Ec (float) -- 伝導帯端のエネルギー [eV]。

  • Ev (float) -- 価電子帯端のエネルギー [eV]。

  • ED (float) -- ドナーのイオン化エネルギー [eV]。

  • EA (float) -- アクセプターのイオン化エネルギー [eV]。

  • ND (float) -- ドナーの全密度 [cm$^{-3}$]。

  • NA (float) -- アクセプターの全密度 [cm$^{-3}$]。

  • T (float) -- 温度 [K]。

  • Nc (float) -- 伝導帯の有効状態密度 [cm$^{-3}$]。

  • Nv (float) -- 価電子帯の有効状態密度 [cm$^{-3}$]。

  • gD (float) -- ドナーの縮退因子 (デフォルト: 1.0)。

  • gA (float) -- アクセプターの縮退因子 (デフォルト: 1.0)。

戻り値:

電荷中性条件の残差。

戻り値の型:

float

eigen_sorted_sym(A: ndarray, descending: bool = True) Tuple[ndarray, ndarray][ソース]

対称行列の固有値分解を行い、結果をソートして返す。

対称行列 A の固有値と固有ベクトルを計算し、固有値を降順(descending=True の場合)または昇順にソートして返す。 固有ベクトルは対応する固有値の順序に合わせて並べ替えられる。

パラメータ:
  • A (np.ndarray) -- 対称行列 (numpy.ndarray)。

  • descending (bool) -- 固有値を降順にソートするかどうか (デフォルト: True)。

戻り値:

ソートされた固有値の配列 (numpy.ndarray) と対応する固有ベクトルの行列 (numpy.ndarray)。

戻り値の型:

Tuple[np.ndarray, np.ndarray]

estimate_param_errors(theta_hat: ndarray, T: ndarray, Ne_obs: ndarray, args, fix: set[str], free_names: List[str]) Dict[str, Dict[str, float]][ソース]

最適化されたパラメータの1-シグマ誤差を推定する。

フィッティング後のパラメータ theta_hat における残差と数値ヤコビアンを用いて、 自由パラメータの共分散行列を推定する。共分散行列から標準誤差(1-シグマ誤差)を導出し、 log10 変換されたパラメータ (ND, NA) については物理空間での誤差を伝播させて算出する。 診断目的で相関行列なども含めて返す。

パラメータ:
  • theta_hat (np.ndarray) -- 最適化された自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • T (np.ndarray) -- フィッティングに使用された温度のNumpy配列 [K]。

  • Ne_obs (np.ndarray) -- フィッティングに使用された観測電子濃度データのNumpy配列 [cm$^{-3}$]。

  • args (argparse.Namespace) -- コマンドライン引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

  • free_names (List[str]) -- 自由パラメータ名のリスト。

戻り値:

各パラメータの推定値、標準誤差、および共分散・相関行列などの診断情報を含む辞書。

戻り値の型:

Dict[str, Dict[str, float]]

initialize()[ソース]

コマンドライン引数をパースし、argparse.Namespace オブジェクトとして返す。

シミュレーションおよびフィッティングに必要な各種パラメータ(I/O、物理定数、温度範囲、 フィッティングオプション、診断出力など)を定義し、ユーザーからの入力を処理する。

戻り値:

パースされたコマンドライン引数を格納した argparse.Namespace オブジェクト。

戻り値の型:

argparse.Namespace

load_params(filename: str = 'fit_params.json') dict[ソース]

JSONファイルからパラメータ辞書を読み込む。

指定されたJSONファイルからパラメータを読み込み、辞書として返す。 ファイルが存在しない場合は空の辞書を返す。

パラメータ:

filename (str) -- 読み込むJSONファイル名 (デフォルト: "fit_params.json")。

戻り値:

読み込んだパラメータを格納した辞書。

戻り値の型:

dict

m2Nc(T: float, me_eff: float) float[ソース]

伝導帯の有効状態密度 $N_c$ [cm$^{-3}$] を計算する。

電子の有効質量 me_eff と温度 T を用いて有効状態密度を計算し、単位をm$^{-3}$からcm$^{-3}$に変換する。

パラメータ:
  • T (float) -- 温度 [K]。

  • me_eff (float) -- 電子の有効質量比 ($m_e^* / m_0$)。

戻り値:

伝導帯の有効状態密度 $N_c$ [cm$^{-3}$]。

戻り値の型:

float

m2Nv(T: float, mh_eff: float) float[ソース]

価電子帯の有効状態密度 $N_v$ [cm$^{-3}$] を計算する。

正孔の有効質量 mh_eff と温度 T を用いて有効状態密度を計算し、単位をm$^{-3}$からcm$^{-3}$に変換する。

パラメータ:
  • T (float) -- 温度 [K]。

  • mh_eff (float) -- 正孔の有効質量比 ($m_h^* / m_0$)。

戻り値:

価電子帯の有効状態密度 $N_v$ [cm$^{-3}$]。

戻り値の型:

float

main()[ソース]

プログラムのエントリポイント。

initialize 関数を呼び出してコマンドライン引数をパースする。 args.save, args.diag_save, args.suggest_save が指定されていない場合、 args.input に基づいてデフォルトのファイル名を生成する。 --mode 引数の値に応じて、run_read, run_fit, run_sim のいずれかの関数を実行する。

numerical_jacobian(theta: ndarray, T: ndarray, Ne_obs: ndarray, args, fix: set[str]) ndarray[ソース]

残差ベクトルに関するパラメータ theta の数値ヤコビアンを計算する。 中央差分法を使用する。

重要: - このコードベースでは F_{1/2}(eta) の計算を高速化するために eta を $10^{-3}$ 単位で量子化してキャッシュする。 - 有限差分によるヤコビアン計算の場合、この量子化は小さなパラメータ摂動に対して残差を区分的に定数とし、

J≈0、したがって (J^T J)≈0 を引き起こす可能性がある。

  • したがって、ここでは一時的に量子化キャッシュ (FD_CACHE_DISABLE=True) を無効にする。

パラメータ:
  • theta (np.ndarray) -- 自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • T (np.ndarray) -- 温度のNumpy配列 [K]。

  • Ne_obs (np.ndarray) -- 観測された電子濃度データのNumpy配列 [cm$^{-3}$]。

  • args (argparse.Namespace) -- コマンドライン引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

戻り値:

ヤコビアン行列 (numpy.ndarray)。

戻り値の型:

np.ndarray

objective(theta: ndarray, T: ndarray, Ne_obs: ndarray, args, fix: set[str]) float[ソース]

最適化アルゴリズムのための目的関数。log10 空間での残差の二乗和を返す。

自由パラメータ theta から物理パラメータを再構築し、residuals_log10 を計算し、 その二乗和を目的値とする。物理的に不可能なパラメータ値(例: バンドギャップが負)や 不自然な関係(例: ドナー準位がバンドギャップより深い)に対してはペナルティ項を加えて最適化をガイドする。

パラメータ:
  • theta (np.ndarray) -- 自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • T (np.ndarray) -- 温度のNumpy配列 [K]。

  • Ne_obs (np.ndarray) -- 観測された電子濃度データのNumpy配列 [cm$^{-3}$]。

  • args (argparse.Namespace) -- コマンドライン引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

戻り値:

log10 空間での残差の二乗和(目的関数の値)。

戻り値の型:

float

pack_free_params(args, fix: set[str]) Tuple[ndarray, List[str]][ソース]

フィッティングのために、自由パラメータを内部表現のベクトル theta0 にパックする。

固定されていないパラメータのみを抽出し、ND, NAlog10 空間に変換してベクトルに格納する。 エネルギー系のパラメータは線形空間のまま。

パラメータ:
  • args (argparse.Namespace) -- CLI引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

戻り値:

自由パラメータの初期値ベクトル (numpy.ndarray) とその名前のリスト。

戻り値の型:

Tuple[np.ndarray, List[str]]

parse_fix_list(s: str | None) set[str][ソース]

カンマ区切りの文字列から固定パラメータ名のセットをパースする。

--fix オプションで与えられた文字列を処理し、空白を除去して有効なパラメータ名のセットを生成する。

パラメータ:

s (str or None) -- 固定パラメータ名のカンマ区切り文字列、または None

戻り値:

固定パラメータ名を含む文字列のセット。

戻り値の型:

set[str]

prediction_band_log10_Ne(T: ndarray, theta_hat: ndarray, args, fix: set[str], Cov: ndarray, nsigma: float = 1.0) Tuple[ndarray, ndarray, ndarray][ソース]

log10(Ne) における予測誤差帯(デルタ法)を計算する。

最適化されたパラメータ theta_hat とその共分散行列 Cov を用いて、デルタ法により 予測値 y0 (log10(Ne)) の標準誤差を計算し、指定された nsigma 幅の誤差帯 (ylo, yhi) を提供する。 数値ヤコビアンの計算と同様に F_half 関数のキャッシュを一時的に無効にする。

パラメータ:
  • T (np.ndarray) -- 温度のNumpy配列 [K]。

  • theta_hat (np.ndarray) -- 最適化された自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • args (argparse.Namespace) -- コマンドライン引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

  • Cov (np.ndarray) -- 自由パラメータの共分散行列 (numpy.ndarray)。

  • nsigma (float) -- 誤差帯の幅(標準偏差の倍数) (デフォルト: 1.0)。

戻り値:

予測中央値 (y0)、下限 (ylo)、上限 (yhi) のNumpy配列 (log10 空間)。共分散行列が利用できない場合は None を返す。

戻り値の型:

Tuple[np.ndarray, np.ndarray, np.ndarray]

propose_fix_candidates(names: List[str], theta_hat: ndarray, stderr: ndarray, corr: ndarray, evals_cov: ndarray, evecs_cov: ndarray, corr_thr: float = 0.95, relerr_thr: float = 0.5, topn: int = 3)[ソース]

フィッティングパラメータとして固定すべき/制約すべき候補をヒューリスティックに提案する。

  • 自由パラメータの相対標準誤差が閾値 relerr_thr を超えるもの。

  • 他のパラメータとの相関が閾値 corr_thr を超えるもの。

  • 共分散行列の最も不確かな固有方向(最大固有値に対応する固有ベクトル)に強く寄与するものを特定し、提案リストを生成する。

  • 各候補について、スコア、推定値、標準誤差、相対誤差、および提案理由を報告する。

パラメータ:
  • names (List[str]) -- 自由パラメータ名のリスト。

  • theta_hat (np.ndarray) -- 最適化された自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • stderr (np.ndarray) -- 自由パラメータの標準誤差の配列 (numpy.ndarray)。

  • corr (np.ndarray) -- 自由パラメータの相関行列 (numpy.ndarray)。

  • evals_cov (np.ndarray) -- 共分散行列の固有値の配列。

  • evecs_cov (np.ndarray) -- 共分散行列の固有ベクトルの行列。

  • corr_thr (float) -- 強相関と見なす相関係数の閾値 (デフォルト: 0.95)。

  • relerr_thr (float) -- 相対誤差が高いと見なす閾値 (デフォルト: 0.5)。

  • topn (int) -- 上位何件の候補を提案するか (デフォルト: 3)。

戻り値:

固定/制約候補の提案を含む辞書のリスト。

戻り値の型:

list

read_data(path: str, temp_col: int = 0, ne_col: int = 3, sheet_name: str | int | None = None) Tuple[ndarray, ndarray, DataFrame][ソース]

CSVまたはExcelファイルから実験データを読み込む。

指定されたパスからファイル(CSV, TSV, Excel)を読み込み、温度 (temp_col) とキャリア濃度 (ne_col) の列を抽出する。 NaN値は除去される。Excelファイルの場合、シート名を指定できる。

パラメータ:
  • path (str) -- 入力ファイルのパス。

  • temp_col (int) -- 温度データの列インデックス (0始まり) (デフォルト: 0)。

  • ne_col (int) -- キャリア濃度データの列インデックス (0始まり) (デフォルト: 3)。

  • sheet_name (str or int or None) -- Excelファイルの場合のシート名またはシートインデックス (デフォルト: None, 最初のシート)。

戻り値:

温度のNumpy配列、キャリア濃度のNumpy配列、読み込んだDataFrame。

戻り値の型:

Tuple[np.ndarray, np.ndarray, pd.DataFrame]

replace_ext(path: str, target_ext: str) str[ソース]

ファイルパスの拡張子を新しいものに置き換える。

与えられたファイルパスの拡張子を target_ext で指定されたものに置き換えた新しいファイルパス文字列を返す。 ファイル名自体は変更しない。

パラメータ:
  • path (str) -- 元のファイルパス文字列。

  • target_ext (str) -- 新しい拡張子(例: ".json")。

戻り値:

拡張子が置き換えられた新しいファイルパス文字列。

戻り値の型:

str

residuals_log10(T: ndarray, Ne_obs: ndarray, p: Params, args=None) ndarray[ソース]

モデルと観測値の間の残差ベクトルを log10 空間で計算する。

モデル計算で得られた電子濃度 n_model と観測された電子濃度 Ne_obs の比の log10 を残差として返す。 これにより相対誤差が強調され、広い濃度範囲でのフィッティングに適する。 Ne_obs は0より大きい必要がある。

パラメータ:
  • T (np.ndarray) -- 温度のNumpy配列 [K]。

  • Ne_obs (np.ndarray) -- 観測された電子濃度データのNumpy配列 [cm$^{-3}$]。

  • p (Params) -- 物理パラメータ (Params オブジェクト)。

  • args (argparse.Namespace or None) -- コマンドライン引数を格納するオブジェクト(縮退因子を取得するため)。

戻り値:

log10 空間での残差ベクトル (numpy.ndarray)。

戻り値の型:

np.ndarray

run_fit(args)[ソース]

実験データに対して半導体パラメータをフィッティングする。

  • 入力ファイルから実験データを読み込み、指定された温度範囲でフィッティングを行う。

  • JSONファイルから初期パラメータをロードする(CLI指定が優先)。

  • 指定されたパラメータを固定し、残りの自由パラメータを`nelder-mead`などの最適化アルゴリズムでフィッティングする。 ND, NAlog10 空間で最適化される。

  • フィット結果、パラメータの不確かさ(標準誤差、共分散、相関)、および固定すべきパラメータの提案を コンソールに出力し、オプションでJSONファイルに保存する。

  • モデル計算値と実験データ、および予測誤差帯をプロットする。

パラメータ:

args (argparse.Namespace) -- コマンドライン引数を格納する argparse.Namespace オブジェクト。

run_read(args)[ソース]

入力ファイルからデータを読み込み、プロットして表示する。

read_data 関数を使用して指定された入力ファイルから温度と電子濃度データを読み込み、 matplotlibを使用して Ne(T) データをプロットし、表示する。

パラメータ:

args (argparse.Namespace) -- コマンドライン引数を格納する argparse.Namespace オブジェクト。

run_sim(args)[ソース]

指定されたパラメータでキャリア統計をシミュレーションし、結果をプロットする。

  • オプションでJSONファイルから初期パラメータをロードする(CLI指定が優先)。

  • 入力データファイルが指定されている場合は、その温度範囲を使用してシミュレーションを行う。 そうでない場合は、--Tmin, --Tmax, --nT で定義された温度範囲を使用する。

  • calc_at_T 関数で電子濃度を計算し、結果をデータ(あれば)と共に 1000/T vs Ne の半対数プロットとして表示する。

パラメータ:

args (argparse.Namespace) -- コマンドライン引数を格納する argparse.Namespace オブジェクト。

sanitize_args_for_fit(args, fix: set[str]) None[ソース]

フィッティングのためにCLI引数のパラメータ値をサニタイズする。

  • NDNA が自由変数として最適化される場合、log10 変換を避けるために0より大きい値に強制する。

  • Eg, ED, EA については物理的に妥当な範囲に調整する。

  • gD, gAlog で使用されるため0より大きい値に強制する。

パラメータ:
  • args (argparse.Namespace) -- CLI引数を格納するオブジェクト。

  • fix (set[str]) -- 固定パラメータ名のセット。

save_params(params: dict, filename: str = 'fit_params.json')[ソース]

パラメータ辞書をJSONファイルとして保存する。

フィッティング結果などのパラメータを、指定されたファイル名でJSON形式で保存する。

パラメータ:
  • params (dict) -- 保存するパラメータを格納した辞書。

  • filename (str) -- 保存するJSONファイル名 (デフォルト: "fit_params.json")。

solve_Ef(Ec: float, Ev: float, ED: float, EA: float, ND: float, NA: float, T: float, Nc: float, Nv: float, gD: float = 1.0, gA: float = 1.0, low0: float = -5.0, high0: float = 5.0, max_expand: int = 50) float[ソース]

Brentq法と自動ブラケット拡張を用いてフェルミ準位 $E_f$ を解く。

deltaQ 関数のゼロ点を見つけることで、$E_f$ を計算する。 初期の探索範囲 (low0, high0) で根が見つからない場合、自動的に探索範囲を拡張する。

パラメータ:
  • Ec (float) -- 伝導帯端のエネルギー [eV]。

  • Ev (float) -- 価電子帯端のエネルギー [eV]。

  • ED (float) -- ドナーのイオン化エネルギー [eV]。

  • EA (float) -- アクセプターのイオン化エネルギー [eV]。

  • ND (float) -- ドナーの全密度 [cm$^{-3}$]。

  • NA (float) -- アクセプターの全密度 [cm$^{-3}$]。

  • T (float) -- 温度 [K]。

  • Nc (float) -- 伝導帯の有効状態密度 [cm$^{-3}$]。

  • Nv (float) -- 価電子帯の有効状態密度 [cm$^{-3}$]。

  • gD (float) -- ドナーの縮退因子 (デフォルト: 1.0)。

  • gA (float) -- アクセプターの縮退因子 (デフォルト: 1.0)。

  • low0 (float) -- $E_f$ 探索の初期下限値 [eV]。

  • high0 (float) -- $E_f$ 探索の初期上限値 [eV]。

  • max_expand (int) -- 探索範囲を拡張する最大回数。

戻り値:

計算されたフェルミ準位 $E_f$ [eV]。

戻り値の型:

float

summarize_eigenvectors(evals: ndarray, evecs: ndarray, names: List[str], topk: int = 3, compk: int = 4)[ソース]

主要な固有ベクトルを人間が読める形式で要約する。

固有値と固有ベクトル、パラメータ名のリストを受け取り、上位 topk 個の固有ベクトルについて、 その主要な compk 個の成分と対応するパラメータ名を報告する辞書のリストを生成する。 これにより、どのパラメータが特定の不確かさの方向に強く寄与しているかを理解しやすくなる。

パラメータ:
  • evals (np.ndarray) -- 固有値の配列。

  • evecs (np.ndarray) -- 固有ベクトルの行列。

  • names (List[str]) -- パラメータ名のリスト。

  • topk (int) -- 要約する上位の固有ベクトルの数 (デフォルト: 3)。

  • compk (int) -- 各固有ベクトルで報告する主要成分の数 (デフォルト: 4)。

戻り値:

要約された固有ベクトル情報を含む辞書のリスト。

戻り値の型:

list

unpack_params(theta: ndarray, args, fix: set[str]) Params[ソース]

内部表現のパラメータベクトル theta と固定値を物理的な Params オブジェクトにアンパックする。

最適化された自由パラメータ theta の値と、CLI引数 args から取得した固定パラメータの値を結合し、 物理的な意味を持つ Params オブジェクトを構築する。 log10 変換された ND, NA は元のスケールに戻される。

パラメータ:
  • theta (np.ndarray) -- 自由パラメータの内部表現ベクトル (numpy.ndarray)。

  • args (argparse.Namespace) -- CLI引数を格納するオブジェクト(固定パラメータの値、および me, mh を取得)。

  • fix (set[str]) -- 固定パラメータ名のセット。

戻り値:

物理パラメータを格納した Params オブジェクト。

戻り値の型:

Params