pvfit プログラム仕様

一ダイオードモデル(SDM)を用いた太陽電池IV特性のフィッティングツール。

このスクリプトは、測定された電流-電圧(IV)特性データに対し、 一ダイオードモデルに基づいてフィッティングを行い、モデルパラメータを抽出します。 初期パラメータの推定、最適化、結果の保存、およびIV曲線のプロット機能を提供します。

関連リンク: pvfit.py 技術ドキュメント

pvfit.estimate_errors(res, V, I_meas, temp, base_params, fix_set)[ソース]

非線形最小二乗法で得られた結果に基づき、パラメータの誤差とモデル曲線の標準偏差を推定します。

フィッティング結果(res)とヤコビ行列を用いて、線形近似に基づいた共分散行列を計算します。 この共分散行列から、各パラメータの標準誤差と、モデル曲線自体の信頼性区間を推定します。 np.linalg.pinv を使用することで、数値的に不安定な場合でも計算を継続します。

パラメータ:
  • res (scipy.optimize.OptimizeResult) -- scipy.optimize.minimize の結果オブジェクト。

  • V (np.ndarray) -- 測定された電圧データ。

  • I_meas (np.ndarray) -- 測定された電流データ。

  • temp (float) -- セル温度 (K)。

  • base_params (dict) -- 固定パラメータを含む、全てのパラメータの初期値または現在の値の辞書。

  • fix_set (set) -- 固定されたパラメータ名のセット。

戻り値:

  • errors_dict (dict): 各自由パラメータの推定誤差の辞書。

  • sigma_log_I (np.ndarray): モデル曲線の対数スケールでの標準偏差。

戻り値の型:

tuple[dict, np.ndarray]

pvfit.get_initial_params(V, I_meas, args, csv_path)[ソース]

フィッティングのための初期パラメータを生成または既存のCSVファイルから読み込みます。

--mode init が指定されている場合、IV曲線の特徴から初期パラメータを推定します。 それ以外の場合、既存のパラメータCSVファイルから読み込みます。 コマンドライン引数で明示的に指定されたパラメータは、常に読み込み値や推定値を上書きします。

パラメータ:
  • V (np.ndarray) -- 測定された電圧データ。

  • I_meas (np.ndarray) -- 測定された電流データ。

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

  • csv_path (str) -- 初期パラメータを読み書きするCSVファイルのパス。

戻り値:

  • params (dict): 初期パラメータ名とその値の辞書。

  • csv_fix (set): CSVファイルで固定として指定されたパラメータ名のセット。

戻り値の型:

tuple[dict, set]

pvfit.get_jacobian(p_free, V, temp, base_params, fix_set)[ソース]

モデルの対数電流に対するヤコビ行列を数値的に計算します。

ヤコビ行列は、各自由パラメータに関するモデル出力(対数電流)の偏微分を近似したものです。 有限差分法を用いて計算され、誤差推定に使用されます。

パラメータ:
  • p_free (np.ndarray) -- 現在の自由パラメータの配列。

  • V (np.ndarray) -- 測定された電圧データ。

  • temp (float) -- セル温度 (K)。

  • base_params (dict) -- 固定パラメータを含む、全てのパラメータの初期値または現在の値の辞書。

  • fix_set (set) -- 固定されたパラメータ名のセット。

戻り値:

モデルの対数電流に対するヤコビ行列。

戻り値の型:

np.ndarray

pvfit.load_param_csv(csv_path)[ソース]

指定されたCSVファイルからモデルパラメータと固定するパラメータのセットを読み込みます。

CSVファイルには、"varname", "value", "optid" (0:固定, 1:自由) の列が必要です。 PARAM_NAMES に含まれるパラメータのみがフィッティングの対象として扱われ、 optid が0のパラメータは固定としてマークされます。

パラメータ:

csv_path (str) -- パラメータを読み込むCSVファイルのパス。

戻り値:

  • params (dict): 読み込まれたパラメータ名とその値の辞書。

  • fix_set (set): 固定としてマークされたパラメータ名のセット。

