pvfit_simple.py 技術ドキュメント

プログラムの動作

pvfit_simple.py は、太陽電池の一ダイオードモデル(Single-Diode Model, SDM)を使用して、測定された電流-電圧(IV)特性データにモデルをフィッティングするPythonスクリプトです。このプログラムの主な目的は、測定されたIV曲線からSDMの物理パラメータ(光電流 \(I_{PV}\)、飽和電流 \(I_0\)、ダイオード理想因子 \(n_{diode}\)、直列抵抗 \(R_s\)、シャント抵抗 \(R_{sh}\))を抽出することです。

主な機能:

  • データ読み込み: CSVファイルから太陽電池のIV特性データを読み込みます。データは電圧の昇順にソートされ、指定された電圧範囲でフィルタリング可能です。

  • 初期パラメータ推定: IVデータの特徴点(短絡電流付近、負電圧領域の抵抗)から、フィッティングの初期パラメータを自動的に推定します。

  • パラメータ最適化: scipy.optimize.minimize を用いて、測定されたIVデータとSDMが計算するIVデータの間の残差平方和を最小化することで、モデルパラメータを最適化します。最適化は、n_diode 以外のパラメータを対数スケールで行い、数値的安定性を高めます。

  • 誤差推定: フィッティングされたパラメータの標準誤差およびモデル曲線の信頼性区間を、ヤコビ行列と残差分散に基づいて推定します。

  • 特性値の推定: フィッティングされたモデルから、開回路電圧 (\(V_{OC}\)) と短絡電流 (\(I_{SC}\)) を推定します。

  • 結果の保存: フィッティングされたモデルパラメータ、その推定誤差、固定/自由設定、および残差平方和をCSVファイルとして保存します。

  • 視覚化: 測定データ、フィッティングされたモデル曲線、および信頼性区間を、線形スケールと対数スケールの両方でプロットし、結果を直感的に確認できるようにします。

  • インタラクティブな表示: フィッティングの進行中に、コンソールに現在のパラメータと残差平方和を出力し、プロットをリアルタイムで更新することで、最適化の状況を視覚的に追跡できます。

  • モード選択: 初期パラメータの生成 (init)、フィッティング (fit)、または指定されたパラメータでのシミュレーション (sim) の3つのモードをサポートします。

解決する課題:

太陽電池のIV特性は、セル設計、材料、製造プロセス、および動作条件(温度、日射強度など)に強く依存します。これらの特性を理解し、最適化するためには、物理モデルのパラメータを正確に特定することが不可欠です。pvfit_simple.py は、複雑な非線形方程式で表現されるSDMのパラメータを、測定データから効率的かつロバストに抽出し、太陽電池の性能評価やシミュレーションのための基礎データを提供します。

原理

一ダイオードモデル (SDM)

pvfit_simple.py は、太陽電池の電気的特性を記述するための一ダイオードモデル(Single-Diode Model, SDM)に基づいています。このモデルは、光電流源、ダイオード、直列抵抗、シャント抵抗から構成され、以下の非線形方程式で電流 \(I\) を計算します。

\[I = I_{PV} - I_0 \left( \exp \left( \frac{V + I \cdot R_s}{n_{diode} \cdot k_B \cdot T / q} \right) - 1 \right) - \frac{V + I \cdot R_s}{R_{sh}}\]

ここで:

  • \(I\) : 全体の出力電流 (A)

  • \(V\) : 出力電圧 (V)

  • \(I_{PV}\) : 光電流 (A)

  • \(I_0\) : ダイオード飽和電流 (A)

  • \(n_{diode}\) : ダイオード理想因子 (無次元)

  • \(R_s\) : 直列抵抗 (Ω)

  • \(R_{sh}\) : シャント抵抗 (Ω)

  • \(k_B\) : ボルツマン定数 (\(1.380649 \times 10^{-23}\) J/K)

  • \(T\) : セル温度 (K)

  • \(q\) : 素電荷 (\(1.602176634 \times 10^{-19}\) C)

