pvfit.py 技術ドキュメント
プログラムの動作
pvfit.py は、太陽電池やその他の半導体デバイスの電流-電圧(IV)特性を、拡張一ダイオードモデル(SDM)を用いて解析するための多機能ツールです。このプログラムは、IVカーブのフィッティング、モデルパラメータの初期値推定、およびシミュレーションを実行できます。
主な機能は以下の通りです。
多輸送メカニズムのサポート: 理想ダイオード、トンネル誘起フォワードエミッション (TFE)、非理想フォワード電流 (FN: Fowler-Nordheimトンネリング)、空間電荷制限電流 (SCLC) の各メカニズムを組み合わせて利用できます。
フォワード/リバースバイアスモデルの独立選択: フォワードバイアスとリバースバイアスのモデルをそれぞれ独立に選択・適用できます。接合電圧 (\(V_d\)) が0Vを横切る付近では、シグモイド関数による滑らかな遷移を適用します。
安定した数値解法: モデルの電流計算は、接合電圧 (\(V_d\)) を未知数とする根探しアルゴリズム(Brent法)を用いて、安定的に数値解を求めます。
パラメータの自動管理: 選択された輸送メカニズムで未使用のモデルパラメータは、自動的に最適化対象から除外され、固定されます。
効率化: フォワードIVモデルとリバースIVモデルが同一の場合、計算の重複を避けて効率化が図られます。
最適化アニメーション: フィッティング実行中には、現在のIVカーブがリアルタイムでアニメーション表示され、最適化の進捗を視覚的に確認できます。
パラメータ誤差推定: 線形近似(ヤコビ行列に基づく共分散行列)により、最適化された各モデルパラメータの推定誤差が計算されます。
信頼性区間の表示: モデル電流の標準偏差から、フィッティングされたIVカーブの信頼性区間がプロット上に水色の領域として表示されます。
mode=init での初期値推定プロセスは特に頑健であり、以下の手順で行われます。
入力IVデータの電圧昇順ソート。
I-Vデータの局所多項式による平滑化。
dI/dVの解析から直列抵抗 (\(R_s\)) および並列抵抗 (\(R_{sh}\)) の初期値を推定。
\(V=0\) 付近の多項式フィッティングから短絡電流 (\(I_{SC}\)) を推定し、\(I_{PV} = -I_{SC}\) と設定。
\(I(V)=0\) の多項式根から開回路電圧 (\(V_{OC}\)) を推定。
\(V<0\) の代表点における電流からシャント電流 (\(I_{sh}\)) に関連する値を推定。
\(I_0 = I_{SC} - I_{sh}\) で逆飽和電流 (\(I_0\)) を推定。
TFEパラメータ (\(A_{tfe}\), \(E_{00}\)) は、\(V<0\) の十分に負の領域における \(\ln(|I|)-V\) プロットの一次近似から推定されます。
ダイオード理想因子 (\(n_{diode}\)) は固定初期値1.5を使用します。
FN、SCLCの初期値は、推定プロセスではカバーされず、結果に影響しない極小値が設定されます。
この初期値推定は、mode=fit での精密なフィッティングのための頑健な出発点を提供することを目的としています。
原理
pvfit.py は、拡張一ダイオードモデル(Extended Single Diode Model, SDM)に基づいてIV特性を解析します。SDMは、光電流、ダイオード電流、シャント電流、直列抵抗によって記述されます。
拡張一ダイオードモデルの基本構成
外部印加電圧 \(V\) と電流 \(I\) の関係は、以下のように記述されます。 $\( V = V_d + I \cdot R_s \)\( \)\( I = I_{PV} - I_J(V_d) - \frac{V_d}{R_{sh}} \)$ ここで、
\(V_d\): 接合電圧
\(R_s\): 直列抵抗
\(R_{sh}\): 並列抵抗(シャント抵抗)
\(I_{PV}\): 光生成電流
\(I_J(V_d)\): 接合における総電流(複数の輸送メカニズムの合計)
pvfit.py では、\(V_d\) を未知数として、以下の残差関数をゼロにする根をBrentのメソッド (scipy.optimize.brentq) で探索します。
$\( f(V_d) = V_d + R_s \left( I_J(V_d) + \frac{V_d}{R_{sh}} \right) - V = 0 \)\(
ここで、\)I_J(V_d)$ は選択された輸送メカニズム(ダイオード、TFE、FN、SCLC)の電流成分の合計です。
輸送メカニズムの電流成分
理想ダイオード電流 (Shockley方程式) $\( I_D(V_d) = I_0 \left( \exp\left(\frac{V_d}{n_{diode} k_B T / q}\right) - 1 \right) \)$ ここで、
\(I_0\): 逆飽和電流
\(n_{diode}\): ダイオード理想因子
\(k_B\): ボルツマン定数 (\(1.380649 \times 10^{-23} \text{ J/K}\))
\(T\): 絶対温度 (K)
\(q\): 素電荷 (\(1.602176634 \times 10^{-19} \text{ C}\))
熱アシストトンネルフィールドエミッション (TFE) 電流
フォワードバイアス成分: $\( I_{TFE,f}(V_d) = A_{tfe} \left( \exp\left(\frac{V_d}{E_{00}}\right) - 1 \right) \)$
リバースバイアス成分: $\( I_{TFE,r}(V_d) = -A_{tfe} \left( \exp\left(\frac{-V_d}{E_{00}}\right) - 1 \right) \)$ ここで、
\(A_{tfe}\): TFE電流の振幅係数
\(E_{00}\): TFEの特性エネルギーまたは係数
Fowler-Nordheim (FN) トンネル電流
フォワードバイアス成分 (\(V_d > 0\)): $\( I_{FN,f}(V_d) = A_{fn} V_d^2 \exp\left(\frac{-B_{fn}}{V_d}\right) \)$
リバースバイアス成分 (\(V_d < 0\)): $\( I_{FN,r}(V_d) = -A_{fn} (-V_d)^2 \exp\left(\frac{-B_{fn}}{-V_d}\right) \)$ ここで、
\(A_{fn}\): FN電流の振幅係数
\(B_{fn}\): FN電流の指数関数的電圧依存性を制御する係数
空間電荷制限電流 (SCLC) $\( I_{SCLC}(V_d) = \text{sign}(V_d) K_{sclc} |V_d|^2 \)$ ここで、
\(K_{sclc}\): SCLCの振幅係数
フォワードとリバースモデルのブレンド
pvfit.py では、フォワードバイアスとリバースバイアスのモデルが異なる場合に、接合電圧 \(V_d\) が0V付近で両モデルをスムーズにブレンドするためにシグモイド関数を使用します。ブレンド係数 \(w\) は以下のように計算されます。
$\( w(V_d) = \frac{1}{1 + \exp(-V_d / \Delta V)} \)\(
ここで、\)\Delta V\( はブレンドの遷移幅を制御するパラメータ (`dv_blend` 引数で指定)。
総接合電流 \)I_J(V_d)\( は、フォワードモデルの電流 \)I_{J,f}(V_d)\( とリバースモデルの電流 \)I_{J,r}(V_d)\( を用いて以下のように計算されます。
\)\( I_J(V_d) = w(V_d) \cdot I_{J,f}(V_d) + (1 - w(V_d)) \cdot I_{J,r}(V_d) \)$
最適化と誤差推定
フィッティング (mode=fit) は、scipy.optimize.minimize を用いて、測定電流とモデル電流の間の残差平方和を最小化することで行われます。目的関数は、電流の絶対値の常用対数を符号付きで用いることで、幅広い電流値範囲でのフィッティング精度を向上させています。
$\( \text{Objective} = \sum_{k} \left( \text{sign}(I_{\text{meas},k}) \log_{10}(|I_{\text{meas},k}| + \epsilon) - \text{sign}(I_{\text{calc},k}) \log_{10}(|I_{\text{calc},k}| + \epsilon) \right)^2 \)\(
ここで \)\epsilon$ は計算安定化のための微小量 (EPS_I) です。
パラメータの誤差推定には、最適化されたパラメータでのモデルのヤコビ行列が数値的に計算され、共分散行列に基づいて各パラメータの標準誤差とモデル電流の信頼区間が導出されます。
必要な非標準ライブラリとインストール方法
pvfit.py の実行には、以下の非標準Pythonライブラリが必要です。
numpy: 数値計算scipy: 最適化、数値計算matplotlib: グラフ描画openpyxl: Excelファイルの読み書き
これらのライブラリは、Pythonのパッケージマネージャ pip を使用してインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。
pip install numpy scipy matplotlib openpyxl
必要な入力ファイル
pvfit.py は、以下の種類の入力ファイルを読み込みます。
IVデータCSVファイル:
コマンドライン引数
--infileで指定します。カンマ区切り (CSV) フォーマットのテキストファイルです。
ファイルエンコーディングは
utf-8-sigが推奨されます。MetaData行でファイル情報(RecordTimeなど)を読み込むことができます。DataName行が出現した後から、実際のデータが開始されます。DataValueで始まる行に、V(電圧) とI(電流) のデータが格納されていると期待されます。例 (
input.csv):MetaData,RecordTime,2023-10-27 10:30:00 MetaData,SomeOtherInfo,Value DataName,Voltage,Current DataValue,-0.5,1.2e-7 DataValue,-0.4,1.0e-7 DataValue,0.0,-1.0e-6 DataValue,0.5,-1.2e-3 DataValue,0.6,-3.5e-3
パラメータ設定CSVファイル:
入力IVデータファイル名と同じプレフィックスで、
-parameters.csvという形式で自動的に探索されます(例:input.csvの場合input-parameters.csv)。このファイルが存在する場合、前回のフィッティング結果や手動で設定された初期パラメータを読み込みます。
varname,value,optidの3つの列を持つCSVファイルです。optidが0の場合、そのパラメータは固定されます。例 (
input-parameters.csv):varname,value,optid,error I0,1.000000e-10,1,0.000000e+00 ndiode,1.500000e+00,1,0.000000e+00 IPV,1.000000e-06,1,0.000000e+00 Rs,1.000000e+00,0,0.000000e+00 Rsh,1.000000e+09,1,0.000000e+00
生成される出力ファイル
pvfit.py は、実行モードとコマンドライン引数に応じて以下のファイルを生成します。出力ファイル名は、--outprefix 引数で指定されたプレフィックスに基づきます(デフォルトは pvfit)。
パラメータCSVファイル:
ファイル名:
[outprefix]-parameters.csv内容:
最適化後の(または初期推定の)SDMパラメータ値。
各パラメータが最適化中に固定されたかどうかの情報 (
optid)。fitモードの場合、各パラメータの推定誤差。fitモードの場合、残差平方和 (RSS_logy)。initまたはanalyzeモードの場合、IVデータから推定された補助的なパラメータ(VOC_est,ISC_estなど)。
IVデータExcelファイル:
ファイル名:
[outprefix]-fitted.xlsx内容: 複数のシートに分かれてデータが保存されます。
iv_dataシート:V(電圧)I_input(入力IVデータ)I_init(初期モデルによる電流)I_fit(フィッティング後のモデル電流)各電流の絶対値 (
abs_I_...)各電流の常用対数 (
log10_abs_I_...)
init_paramsシート (初期パラメータが利用可能な場合):初期SDMパラメータとその値。
初期値推定で得られた補助パラメータ。
final_paramsシート (fitモードの場合):最適化後の最終SDMパラメータとその値。
各パラメータの推定誤差。
summaryシート:入力ファイル名、レコード時間、データ点数。
fitモードの場合、残差平方和 (RSS_logy)。
IVカーブプロット画像ファイル:
ファイル名:
[outprefix]-iv.png内容:
入力IVデータ、初期モデルカーブ(もしあれば)、および最終モデルカーブを示すグラフ。
線形スケールと対数絶対値スケールの2つのサブプロットが含まれます。
fitモードの場合、フィッティングされたIVカーブの信頼区間が水色の領域で表示されます。
コマンドラインでの使用例 (Usage)
pvfit.py は、以下の基本的なコマンドライン引数で実行されます。
python pvfit.py --mode <mode> [options]
主要な引数:
--mode {analyze,init,fit,sim}: 実行モードを指定します。analyze: データ解析モード。初期値推定のみ行い、結果をプロットして表示します。パラメータは保存されません。init: 初期値推定モード。analyzeと同様に初期値推定を行いますが、推定されたパラメータをCSVファイルに保存します。fit: フィッティングモード。測定データに対してSDMパラメータを最適化します。sim: シミュレーションモード。指定されたパラメータでIVカーブをシミュレートします。
--infile INFILE: 入力IVデータCSVファイルのパス(sim以外で必須)。--temperature TEMPERATURE: モデル計算に使用する温度 (K)。デフォルト:300.0。--xmin XMIN,--xmax XMAX: データクリッピング、フィッティング、プロットに使用する電圧範囲 (V)。--ndataskip NDATASKIP: データを読み込む際にスキップするデータ点数。0はスキップなし。--forwardIV FORWARDIV: フォワードバイアス側の輸送メカニズム。例:'diode','diode+tfe+sclc'。デフォルト:'diode'。--reverseIV REVERSEIV: リバースバイアス側の輸送メカニズム。例:'diode+tfe','diode+fn'。デフォルト:'diode+tfe'。--dv_blend DV_BLEND: リバース/フォワードモデル間のシグモイド遷移幅 (V)。デフォルト:0.05。--nmaxiter NMAXITER: 最適化の最大イテレーション数(fitモードのみ)。デフォルト:1000。--tol TOL: オプティマイザの許容誤差(fitモードのみ)。デフォルト:1.0e-7。--fix [PARAM_NAMES ...]: フィッティング中に固定するパラメータ名のリスト(スペース区切り)。例:'I0 ndiode'。--outprefix OUTPREFIX: 出力ファイル名のプレフィックス。デフォルト:'pvfit'。
個別のパラメータ上書きオプション:
PARAM_NAMES リストにあるすべてのパラメータ(I0, ndiode, IPV, Rs, Rsh, A_tfe, E00, A_fn, B_fn, K_sclc)は、コマンドライン引数 --<param_name> <value> で初期値を上書きできます。
コマンドラインでの具体的な使用例
ここでは、架空の data.csv というIVデータファイルが存在すると仮定して、具体的な使用例を示します。
data.csv の内容例:
MetaData,RecordTime,2023-01-01 12:00:00
DataName,Voltage,Current
DataValue,-1.0,1.0e-7
DataValue,-0.5,8.0e-8
DataValue,0.0,-1.0e-6
DataValue,0.6,-5.0e-3
DataValue,0.7,-1.0e-2
DataValue,0.8,-5.0e-2
1. 初期パラメータ推定と結果の確認 (init モード)
init モードを使用して、IVデータからSDMパラメータの初期値を推定し、その結果をCSVファイルとプロット画像として保存します。
python pvfit.py --mode init --infile data.csv --temperature 300 --outprefix my_device_init
実行結果の説明:
my_device_init-parameters.csvというファイルが生成され、推定されたI0,ndiode,IPV,Rs,Rsh,A_tfe,E00(およびVOC_est,ISC_estなどの補助的な推定値) が保存されます。my_device_init-fitted.xlsxというExcelファイルが生成され、入力IVデータと初期モデルによるIVカーブが記録されます。my_device_init-iv.pngという画像ファイルが生成され、入力データと推定された初期パラメータによるIVカーブがプロットされます。コンソールには、推定された各パラメータとその値が表示されます。この結果は、フィッティングモードの出発点として利用できます。
2. パラメータフィッティングと誤差推定 (fit モード)
次に、init モードで生成された初期パラメータを基に、より精密なフィッティングを行います。ここでは、data-parameters.csv が自動的に読み込まれることを期待します。Rs を固定し、フォワードモデルを diode+tfe+sclc に、リバースモデルを diode+tfe+fn に設定してフィッティングを実行します。
python pvfit.py --mode fit --infile data.csv --temperature 300 --forwardIV diode+tfe+sclc --reverseIV diode+tfe+fn --fix Rs --outprefix my_device_fit --nmaxiter 2000 --tol 1e-8
実行結果の説明:
最適化プロセスがコンソールに出力され、
ninterval_printとninterval_plotに応じて進捗が表示されます。my_device_fit-parameters.csvというファイルが生成または更新され、最適化された最終パラメータ値、Rsが固定されたことを示すoptid=0、および各自由パラメータの推定誤差が保存されます。my_device_fit-fitted.xlsxというExcelファイルが生成され、入力データ、初期モデル、最終フィッティングモデル、および各パラメータのサマリーが保存されます。my_device_fit-iv.pngという画像ファイルが生成され、入力データ、初期モデル、最終フィッティングモデルがプロットされます。最終フィッティングモデルには、誤差推定に基づく信頼区間が水色の領域として表示されます。コンソールには、最終的な残差平方和 (RSS)、各パラメータの最終値と推定誤差が表示されます。
3. IVカーブのシミュレーション (sim モード)
sim モードでは、指定されたパラメータセットでIVカーブを生成します。入力IVデータは不要です。ここでは、特定のダイオードパラメータとSCLCパラメータを指定してシミュレーションします。
python pvfit.py --mode sim --temperature 300 --I0 1e-10 --ndiode 1.8 --IPV 1e-3 --Rs 1.0 --Rsh 1e6 --K_sclc 1e-10 --forwardIV diode+sclc --reverseIV diode --outprefix my_sim_curve
実行結果の説明:
sim-parameters.csvまたはmy_sim_curve-parameters.csv(指定された--outprefixに応じて)が生成され、シミュレーションに使用されたパラメータが記録されます。my_sim_curve-fitted.xlsxというExcelファイルが生成され、シミュレートされたIVデータが保存されます。my_sim_curve-iv.pngという画像ファイルが生成され、シミュレートされたIVカーブがプロットされます。このモードでは、
--infileが指定されていないため、プログラムはデフォルトの電圧範囲 (-0.2Vから0.8V) で500点のダミー電圧データを生成してシミュレーションを行います。