戻り値の型:

tuple[dict, set]

pvfit.main()[ソース]

スクリプトの主要な実行フローを制御します。

コマンドライン引数を解析し、指定されたモード(init, fit, sim)に基づいて、 データの読み込み、初期パラメータの取得、フィッティング実行、シミュレーション、 そして結果の保存とプロットを行います。

pvfit.model(V, I0, ndiode, IPV, Rs, Rsh, temperature=300.0)[ソース]

一ダイオードモデル(Single-Diode Model, SDM)に基づいてIV特性の電流を計算します。

このモデルは以下の数式で表されます: I = IPV - I0 * (exp((V + I*Rs) / (ndiode * k * T / q)) - 1) - (V + I*Rs) / Rsh ここで、Iは全電流、IPVは光電流、I0は飽和電流、ndiodeはダイオード理想因子、 Rsは直列抵抗、Rshはシャント抵抗、kはボルツマン定数、Tは温度、qは素電荷です。 この式はIについて解析的に解けないため、scipy.optimize.brentq を用いて数値的に解を求めます。

パラメータ:
  • V (np.ndarray or float) -- 電圧のNumpy配列または単一値。

  • I0 (float) -- 飽和電流 (A)。

  • ndiode (float) -- ダイオード理想因子。

  • IPV (float) -- 光電流 (A)。

  • Rs (float) -- 直列抵抗 (Ω)。

  • Rsh (float) -- シャント抵抗 (Ω)。

  • temperature (float) -- セル温度 (K)。デフォルトは300.0。

戻り値:

入力電圧Vに対応する計算された電流 (A) のNumpy配列。

戻り値の型:

np.ndarray

pvfit.objective(p_free, V, I_meas, temp, base_params, fix_set)[ソース]

最適化アルゴリズムのための目的関数を計算します。

この関数は、自由パラメータ`p_free`を更新し、それらの値を用いてモデルを呼び出し、 測定された電流と計算された電流の対数絶対値の差の二乗和(残差平方和)を返します。 `ndiode`を除くパラメータは対数スケールで最適化されます。

パラメータ:
  • p_free (np.ndarray) -- 最適化中の自由パラメータの配列。

  • V (np.ndarray) -- 測定された電圧データ。

  • I_meas (np.ndarray) -- 測定された電流データ。

  • temp (float) -- セル温度 (K)。

  • base_params (dict) -- 固定パラメータを含む、全てのパラメータの初期値または現在の値の辞書。

  • fix_set (set) -- 固定されたパラメータ名のセット。

戻り値:

測定値とモデル予測値の対数絶対値の差の二乗和。

戻り値の型:

float

pvfit.plot_iv(V, I_meas, I_final, axes, sigma_log=None, label='Model', title='')[ソース]

測定IV特性とモデルIV特性を線形スケールおよび対数スケールでプロットします。

線形スケールのプロットと対数スケールのプロットの2つのサブプロット(axes)に、 測定データ、フィッティングされたモデル曲線、および(指定された場合)信頼性区間を描画します。

パラメータ:
  • V (np.ndarray) -- 電圧データ。

  • I_meas (np.ndarray) -- 測定された電流データ。

  • I_final (np.ndarray) -- モデルによって計算された最終電流データ。

  • axes (tuple[matplotlib.axes.Axes, matplotlib.axes.Axes]) -- プロットに使用するmatplotlibの2つのサブプロット軸 (ax_lin, ax_log)。

  • sigma_log (np.ndarray or None) -- モデル曲線の対数スケールでの標準偏差。提供された場合、信頼性区間が描画されます。

  • label (str) -- モデル曲線の凡例ラベル。デフォルトは"Model"。

  • title (str) -- プロットのタイトル。デフォルトは空文字列。

戻り値:

なし

戻り値の型:

None

pvfit.read_data(infile, xmin=None, xmax=None)[ソース]