この方程式は \(I\) について解析的に解くことができないため、pvfit_simple.pymodel 関数では scipy.optimize.brentq を用いて数値的に根を探索することで、与えられた \(V\) に対する \(I\) を求めます。特に、ダイオード電流 \(I_{dark}\) を変数とした残差関数 \(f(I_{dark}) = I_0 (\exp((V - I_{dark} R_s)/(n_{diode} k_B T / q)) - 1) + (V - I_{dark} R_s) / R_{sh} - I_{dark}\) がゼロになる \(I_{dark}\) を探し、\(I = I_{PV} - I_{dark}\) として計算します。

最適化アルゴリズム

フィッティングは、測定された電流 \(I_{meas}\) とモデルによって計算された電流 \(I_{calc}\) の間の残差平方和 (Residual Sum of Squares, RSS) を最小化することで行われます。pvfit_simple.py では、数値的安定性と広いダイナミックレンジを持つ電流データに対応するため、対数スケールでの残差平方和を目的関数として採用しています。

\[RSS = \sum \left( \log_{10}(|I_{meas}| + \epsilon_I) - \log_{10}(|I_{calc}| + \epsilon_I) \right)^2\]

ここで \(\epsilon_I\) はゼロ除算や対数計算でのエラーを避けるための微小値 (EPS_I = 1.0e-15) です。 n_diode を除くすべてのパラメータは、最適化の内部では \(\log_{10}\) スケールで扱われ、目的関数に渡される前に元のスケールに変換されます。これにより、パラメータ値の大きな変動幅を効率的に探索できます。

最適化は scipy.optimize.minimize 関数を使用して実行されます。デフォルトの最適化メソッドは「Nelder-Mead」ですが、コマンドライン引数で変更可能です。

初期パラメータの推定

--mode init 時、またはパラメータCSVファイルが存在しない/空の場合、プログラムはIVデータの特徴点から初期パラメータを推定します。

  • \(I_{PV}\) および \(I_{SC}\) は、電圧が0V近傍の電流データから多項式近似によって推定されます。

  • \(R_{sh}\) は、負電圧領域(光電流が支配的でダイオードが逆バイアスされる領域)でのIV曲線の傾きから推定されます。

  • \(I_0\) および \(n_{diode}\) は、典型的な太陽電池の値(\(10^{-10}\) A、\(1.5\))が初期値として設定されます。

パラメータ誤差の推定

フィッティング後のパラメータの信頼性を評価するために、パラメータの標準誤差が推定されます。これは非線形最小二乗法における線形近似に基づいています。

  1. ヤコビ行列 \(J\) の計算: モデルの出力(ここでは対数電流 \(\log_{10}(|I_{calc}| + \epsilon_I)\))に対する各自由パラメータの偏微分を、有限差分法を用いて数値的に計算します。

  2. 残差分散 \(\hat{\sigma}^2\) の推定: 最適化後の最小残差平方和 \(RSS_{min}\) と自由度 \((N - P)\) を用いて推定します。 $\(\hat{\sigma}^2 = \frac{RSS_{min}}{N - P}\)\( ここで \)N\( はデータポイント数、\)P$ は自由パラメータ数です。

  3. 共分散行列 \(\Sigma\) の計算: ヤコビ行列と残差分散から共分散行列を推定します。np.linalg.pinv (擬似逆行列) を使用することで、ヤコビ行列が正方行列でない場合や、数値的に不安定な場合でも計算を試みます。 $\(\Sigma = \hat{\sigma}^2 (J^T J)^{-1}\)$

  4. パラメータの標準誤差: 共分散行列の対角要素の平方根が、各パラメータの対数スケールでの標準誤差となります。これを元のスケールでの誤差に変換します(\(10^x\) の微分を考慮)。

  5. モデル曲線の標準偏差: \(J \Sigma J^T\) の対角要素の平方根から、モデル曲線自体の対数スケールでの信頼性区間を推定します。

開回路電圧 (\(V_{OC}\)) は、フィッティング後のモデル曲線が電流ゼロとなる電圧値を、多項式近似による根探索 (solve_root_poly) で推定します。短絡電流 (\(I_{SC}\)) は、モデル曲線が電圧ゼロとなる電流値として直接計算します。

必要な非標準ライブラリとインストール方法

pvfit_simple.py の実行には、以下のPythonライブラリが必要です。

  • numpy: 数値計算(配列操作、数学関数)

  • matplotlib: データのプロットと可視化

  • scipy: 科学技術計算(最適化、数値根探索)

