pvfit プログラム仕様
拡張一ダイオードモデル(SDM)IVフィッティングツール
このモジュールは、太陽電池や他の半導体デバイスの電流-電圧(IV)特性を、 拡張一ダイオードモデル(SDM)を用いてフィッティング、初期値推定、またはシミュレーションするためのツールを提供します。 複数の輸送メカニズム(ダイオード、トンネル誘起フォワードエミッション (TFE)、 非理想フォワード電流 (FN)、空間電荷制限電流 (SCLC))を組み合わせて利用できます。
機能: - フォワードバイアスとリバースバイアスのモデルを独立に選択可能 - ダイオード、TFE、FN、SCLCの各メカニズムを任意に組み合わせ可能 - 数値解法は接合電圧 Vd を未知数とする根探しで安定化 - モデルに未使用のパラメータは自動的に固定 - forwardIV と reverseIV が同一の場合、再計算を回避して効率化 - 最適化途中のIVカーブをアニメーション表示(常に有効) - 線形近似に基づくパラメータ誤差推定 - モデル電流の標準偏差から信頼性区間を水色領域で表示
mode=init の初期値推定: - 入力IVを電圧昇順にソート - I-Vを局所多項式で平滑化 - dI/dV から Rs, Rsh を推定 - ISC = I(V=0) を V=0 近傍の多項式で推定 - IPV = -ISC - VOC = I(V)=0 の多項式根で推定 - Ish = V<0 の代表点 Vsh における電流 - I0 = ISC - Ish (シャント電流は差し引かない) - TFE 初期値:
ndiode は固定初期値 1.5
FN / SCLC の初期値は結果に影響しない極小値
注意: - mode=init の初期値は fit 用の頑健な初期値です。 - 物理的に厳密な意味づけは mode=fit で精密化してください。
関連リンク: pvfit.py 技術ドキュメント
- electrical.pvfit.estimate_errors(res, V, I_meas, temperature, args, base_params, fix_set)[ソース]
フィッティング結果からパラメータの誤差とモデル電流の信頼区間を推定します。
ヤコビ行列と残差平方和を用いて共分散行列を計算し、誤差伝播によって 各パラメータの誤差とモデル電流の log10 スケールでの標準偏差を算出します。
- パラメータ:
res (scipy.optimize.OptimizeResult) -- scipy.optimize.minimize の結果オブジェクト。最適化されたパラメータ (res.x) と目的関数の値 (res.fun) を含む。
V (numpy.ndarray) -- 測定された電圧データ点の配列。
I_meas (numpy.ndarray) -- 測定された電流データ点の配列。
temperature (float) -- シミュレーションの温度 (K)。
args (argparse.Namespace) -- コマンドライン引数パーサーから得られた設定を含むオブジェクト。
base_params (dict) -- 固定パラメータの基準値を含む辞書。
fix_set (set) -- 固定されたパラメータ名のセット。
- 戻り値:
errors_dict (各パラメータ名とその推定誤差の辞書), sigma_log_I (モデル電流のlog10値の標準偏差の配列)
- 戻り値の型:
- electrical.pvfit.estimate_initial_params(V, I_meas, temperature)[ソース]
IVデータからSDM(拡張一ダイオードモデル)の初期パラメータを推定します。
データ平滑化、dI/dV解析、多項式根探し、負電圧領域でのTFE近似を用いて、 最適化に適した頑健な初期値を導出します。
- electrical.pvfit.estimate_voc_local_quadratic(V, I, nlsq_points=5)[ソース]
IVデータから開回路電圧(VOC)を局所二次多項式フィッティングで推定します。
電流がゼロに最も近い点の近傍データを使用して、二次多項式をフィッティングし、 その多項式の根からVOCを求めます。データ点が少ない場合は、線形補間を使用します。
- electrical.pvfit.exec_fit(V, I_meas, info, csv_path, params, fix_set, args)[ソース]
fit モードの本体処理。 最適化、誤差推定、保存、最終プロットまでをまとめて実行する。
この関数は、scipy.optimize.minimize を用いてSDMパラメータを測定データにフィッティングします。 フィッティング中には、コンソールへの進捗表示とリアルタイムのIVカーブアニメーションが行われます。 最適化後、パラメータの誤差が推定され、結果がCSVファイルに保存され、最終的なプロットが表示されます。
- パラメータ:
V (numpy.ndarray) -- 測定された電圧データ点の配列。
I_meas (numpy.ndarray) -- 測定された電流データ点の配列。
info (dict) -- ファイル名やレコード時間などの情報を含む辞書。プロットのタイトルに使用。
csv_path (pathlib.Path) -- パラメータを保存するCSVファイルのパス。
params (dict) -- 初期パラメータ値を含む辞書。
fix_set (set) -- 固定されるパラメータ名のセット。
args (argparse.Namespace) -- コマンドライン引数パーサーから得られた設定を含むオブジェクト。
- 戻り値:
params (最適化後のパラメータ値の辞書), rss (残差平方和), errors (各パラメータの推定誤差の辞書), sigma_log_curve (モデル電流のlog10値の標準偏差の配列)
- 戻り値の型:
- electrical.pvfit.get_jacobian(p_free, V, temperature, args, base_params, fix_set)[ソース]
モデルのヤコビ行列を数値的に計算します。
各自由パラメータを微小量 eps だけ摂動させ、log10(|I|) の変化を計算して 偏微分(ヤコビ行列の要素)を近似します。
- パラメータ:
p_free (numpy.ndarray) -- 最適化された自由パラメータのNumPy配列。
V (numpy.ndarray) -- 測定された電圧データ点の配列。
temperature (float) -- シミュレーションの温度 (K)。
args (argparse.Namespace) -- コマンドライン引数パーサーから得られた設定を含むオブジェクト。
base_params (dict) -- 固定パラメータの基準値を含む辞書。
fix_set (set) -- 固定されたパラメータ名のセット。
- 戻り値:
各データ点に対する各自由パラメータの偏微分からなるヤコビ行列。
- 戻り値の型:
numpy.ndarray
- electrical.pvfit.initialize()[ソース]
コマンドライン引数パーサーを初期化し、引数を解析します。
各種実行モード (analyze, init, fit, sim)、最適化手法、 入力ファイル、温度、データクリッピング範囲、スキップ間隔、 フォワード/リバースIVモデル、ブレンド電圧幅、プロット/プリント間隔、 最大イテレーション数、許容誤差、固定パラメータなどの引数を定義します。
- 戻り値:
args (解析された引数を含むオブジェクト), parser (ArgumentParserオブジェクト)
- 戻り値の型:
- electrical.pvfit.initialize_plot(V, I_meas, I_sim, title=None)[ソース]
最適化プロセスのための初期プロットを設定し、アニメーションオブジェクトを返します。
リアルタイムでのフィッティング進捗状況を表示するために使用されます。 線形スケールと対数絶対値スケールの2つのサブプロットが作成されます。
- パラメータ:
V (numpy.ndarray) -- 電圧データの配列。
I_meas (numpy.ndarray) -- 測定された電流データの配列。
I_sim (numpy.ndarray) -- 初期シミュレーション電流データの配列。
title (str or None) -- プロットのメインタイトル。Noneの場合、タイトルは設定されない。
- 戻り値:
fig (matplotlib.figure.Figure), axes (matplotlib.axes.Axesの配列), anim (アニメーションに使うオブジェクトの辞書)
- 戻り値の型:
- electrical.pvfit.j_fn_forward(Vd, A_fn, B_fn)[ソース]
Fowler-Nordheimトンネル電流 (FN) のフォワードバイアス成分を計算します。
このメカニズムは、高注入レベルや特定の欠陥メカニズムによって引き起こされる電流をモデル化するために使用できます。 Vd > 0 の領域で定義されます。
- electrical.pvfit.j_fn_reverse(Vd, A_fn, B_fn)[ソース]
Fowler-Nordheimトンネル電流 (FN) のリバースバイアス成分を計算します。
このメカニズムは、高注入レベルや特定の欠陥メカニズムによって引き起こされる電流をモデル化するために使用できます。 Vd < 0 の領域で定義されます。
- electrical.pvfit.j_sclc(Vd, K_sclc)[ソース]
空間電荷制限電流 (SCLC) を計算します。
SCLCは、高抵抗材料におけるキャリア注入が空間電荷によって制限されるときに発生します。 この電流は電圧の2乗に比例し、電圧の符号によって方向が決まります。
- electrical.pvfit.j_sclc_trap_transition(Vd, K_sclc, m_sclc, Vtfl, dV=0.001)[ソース]
トラップ制限空間電荷制限電流(SCLC)とトラップフリーSCLCの間の遷移をモデル化する電流成分を計算します。
このモデルは、電圧に応じてトラップが満たされることで、電流が異なる電圧依存性を示す領域を表現します。 具体的には、トラップ制限領域では Vd^m_sclc に、トラップフリー領域では Vd^2 に従います。 シグモイド関数を用いて両者間の滑らかな遷移を実現します。
- electrical.pvfit.j_tfe_forward(Vd, A_tfe, E00)[ソース]
熱アシストトンネルフィールドエミッション (TFE) 電流のフォワードバイアス成分を計算します。
TFEは通常、低温や欠陥の多い材料で支配的になるメカニズムです。 この関数は、Vd > 0 の領域でTFEによる電流を計算します。
- electrical.pvfit.j_tfe_reverse(Vd, A_tfe, E00)[ソース]
熱アシストトンネルフィールドエミッション (TFE) 電流のリバースバイアス成分を計算します。
この関数は、Vd < 0 の領域でTFEによる電流を計算します。
- electrical.pvfit.junction_current_forward(Vd, p, mode_set, temperature)[ソース]
フォワードバイアス条件における総接合電流を計算します。
mode_set で指定されたメカニズムに基づいて、対応する電流成分(ダイオード、TFE、FN、SCLC)を合計します。
- electrical.pvfit.junction_current_reverse(Vd, p, mode_set, temperature)[ソース]
リバースバイアス条件における総接合電流を計算します。
mode_set で指定されたメカニズムに基づいて、対応する電流成分(ダイオード、TFE、FN、SCLC)を合計します。
- electrical.pvfit.load_param_csv(csv_path)[ソース]
パラメータ設定CSVファイルからパラメータ値と固定設定を読み込みます。
CSVファイルには 'varname', 'value', 'optid' の列が含まれると想定されます。 'optid' が '0' の場合、そのパラメータは固定されます。
- electrical.pvfit.local_poly_value(x, y, x0, npts=7, order=3)[ソース]
指定された点 x0 の近傍のデータ点に局所多項式をフィッティングし、x0 におけるy値を推定します。
npts で指定された数の最も近いデータ点を使用します。
- electrical.pvfit.main()[ソース]
スクリプトのエントリーポイント。コマンドライン引数を解析し、IVフィッティングツールを実行します。
この関数は、初期値推定 (init)、モデルフィッティング (fit)、またはシミュレーション (sim) の いずれかのモードで動作します。データ読み込み、パラメータ管理、最適化、結果のプロットを行います。
- 戻り値:
None
- 戻り値の型:
None
- electrical.pvfit.model(V, p, forwardIV='diode', reverseIV='diode+tfe', dV=0.05, temperature=300.0)[ソース]
拡張一ダイオードモデル(SDM)に基づいて電流-電圧(IV)カーブを計算します。
与えられた外部電圧 V、パラメータ p、および選択された輸送メカニズム (forwardIV, reverseIV) を使用して 対応する電流 I を計算します。接合電圧 Vd を未知数とする根探しアルゴリズム(Brentのメソッド)を 用いて安定的にモデル電流を求めます。 フォワードとリバースで異なるモデルが指定された場合、シグモイド関数 (sigmoid_blend) を使って Vd が0V付近でスムーズにブレンドされます。
- パラメータ:
V (numpy.ndarray) -- 外部印加電圧の配列。
p (dict) -- モデルパラメータを含む辞書。主要なキーは "I0", "ndiode", "IPV", "Rs", "Rsh", "A_tfe", "E00", "A_fn", "B_fn", "K_sclc"。
forwardIV (str) -- フォワードバイアス領域で使用する輸送メカニズムを示す文字列。例: "diode", "diode+tfe+sclc"。
reverseIV (str) -- リバースバイアス領域で使用する輸送メカニズムを示す文字列。例: "diode+tfe", "diode+fn"。
dV (float) -- フォワードモデルとリバースモデルをブレンドする際の電圧幅。Vd=0V付近での遷移の鋭さを制御します。
temperature (float) -- シミュレーションの温度 (K)。
- 戻り値:
各外部電圧 V に対応する総電流の配列。
- 戻り値の型:
numpy.ndarray
- electrical.pvfit.objective(p_free, V, I_meas, args, base_params, fix_set)[ソース]
最適化のための目的関数(残差平方和)を計算します。
測定電流とモデル電流の符号を保持した圧縮表現 sign(I) * log10(abs(I)+EPS_I) の残差平方和を使用します。
- パラメータ:
p_free (numpy.ndarray) -- 最適化中の自由パラメータのNumPy配列。
V (numpy.ndarray) -- 測定された電圧データ点の配列。
I_meas (numpy.ndarray) -- 測定された電流データ点の配列。
args (argparse.Namespace) -- コマンドライン引数パーサーから得られた設定を含むオブジェクト(例: forwardIV, reverseIV)。
base_params (dict) -- 固定パラメータの基準値を含む辞書。
fix_set (set) -- 固定されたパラメータ名のセット。
- 戻り値:
目的関数の値(残差平方和)。
- 戻り値の型:
- electrical.pvfit.pack_free_params(params, fix_set)[ソース]
辞書形式の全パラメータから、最適化対象の自由パラメータのみをNumPy配列にパックします。
fix_set に含まれるパラメータは除外されます。 LOG_PARAMS に含まれるパラメータは log10 変換されて配列に格納されます。
- electrical.pvfit.parse_mech_mode(mode_str)[ソース]
輸送メカニズムのモード文字列を解析し、使用するメカニズムのセットを返します。
モード文字列はカンマ (,) またはプラス (+) で区切られたメカニズム名(例: "diode+tfe")を 含みます。無効なメカニズム名が指定された場合はValueErrorを発生させます。
- パラメータ:
mode_str (str or None) -- 解析するモード文字列(例: "diode", "diode+tfe", "none")。
- 戻り値:
使用するメカニズム名のセット。
- 戻り値の型:
- 例外:
ValueError -- 未知の輸送メカニズム名が指定された場合。
- electrical.pvfit.plot_iv(fig, axes, V, I_meas, I_start, I_final, info, mode, sigma_log=None, mode_label='', outfile=None, pause=False)[ソース]
測定データとモデルIVカーブをプロットします。
線形スケールと対数絶対値スケールの2つのサブプロットを作成します。 sigma_log が提供された場合、モデル電流の信頼区間を水色領域で表示します。
- パラメータ:
fig (matplotlib.figure.Figure or None) -- プロットに使うmatplotlib.figure.Figureオブジェクト。Noneの場合、新しいFigureを作成。
axes (numpy.ndarray or None) -- プロットに使うmatplotlib.axes.Axesオブジェクトの配列。Noneの場合、新しいAxesを作成。
V (numpy.ndarray) -- プロットする電圧データの配列。
I_meas (numpy.ndarray or None) -- 測定された電流データの配列。Noneの場合、測定データはプロットされない。
I_start (numpy.ndarray or None) -- 初期モデルによって計算された電流データの配列。Noneの場合、初期モデルはプロットされない。
I_final (numpy.ndarray) -- 最終モデルによって計算された電流データの配列。
info (dict) -- ファイル名やレコード時間などの情報を含む辞書。プロットのタイトルに使用。
mode (str) -- 現在の実行モード(例: "init", "fit", "sim")を示す文字列。プロットのタイトルに使用。
sigma_log (numpy.ndarray or None) -- モデル電流の log10 値の標準偏差の配列。信頼区間を表示するために使用。Noneの場合、信頼区間は表示されない。
mode_label (str) -- プロットのタイトルに追加するモードのラベル。
outfile (str or None) -- プロットを保存するファイルパス。Noneの場合、保存しない。
- 戻り値:
None
- 戻り値の型:
None
- electrical.pvfit.print_args_and_derived(args)[ソース]
コマンドライン引数とその派生値をコンソールに出力します。
ユーザーが指定した入力値と、プログラム内部で決定される追加の設定(例:使用されるパラメータ、自動固定されるパラメータ) を一覧表示し、設定の確認を容易にします。
- パラメータ:
args (argparse.Namespace) -- 解析されたコマンドライン引数を含むオブジェクト。
- 戻り値:
None
- 戻り値の型:
None
- electrical.pvfit.print_parameter_repeat(params, fix_set, used, auto_fixed, title='')[ソース]
現在のモデルパラメータとその固定状態をコンソールに出力します。
これは、print_args_and_derived の「Derived values」セクションに似ていますが、 最終的に決定された各パラメータの具体的な値と、それが固定されているかどうかの状態を詳細に示します。
- electrical.pvfit.read_data(infile, xmin=None, xmax=None, ndataskip=0)[ソース]
指定されたCSVファイルからIVデータ(電圧と電流)を読み込みます。
ファイルからメタデータを抽出し、電圧昇順にデータをソートし、 指定された電圧範囲でクリッピングし、データスキップ間隔を適用します。
- パラメータ:
- 戻り値:
V (読み込まれた電圧データのNumPy配列), I (読み込まれた電流データのNumPy配列), info (ファイル名と記録時間を含む辞書)
- 戻り値の型:
- 例外:
ValueError -- 有効なデータが見つからない場合、またはクリッピング後にデータ点が残らない場合。
- electrical.pvfit.same_sign(a, b)[ソース]
2つの数値が同じ符号を持つかどうかを判定します。
両方が正または両方が負の場合にTrueを返します。 片方または両方がゼロの場合の動作は、厳密には考慮されていません。
- electrical.pvfit.save_iv_to_excel(outfile_xlsx, V, I_input, I_init, I_fit, info, params_init=None, params_final=None, rss=None, errors=None)[ソース]
IVデータ、初期パラメータ、最終パラメータ、およびサマリー情報をExcelファイルに保存します。
測定データ、初期モデル電流、フィッティング後のモデル電流が線形および対数絶対値スケールで保存されます。 パラメータシートには初期値と最終値、および推定誤差が含まれます。
- パラメータ:
outfile_xlsx (str) -- 出力するExcelファイルのパス。
V (numpy.ndarray) -- 電圧データのNumPy配列。
I_input (numpy.ndarray or None) -- 測定された電流データのNumPy配列。Noneの場合、保存しない。
I_init (numpy.ndarray or None) -- 初期モデルによって計算された電流データのNumPy配列。Noneの場合、保存しない。
I_fit (numpy.ndarray or None) -- フィッティング後のモデルによって計算された電流データのNumPy配列。Noneの場合、保存しない。
info (dict) -- ファイル名や記録時間などの情報を含む辞書。
params_init (dict or None) -- 初期パラメータ値を含む辞書。Noneの場合、保存しない。
params_final (dict or None) -- フィッティング後の最終パラメータ値を含む辞書。Noneの場合、保存しない。
rss (float or None) -- 残差平方和 (Residual Sum of Squares)。Noneの場合、保存しない。
errors (dict or None) -- 各パラメータの推定誤差を含む辞書。Noneの場合、保存しない。
- 戻り値:
None
- 戻り値の型:
None
- electrical.pvfit.save_param_csv(csv_path, params, fix_set, errors=None, rss=None)[ソース]
現在のパラメータ値、固定設定、推定誤差、およびRSSをCSVファイルに保存します。
PARAM_NAMES にリストされている全てのパラメータと、追加の診断情報(VOC_estなど)が保存されます。
- electrical.pvfit.setup_parameters(params, args, csv_fix, args_fix, forwardIV, reverseIV)[ソース]
パラメータ辞書を最終的に設定し、固定されるパラメータを決定します。
コマンドライン引数で上書きされた値、CSVファイルから読み込まれた値、 デフォルト値、および未使用のモデルメカニズムに基づいて自動的に固定されるパラメータを統合します。
- パラメータ:
- 戻り値:
params (最終的なパラメータ値の辞書), fix_set (最終的に固定されるパラメータ名のセット), used (使用されるパラメータ名のセット), auto_fixed (自動的に固定されたパラメータ名のセット)
- 戻り値の型:
- 例外:
ValueError -- 不明な固定パラメータ名が指定された場合。
- electrical.pvfit.sigmoid_blend(x, dV)[ソース]
シグモイド関数を用いて、2つのモデル間のブレンド係数を計算します。
x が0.0の場合に0.5、x が正で十分に大きい場合に1.0、 x が負で十分に小さい場合に0.0に近づく値を返します。 dV はブレンドの遷移幅を決定します。dV が非常に小さい場合、ステップ関数に近づきます。
- electrical.pvfit.signed_log10_current(I, eps=1e-15)[ソース]
符号を保持したまま電流を圧縮する補助関数。 sign(I) * log10(abs(I)+eps) を返します。 電流値がゼロに近い場合に計算が不安定になることを防ぐため、abs(I) に eps を加えます。
- electrical.pvfit.smooth_polyfit(y, window_points=5, poly_order=3)[ソース]
Savitzky-Golayフィルターに似た局所多項式フィッティングにより、配列 y を平滑化します。
各データ点に対して、その点と近傍の window_points 数(奇数)のデータ点に poly_order 次の多項式をフィッティングし、中央の点の値を推定します。
- electrical.pvfit.solve_root_poly(x, y, target_y=0.0, order=3)[ソース]
データ点 (x, y) に多項式をフィッティングし、指定された target_y に対応する x の根を近似的に見つけます。
データ点数が少ない場合は、線形補間または多項式の次数を調整して対処します。 複数の実根がある場合は、入力 x の平均に最も近い根を選択します。
- electrical.pvfit.unpack_free_params(p_free, base_params, fix_set)[ソース]
自由パラメータのNumPy配列を、固定パラメータと組み合わせて辞書形式の全パラメータにアンパックします。
base_params は固定パラメータの値を決定するために使用されます。 LOG_PARAMS に含まれるパラメータは 10** 変換されて辞書に格納されます。
- electrical.pvfit.used_params_from_modes(forwardIV, reverseIV)[ソース]
指定されたフォワードおよびリバースIVモデルで使用されるパラメータ名を決定します。
共通のパラメータ (Rs, Rsh, IPV) に加えて、 有効な輸送メカニズム (diode, tfe, fn, sclc) に関連するパラメータを特定します。
- electrical.pvfit.validate_args(args)[ソース]
コマンドライン引数の有効性を検証します。
モードごとの必須引数、数値引数の範囲、パラメータ名の整合性などをチェックし、 無効な引数が存在する場合は ValueError を発生させます。
- パラメータ:
args (argparse.Namespace) -- 解析されたコマンドライン引数を含むオブジェクト。
- 戻り値:
None
- 戻り値の型:
None
- 例外:
ValueError -- 無効な引数が見つかった場合。