入力CSVファイルからIV特性データを読み込み、電圧(V)の昇順でソートして返します。

データはCSVファイルから読み込まれ、"DataValue"セクションに続く数値がIVデータとして解釈されます。 オプションで電圧範囲を指定してデータをフィルタリングできます。 データが存在しない場合や無効なデータが多い場合はエラーを発生させます。

パラメータ:
  • infile (str) -- 読み込むCSVファイルのパス。

  • xmin (float or None) -- プロットおよびフィッティングに使用する電圧範囲の最小値 (V)。Noneの場合、制限なし。

  • xmax (float or None) -- プロットおよびフィッティングに使用する電圧範囲の最大値 (V)。Noneの場合、制限なし。

戻り値:

  • V (np.ndarray): 読み込まれた電圧データ(ソート済み)。

  • I (np.ndarray): 読み込まれた電流データ(ソート済み)。

  • inf (dict): ファイル名と記録時間を含む情報辞書。

戻り値の型:

tuple[np.ndarray, np.ndarray, dict]

例外:

ValueError -- 有効なデータがファイル内に見つからない場合。

pvfit.run_fit_mode(V, I_meas, init_params, args, csv_path, fix_set)[ソース]

フィッティングモードを実行し、IV特性データに一ダイオードモデルを適合させます。

初期パラメータから最適化を開始し、scipy.optimize.minimize を用いて目的関数を最小化します。 フィッティングの進行状況は、指定された間隔でプロットとコンソール出力で表示されます。 最終的なフィッティングパラメータ、その誤差、および推定されたVOCとISCをCSVファイルに保存します。

パラメータ:
  • V (np.ndarray) -- 測定された電圧データ。

  • I_meas (np.ndarray) -- 測定された電流データ。

  • init_params (dict) -- フィッティングの初期パラメータの辞書。

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

  • csv_path (str) -- 結果のパラメータを保存するCSVファイルのパス。

  • fix_set (set) -- 固定するパラメータ名のセット。

戻り値:

  • fit_params (dict): フィッティング後の最適化されたパラメータの辞書。

  • sigma_log_curve (np.ndarray): 最適化されたモデル曲線の対数スケールでの標準偏差。

戻り値の型:

tuple[dict, np.ndarray]

pvfit.save_param_csv(csv_path, params, fix_set, errors=None, rss=None)[ソース]

モデルパラメータ、固定設定、推定誤差、およびRSSをCSVファイルに保存します。

結果として得られたフィッティングパラメータ、その固定/自由設定、 そして推定された誤差(利用可能な場合)を整理してCSV形式で出力します。 推定された開回路電圧 (VOC_est) と短絡電流 (ISC_est) も含められます。

パラメータ:
  • csv_path (str) -- パラメータを保存するCSVファイルのパス。

  • params (dict) -- 保存するパラメータ名とその値の辞書。

  • fix_set (set) -- 固定されたパラメータ名のセット。

  • errors (dict or None) -- 各パラメータの推定誤差の辞書。デフォルトはNone。

  • rss (float or None) -- 残差平方和 (Residual Sum of Squares) の値。デフォルトはNone。

戻り値:

なし

戻り値の型:

None

pvfit.solve_root_poly(x, y, target_y=0, order=3)[ソース]

多項式近似を用いて、与えられたデータセット(x, y)からyが特定の`target_y`になるxを推定します。

与えられたIVデータに対して、n次多項式で近似し、`y - target_y = 0`となる根を探します。 複数の実数根が見つかった場合、データの平均x値に最も近い根を選択します。 実数根が見つからない場合は、線形補間を使用します。

パラメータ:
  • x (np.ndarray) -- x軸のデータポイント(電圧)。

  • y (np.ndarray) -- y軸のデータポイント(電流)。

  • target_y (float) -- 求めるyの値。デフォルトは0(開回路電圧VOCの推定に相当)。

  • order (int) -- 多項式近似の次数。デフォルトは3。

戻り値:

target_y に対応する推定されたx値。

戻り値の型:

float