これらのライブラリは、Pythonのパッケージマネージャ pip を使用してインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install numpy matplotlib scipy

必要な入力ファイル

プログラムは、太陽電池の電流-電圧(IV)特性データを含むCSVファイルを読み込むことを想定しています。デフォルトのファイル名は input.csv ですが、--infile 引数で指定できます。

CSVファイルの形式:

read_data 関数は、以下のような構造のCSVファイルを期待します。

  1. メタデータセクション: MetaData 行で始まるオプションのセクション。

    • MetaData,TestRecord.RecordTime,YYYY-MM-DD HH:MM:SS の形式で記録時間を含めることができます。

    • 例:

      MetaData,TestRecord.RecordTime,2023-10-27 10:30:00
      
  2. データ開始マーカー: DataName 行。この行の後に実際のIVデータが続きます。

    • 例:

      DataName,Voltage(V),Current(A)
      
    • DataName は固定文字列です。その後のカラム名は読み飛ばされますが、一般的なヘッダとして含めることが推奨されます。

  3. IVデータセクション: DataValue 行で始まり、電圧と電流のペアが続きます。

    • DataValue,<Voltage>,<Current> の形式です。

    • プログラムはCSVファイルの2列目を電圧、3列目を電流として解釈します。

    • 例:

      DataValue,-0.1,0.005
      DataValue,0.0,0.0049
      DataValue,0.1,0.0048
      DataValue,0.2,0.0047
      ...
      DataValue,0.6,0.0001
      DataValue,0.7,-0.0005
      

例:input.csv

MetaData,TestRecord.RecordTime,2023-10-27 10:30:00
MetaData,DeviceName,Sample_A
DataName,Voltage(V),Current(A)
DataValue,-0.1,0.0051
DataValue,-0.05,0.0050
DataValue,0.0,0.0049
DataValue,0.05,0.0048
DataValue,0.1,0.0047
DataValue,0.2,0.0045
DataValue,0.3,0.0040
DataValue,0.4,0.0030
DataValue,0.5,0.0015
DataValue,0.55,0.0005
DataValue,0.58,0.0001
DataValue,0.59,0.0000
DataValue,0.6,-0.0001
DataValue,0.61,-0.0002
DataValue,0.62,-0.0003

また、フィッティングの初期パラメータや固定パラメータを指定するために、パラメータCSVファイルを読み込むことも可能です。これは通常、以前の実行で生成された <infile_stem>-parameters.csv という名前のファイルです。

パラメータCSVファイルの形式:

このファイルは、varname, value, optid(オプション)、error(オプション)の列を持つCSV形式です。

  • varname: パラメータ名(例: I0, ndiode, IPV, Rs, Rsh)。

  • value: パラメータの値。

  • optid: 0の場合はパラメータを固定、1の場合は最適化中に自由パラメータとします(デフォルトは1)。

  • error: フィッティング後の推定誤差(読み込み時には無視されます)。

例:input-parameters.csv

varname,value,optid,error
I0,1.0e-10,1,1.2e-11
ndiode,1.5,1,0.05
IPV,0.005,1,1.0e-05
Rs,10.0,1,0.8
Rsh,10000.0,1,1000.0
VOC_est,0.595,0,0
ISC_est,0.0049,0,0
RSS_logy,0.0012,0,0

生成される出力ファイル

pvfit_simple.py は、フィッティングの結果として以下のファイルとプロットを生成します。

  1. パラメータCSVファイル:

    • ファイル名: <入力CSVファイル名から拡張子を除いたもの>-parameters.csv (例: input-parameters.csv)。

    • 内容:

      • フィッティングされた一ダイオードモデルのパラメータ (I0, ndiode, IPV, Rs, Rsh) の最終値。

      • 各パラメータがフィッティング中に固定されたか(optid=0)自由だったか(optid=1)を示す情報。

      • 各自由パラメータの推定誤差。

      • 推定された開回路電圧 (VOC_est) と短絡電流 (ISC_est)。

      • フィッティングの残差平方和 (RSS_logy)。

    • このファイルは、次の実行時の初期パラメータとしても使用できます。

  2. IV特性プロット:

    • 表示形式: matplotlib を用いたインタラクティブなグラフィカルウィンドウとして表示されます。ファイルとしては保存されません(必要に応じて手動で保存)。

    • 内容:

      • 線形スケールプロット: 測定された電流-電圧特性(青色の点)と、フィッティングによって得られたモデル曲線(オレンジ色の線)を線形スケールで表示します。

      • 対数スケールプロット: 測定された電流の絶対値とモデル曲線の絶対値を対数スケールで表示します。微小電流領域でのフィッティング精度を評価するのに役立ちます。

      • 信頼性区間: フィッティング後のモデル曲線の周囲に、対数スケールでの標準偏差に基づいて計算された信頼性区間が水色で塗りつぶされて表示されます。

例:input-parameters.csv の出力内容

varname,value,optid,error
I0,1.02345e-10,1,1.23e-11
ndiode,1.523,1,0.045
IPV,4.987e-03,1,1.02e-05
Rs,9.87,1,0.78
Rsh,1.05e+04,1,980.0
VOC_est,0.5923,0,0
ISC_est,4.991e-03,0,0
RSS_logy,0.0015,0,0

コマンドラインでの使用例 (Usage)

pvfit_simple.py は、コマンドライン引数を使用して実行モードやパラメータを設定します。

python pvfit_simple.py [--mode {init,fit,sim}] [--method METHOD] [--infile INFILE] [--temperature TEMPERATURE] [--xmin XMIN] [--xmax XMAX] [--I0 I0] [--ndiode NDIODE] [--IPV IPV] [--Rs RS] [--Rsh RSH] [--fix [FIX ...]] [--nlsq_points NLSQ_POINTS] [--ninterval_print NINTERVAL_PRINT] [--ninterval_plot NINTERVAL_PLOT]

引数の説明:

  • --mode {init,fit,sim}:

    • init: IVデータから初期パラメータを推定し、CSVに保存します。フィッティングは行いません。

    • fit: (デフォルト)IVデータにSDMをフィッティングし、パラメータを最適化してCSVに保存します。

    • sim: 指定された(またはCSVから読み込んだ)パラメータでIV曲線をシミュレーションし、プロットします。フィッティングは行いません。

  • --method METHOD: scipy.optimize.minimize で使用する最適化アルゴリズム。デフォルトは Nelder-Mead。他に L-BFGS-B, Powell などがあります。

  • --infile INFILE: 入力IV特性CSVファイルのパス。デフォルトは input.csv

  • --temperature TEMPERATURE: 計算に使用するセル温度 (K)。デフォルトは 300.0

  • --xmin XMIN: プロットおよびフィッティングに使用する電圧範囲の最小値 (V)。

  • --xmax XMAX: プロットおよびフィッティングに使用する電圧範囲の最大値 (V)。

  • --I0 I0, --ndiode NDIODE, --IPV IPV, --Rs RS, --Rsh RSH:

    • 各SDMパラメータの値を直接指定します。

    • これらの値は、初期パラメータ推定やパラメータCSVファイルからの読み込みよりも優先されます。

  • --fix [FIX ...]:

    • フィッティング中に固定するパラメータの名前をスペース区切りで指定します(例: I0 ndiode)。

    • これはパラメータCSVファイルで optid=0 と指定されたパラメータと組み合わされます。

  • --ninterval_print NINTERVAL_PRINT: フィッティング中のコンソール出力間隔(イテレーション数)。デフォルトは 10

  • --ninterval_plot NINTERVAL_PLOT: フィッティング中のプロット更新間隔(イテレーション数)。デフォルトは 10

コマンドラインでの具体的な使用例

ここでは、前述の input.csv の内容を前提とした具体的な使用例を示します。

1. 初期パラメータの生成 (init モード)

input.csv からIV特性を読み込み、自動的に初期パラメータを推定して input-parameters.csv に保存します。フィッティングは行われません。

python pvfit_simple.py --mode init --infile input.csv

コンソール出力例:

File Name: input.csv
Record Time: 2023-10-27 10:30:00
Voltage range: -0.1000 to 0.6200 V

--- Initial Parameters Saved ---

生成される input-parameters.csv の内容例:

varname,value,optid,error
I0,1.0e-10,1,0
ndiode,1.5,1,0
IPV,0.00495,1,0
Rs,10.0,1,0
Rsh,10000.0,1,0
VOC_est,0,0,0
ISC_est,0,0,0
RSS_logy,0,0,0

VOC_est, ISC_est, RSS_logyinit モードでは計算されないためゼロで初期化されます)

2. 基本的なフィッティング (fit モード)

input.csv からIV特性を読み込み、推定された初期パラメータ(または既存の input-parameters.csv から読み込んだパラメータ)を基にフィッティングを行います。

python pvfit_simple.py --infile input.csv

コンソール出力例(フィッティング中の途中経過と最終結果):

File Name: input.csv
Record Time: 2023-10-27 10:30:00
Voltage range: -0.1000 to 0.6200 V
Iter   10 | RSS: 1.2345e-02 | I0: 1.12e-10 | ndiode: 1.55e+00 | IPV: 4.90e-03 | Rs: 9.80e+00 | Rsh: 9.50e+03
Iter   20 | RSS: 8.7654e-03 | I0: 1.05e-10 | ndiode: 1.51e+00 | IPV: 4.95e-03 | Rs: 9.90e+00 | Rsh: 1.01e+04
...
Iter   80 | RSS: 1.5000e-03 | I0: 1.02e-10 | ndiode: 1.52e+00 | IPV: 4.99e-03 | Rs: 9.87e+00 | Rsh: 1.05e+04

Final Results (RSS: 1.5000e-03)
  I0      : 1.023456e-10 +/- 1.23e-11
  ndiode  : 1.523456e+00 +/- 4.56e-02
  IPV     : 4.991234e-03 +/- 1.02e-05
  Rs      : 9.876543e+00 +/- 7.89e-01
  Rsh     : 1.054321e+04 +/- 9.87e+02

生成される input-parameters.csv の内容例:

varname,value,optid,error
I0,1.023456e-10,1,1.23e-11
ndiode,1.523456e+00,1,4.56e-02
IPV,4.991234e-03,1,1.02e-05
Rs,9.876543e+00,1,7.89e-01
Rsh,1.054321e+04,1,9.87e+02
VOC_est,0.592345,0,0
ISC_est,0.004991,0,0
RSS_logy,0.001500,0,0

加えて、測定データとフィッティング曲線、信頼性区間を示すプロットウィンドウが表示されます。

3. 特定のパラメータを固定してフィッティング

--fix 引数を使用して、特定のパラメータを最適化中に固定します。この例では ndiodeRs を固定します。

python pvfit_simple.py --infile input.csv --fix ndiode Rs

コンソール出力例:

...
Final Results (RSS: 2.1000e-03)
  I0      : 1.011223e-10 +/- 1.50e-11
  ndiode  : 1.500000e+00 (Fixed)
  IPV     : 4.980123e-03 +/- 1.10e-05
  Rs      : 1.000000e+01 (Fixed)
  Rsh     : 1.020000e+04 +/- 1.20e+03

ndiodeRs の誤差表示が「(Fixed)」になっている点に注目)

4. パラメータの値を上書きしてシミュレーション (sim モード)

--sim モードで、指定されたパラメータ値を用いてIV曲線をシミュレーションします。このモードではフィッティングは行われません。--IPV で光電流を上書きする例です。

python pvfit_simple.py --mode sim --infile input.csv --IPV 0.004 --temperature 300.0

コンソール出力例:

File Name: input.csv
Record Time: 2023-10-27 10:30:00
Voltage range: -0.1000 to 0.6200 V

--- Simulation Mode ---
  I0      : 1.000000e-10  # (またはinput-parameters.csvからの値)
  ndiode  : 1.500000e+00  # (またはinput-parameters.csvからの値)
  IPV     : 4.000000e-03  # コマンドラインで上書きされた値
  Rs      : 1.000000e+01  # (またはinput-parameters.csvからの値)
  Rsh     : 1.000000e+04  # (またはinput-parameters.csvからの値)

この例では、IPV0.004 に設定された新しいモデル曲線がプロットされます。パラメータCSVファイルは更新されません。

5. 特定の電圧範囲でのフィッティング

--xmin--xmax を使用して、フィッティングに使用する電圧範囲を制限します。これにより、特定の動作領域でのフィッティング精度を高めることができます。

python pvfit_simple.py --infile input.csv --xmin 0.0 --xmax 0.6

このコマンドは、0.0Vから0.6Vの間のデータのみを使用してフィッティングを実行します。