pvfit.py ドキュメント
1. プログラム概要
pvfit.py は、太陽電池または半導体デバイスの電流-電圧特性を、拡張一ダイオードモデル(Extended Single Diode Model, Extended SDM)で解析する Python スクリプトです。
主な用途は次の通りです。
測定 IV データからモデルパラメータの初期値を推定する
測定 IV データに対して拡張一ダイオードモデルをフィッティングする
指定パラメータから IV カーブをシミュレーションする
フォワードバイアス側とリバースバイアス側で異なる輸送メカニズムを選択する
結果を CSV、Excel、PNG、TXT ログとして保存する
このプログラムでは、外部印加電圧 \(V\) に対して直接電流を陽に計算するのではなく、接合電圧 \(V_d\) を未知数とする暗黙方程式を数値的に解き、直列抵抗 \(R_s\) とシャント抵抗 \(R_{sh}\) の影響を含めて電流を求めます。
2. 対象ファイルと main script 動作
対象スクリプトは pvfit.py です。
ファイル末尾に if __name__ == "__main__": が存在するため、このファイルはライブラリとして import するだけでなく、コマンドラインから直接実行できます。
直接実行した場合の処理は次の流れです。
コマンドライン引数を解析する
引数の妥当性を検証する
ログファイルを開き、標準出力とログファイルの両方に出力する
入力 CSV が指定されていれば IV データを読み込む
既存のパラメータ CSV があれば読み込む
必要に応じて初期値を推定する
使用モデルに応じて未使用パラメータを自動固定する
analyze,init,fit,simの各モードを実行するグラフ、Excel、パラメータ CSV、ログを保存する
終了前に Enter 入力を待つ
3. 使用されている電気特性モデル
3.1 モデルの基本構造
このコードで計算される外部電流 \(I(V)\) は、接合電圧 \(V_d\) を介して定義されます。
まず、選択された輸送メカニズムの接合電流を \(I_j(V_d)\) とします。シャント抵抗を流れる電流を含めた枝電流 \(I_{\mathrm{branch}}\) は次式です。
外部印加電圧 \(V\) は、接合電圧 \(V_d\) と直列抵抗 \(R_s\) による電圧降下を用いて、次の暗黙方程式で表されます。
したがって、モデル電流は次式で与えられます。
ここで、\(I_{PV}\) は光生成電流に相当するパラメータです。コードでは \(I_{PV}\) を正の値として扱い、最終電流から差し引きます。そのため、\(V=0\) 近傍では \(I_{PV}\) が大きいほど負方向の短絡電流が現れます。
3.2 接合電圧 \(V_d\) の数値解法
外部電圧 \(V\) ごとに、次の残差関数を定義します。
コードでは、この \(F(V_d; V)=0\) を満たす \(V_d\) を Brent 法で探索します。
探索範囲内で符号変化が見つからない場合は、フォールバックとして \(V_d \approx V\) を用います。さらに例外が発生した場合は、次の近似式で電流を返します。
3.3 フォワードモデルとリバースモデルのブレンド
--forwardIV と --reverseIV が同じ輸送メカニズムの集合である場合、接合電流はそのモデルだけで計算されます。
一方、フォワード側とリバース側で異なるモデルを指定した場合、\(V_d=0\) 近傍でシグモイド関数により滑らかにブレンドされます。
ブレンド係数 \(w(V_d)\) は次式です。
ここで、\(dV\) は --dv_blend で指定される遷移幅です。
接合電流は次式で合成されます。
\(dV\) が非常に小さい場合、コード上は \(V_d \ge 0\) で 1、\(V_d < 0\) で 0 となるステップ関数に近い動作になります。
4. 電流成分の数式
4.1 ダイオード電流
ダイオード成分は Shockley 型の指数関数で計算されます。
熱電圧に理想因子 \(n\) を含めた有効電圧 \(V_t\) は次式です。
ここで、\(k_B\) は Boltzmann 定数、\(q\) は電気素量、\(T\) は温度です。
ダイオード電流は次式です。
実装では、指数関数のオーバーフローを防ぐため、指数の引数は \([-700, 700]\) にクリップされます。
4.2 TFE フォワード電流
TFE は、コード中では熱アシストトンネルフィールドエミッション電流として扱われています。フォワード側の TFE 成分は次式です。
\(E_{00}\) はゼロ除算を防ぐため、実装上は最小値 \(10^{-12}\) に制限されます。
4.3 TFE リバース電流
リバース側の TFE 成分は、\(-V_d\) に対して指数関数的に増加する負電流として定義されています。
この式により、\(V_d<0\) で負方向の電流が大きくなります。
4.4 Fowler-Nordheim 型トンネル電流
コードでは fn として Fowler-Nordheim 型の電流成分が実装されています。
フォワード側では、\(V_d>10^{-12}\) のときのみ次式で計算されます。
\(V_d \le 10^{-12}\) の場合、フォワード FN 電流は 0 です。
リバース側では、\(V_d<-10^{-12}\) のとき、\(|V_d|=-V_d\) として次式で計算されます。
\(V_d \ge -10^{-12}\) の場合、リバース FN 電流は 0 です。
4.5 SCLC 電流
SCLC は空間電荷制限電流です。実際に junction_current_forward() と junction_current_reverse() から呼ばれる SCLC 成分は、電圧の 2 乗に比例する単純なモデルです。
この式は、電圧の符号に応じて電流方向を反転します。
4.6 トラップ遷移 SCLC モデル
コードには j_sclc_trap_transition() という関数も存在します。この関数は、トラップ制限 SCLC とトラップフリー SCLC の遷移を滑らかに表すための補助モデルです。
低電圧側のトラップ制限電流は次式です。
高電圧側のトラップフリー電流は次式です。
ここで、
遷移係数は次式です。
最終的な電流は次式です。
ただし、この関数で必要な \(m_{\mathrm{sclc}}\) と \(V_{\mathrm{tfl}}\) はコマンドライン引数や PARAM_NAMES に含まれていません。したがって、現在のメインモデルではこのトラップ遷移 SCLC は自動的には使用されません。
4.7 接合電流の合成
フォワード側の接合電流は、選択されたメカニズムの和です。
リバース側の接合電流も同様です。
ここで、\(M_f\) は --forwardIV で指定されたメカニズム集合、\(M_r\) は --reverseIV で指定されたメカニズム集合です。
指定可能なメカニズム名は次の通りです。
指定名 |
内容 |
主なパラメータ |
|---|---|---|
|
Shockley 型ダイオード電流 |
|
|
TFE 電流 |
|
|
Fowler-Nordheim 型電流 |
|
|
空間電荷制限電流 |
|
複数のメカニズムは diode+tfe+sclc のように + で連結します。カンマ区切りも解析できます。none または off は空のメカニズム集合として扱われます。
5. フィッティングで使う目的関数
5.1 符号付きログ圧縮
フィッティングでは、電流をそのまま最小二乗するのではなく、符号を保持したログ圧縮表現を使います。
ここで、\(\varepsilon_I=10^{-15}\) です。
5.2 残差平方和
測定電流を \(I_{\mathrm{meas},i}\)、モデル電流を \(I_{\mathrm{calc},i}\) とすると、目的関数は次式です。
この目的関数は、電流の絶対値が桁違いに変化する IV データに対して、低電流領域と高電流領域の両方を比較しやすくする目的で使われています。
5.3 最適化パラメータのスケール
次のパラメータは、内部では \(\log_{10}\) スケールで最適化されます。
I0IPVRsRshA_tfeE00A_fnB_fnK_sclc
ndiode は線形スケールで最適化されます。
6. 初期値推定の方法
mode=init または mode=analyze、またはパラメータ CSV が存在しない場合に、測定 IV データから初期値を推定します。
6.1 データ前処理
まず電圧 \(V\) の重複を除き、局所多項式近似により電流を平滑化します。平滑化後の電流を \(I_{\mathrm{sm}}(V)\) とすると、数値微分により \(dI/dV\) を求めます。
6.2 直列抵抗 \(R_s\) の初期値
正電圧領域 \(V>0\) で \(dI/dV\) が最大となる代表点を探し、その勾配から次式で推定します。
正電圧データがない場合は、全データ範囲の最大勾配を使います。
6.3 シャント抵抗 \(R_{sh}\) の初期値
負電圧領域 \(V<0\) で \(dI/dV\) が最小となる代表点を探し、その勾配から次式で推定します。
負電圧データがない場合は、全データ範囲の最小勾配を使います。
6.4 短絡電流と光電流
短絡電流は \(V=0\) 近傍の局所多項式値として推定されます。
光電流の初期値は次式です。
6.5 開放電圧
開放電圧は、\(I(V)=0\) となる電圧として、多項式根または局所二次フィットから推定されます。
最終的にコードでは estimate_voc_local_quadratic() による局所二次近似結果を使っています。
6.6 逆飽和電流 \(I_0\)
負電圧領域の代表点 \(V_{sh}\) における電流を \(I_{sh}\) として、次式で初期推定します。
この推定はコード上の経験的な初期値であり、物理的に厳密な抽出式ではありません。
6.7 TFE パラメータの初期値
負電圧側の十分負の領域で、次の近似に基づいて一次フィットを行います。
傾き \(a\) から \(E_{00}\) を次式で推定します。
代表点 \((V_{\mathrm{tfe}}, I_{\mathrm{tfe}})\) から、次式で \(A_{\mathrm{tfe}}\) を推定します。
負電圧領域のデータ点が十分でない場合、A_tfe=1.0e-30, E00=1.0e-3 が使われます。
7. 必要ライブラリ
7.1 標準ライブラリ
ossysargparsebuiltinspathlibtracebackcsv
7.2 非標準ライブラリ
numpyscipymatplotlibopenpyxl
インストール例は次の通りです。
pip install numpy scipy matplotlib openpyxl
8. 入力ファイル
8.1 IV データ CSV
--infile で指定する入力ファイルは CSV です。コードでは、次の規則でデータを読み取ります。
MetaData行にRecordTimeが含まれる場合、3列目を記録時刻として保存するDataName行が現れた後、DataValue行をデータ行として読むDataValue行の2列目を電圧 \(V\)、3列目を電流 \(I\) として読む読み込んだ後、電圧昇順にソートする
--xmin,--xmaxが指定されていれば電圧範囲でクリップする--ndataskipが指定されていれば、ndataskip+1点ごとに間引く
データ例は次の通りです。
MetaData,RecordTime,2026-07-09 10:00:00
DataName,Voltage,Current
DataValue,-0.200,-1.20e-6
DataValue,-0.100,-1.10e-6
DataValue,0.000,-1.00e-6
DataValue,0.100,-8.00e-7
DataValue,0.500,1.00e-5
注意点として、DataValue 行の電圧または電流が数値変換できない場合、コード上はその場で例外が発生します。一般的な V,I ヘッダの CSV をそのまま読む実装ではありません。
8.2 パラメータ CSV
入力 IV ファイル名から拡張子を除いた名前に -parameters.csv を付けたファイルが存在する場合、自動的に読み込まれます。
例として、入力が sample.csv の場合、パラメータファイル名は次の通りです。
sample-parameters.csv
想定列は次の通りです。
列名 |
意味 |
|---|---|
|
パラメータ名 |
|
パラメータ値 |
|
|
|
推定誤差。読み込み時には主に値と固定設定が使われる |
9. 出力ファイル
9.1 ログファイル
実行時に次の名前のログファイルを作成します。
{outprefix}_{mode}.txt
標準出力と同じ内容がログにも保存されます。
9.2 パラメータ CSV
mode=init または mode=fit では、次のパラメータ CSV が保存されます。
{入力ファイル名のstem}-parameters.csv
fit モードでは、最終パラメータ、固定状態、推定誤差、RSS_logy が保存されます。
9.3 Excel ファイル
次の Excel ファイルが保存されます。
{outprefix}-fitted.xlsx
主なシートは次の通りです。
シート名 |
内容 |
|---|---|
|
電圧、測定電流、初期モデル電流、最終モデル電流、絶対値、log10 絶対値 |
|
初期パラメータ |
|
最終パラメータと推定誤差 |
|
ファイル名、記録時刻、データ点数、RSS |
analyze モードでは Excel 保存は行われません。
9.4 PNG グラフ
次の PNG ファイルを保存します。
{outprefix}-iv.png
グラフは2パネル構成です。
左: 線形スケールの IV カーブ
右:
abs(I)の対数スケール表示
fit モードでは、線形近似によるモデル電流の信頼性区間が水色領域として表示されます。
10. コマンドライン引数
引数 |
型 |
デフォルト |
意味 |
|---|---|---|---|
|
choice |
|
実行モード。 |
|
str |
|
|
|
str |
なし |
入力 IV CSV ファイル |
|
float |
|
モデル温度 K |
|
float |
なし |
読み込み・フィット・プロットに使う最小電圧 |
|
float |
なし |
読み込み・フィット・プロットに使う最大電圧 |
|
int |
|
データ間引き数。 |
|
str |
|
フォワード側の輸送メカニズム |
|
str |
|
リバース側の輸送メカニズム |
|
float |
|
フォワード/リバースモデルのブレンド幅 V |
|
int |
|
フィッティング中のコンソール出力間隔 |
|
int |
|
フィッティング中のアニメーション更新間隔 |
|
int |
|
最適化の最大イテレーション数 |
|
float |
|
最適化許容誤差 |
|
list |
空 |
固定するパラメータ名のリスト |
|
str |
|
出力ファイル接頭辞 |
次のモデルパラメータは、コマンドラインから初期値を上書きできます。
引数 |
意味 |
|---|---|
|
ダイオード逆飽和電流 |
|
ダイオード理想因子 |
|
光生成電流 |
|
直列抵抗 |
|
シャント抵抗 |
|
TFE 振幅係数 |
|
TFE の特性電圧またはエネルギー相当係数 |
|
FN 電流の振幅係数 |
|
FN 電流の指数係数 |
|
SCLC 係数 |
係数の厳密な物理単位は、コードからは明示されていません。面積で割る処理は実装されていないため、関数名が j_* であっても、コード上は電流値として扱われます。
11. Usage
11.1 初期値推定
python pvfit.py --mode init --infile sample.csv --outprefix sample_init
この実行では、測定 IV データから初期値を推定し、パラメータ CSV、Excel、PNG を保存します。
11.2 フィッティング
python pvfit.py --mode fit --infile sample.csv --outprefix sample_fit
この実行では、既存の sample-parameters.csv があれば読み込み、なければ初期値推定を行った後、測定データに対してパラメータを最適化します。
11.3 フォワード・リバースで異なるモデルを指定する例
python pvfit.py --mode fit --infile sample.csv --forwardIV diode+sclc --reverseIV diode+tfe --outprefix sample_diode_tfe_sclc
この例では、フォワード側に diode+sclc、リバース側に diode+tfe を使います。\(V_d=0\) 近傍では --dv_blend で指定された幅で両者がブレンドされます。
11.4 一部パラメータを固定する例
python pvfit.py --mode fit --infile sample.csv --fix ndiode Rs --outprefix sample_fixed
この例では、ndiode と Rs は最適化されません。
11.5 シミュレーション
python pvfit.py --mode sim --forwardIV diode --reverseIV diode+tfe --I0 1e-10 --IPV 1e-6 --Rs 1 --Rsh 1e9 --outprefix sim_test
--infile を指定しない sim モードでは、\(V=-0.2\) V から \(0.8\) V までの 500 点が内部生成されます。
12. 具体的な実行例
12.1 TFE を含むリバース特性のフィット
python pvfit.py \
--mode fit \
--infile sample.csv \
--temperature 300 \
--forwardIV diode \
--reverseIV diode+tfe \
--dv_blend 0.05 \
--outprefix sample_fit
この場合、フォワード側は Shockley ダイオード成分、リバース側は Shockley ダイオード成分と TFE 成分の和として計算されます。
保存される主なファイルは次の通りです。
sample_fit_fit.txt
sample-parameters.csv
sample_fit-fitted.xlsx
sample_fit-iv.png
12.2 FN と SCLC を含める例
python pvfit.py \
--mode fit \
--infile sample.csv \
--forwardIV diode+fn+sclc \
--reverseIV diode+tfe+fn \
--A_fn 1e-30 \
--B_fn 10 \
--K_sclc 1e-30 \
--outprefix sample_extended
この例では、フォワード側にダイオード、FN、SCLC、リバース側にダイオード、TFE、FN を含めます。未使用のパラメータは自動固定されます。
13. import 方法
ライブラリとして利用する場合は、次のように import できます。
import pvfit
または、特定関数だけを import できます。
from pvfit import model, estimate_initial_params
ただし、スクリプト全体はコマンドライン実行を主用途として設計されています。main() は標準出力のリダイレクトやユーザー入力待ちを含むため、ライブラリ利用時には model() や個別関数を直接呼び出す方が扱いやすいです。
14. API 一覧
14.1 モデル計算 API
関数 |
役割 |
|---|---|
|
拡張 SDM により IV カーブを計算 |
|
フォワード側の接合電流を合成 |
|
リバース側の接合電流を合成 |
|
ダイオード電流を計算 |
|
フォワード TFE 電流を計算 |
|
リバース TFE 電流を計算 |
|
フォワード FN 電流を計算 |
|
リバース FN 電流を計算 |
|
SCLC 電流を計算 |
|
トラップ遷移 SCLC を計算。ただし main モデルからは未使用 |
14.2 データ入出力 API
関数 |
役割 |
|---|---|
|
IV CSV を読み込む |
|
パラメータ CSV を読み込む |
|
パラメータ CSV を保存 |
|
IV データとパラメータを Excel 保存 |
14.3 初期値推定・数値補助 API
関数 |
役割 |
|---|---|
|
IV データから初期パラメータを推定 |
|
VOC を局所二次近似で推定 |
|
多項式フィットから目標値の根を推定 |
|
局所多項式により指定点の値を推定 |
|
局所多項式平滑化 |
|
シグモイドブレンド係数を計算 |
|
2値の符号が同じか判定 |
14.4 フィッティング API
関数 |
役割 |
|---|---|
|
自由パラメータを最適化ベクトルへ変換 |
|
最適化ベクトルをパラメータ辞書へ戻す |
|
符号付きログ電流へ変換 |
|
残差平方和を計算 |
|
ヤコビ行列を数値微分で計算 |
|
パラメータ誤差と信頼区間を推定 |
|
fit モード本体 |
14.5 CLI・表示 API
関数 |
役割 |
|---|---|
|
argparse により CLI 引数を定義・解析 |
|
引数の妥当性を検証 |
|
引数と派生設定を表示 |
|
モデル指定文字列をメカニズム集合へ変換 |
|
使用パラメータ集合を判定 |
|
パラメータ値と固定設定を最終決定 |
|
パラメータ一覧を表示 |
|
フィット中アニメーション用プロットを初期化 |
|
IV グラフを描画・保存 |
|
標準出力とログファイルへ同時出力 |
|
コマンドライン実行のエントリーポイント |
15. グローバル変数
変数 |
初期値 |
意味 |
|---|---|---|
|
|
Boltzmann 定数 |
|
|
電気素量 |
|
リスト |
最適化対象候補のパラメータ名 |
|
セット |
内部で log10 最適化するパラメータ |
|
|
ログ電流計算用の微小電流 |
|
|
抵抗のゼロ除算防止用の微小値 |
|
辞書 |
シミュレーションや初期値欠落時の既定値 |
|
|
プロット表示用フォントサイズ |
|
|
元の |
|
|
ログファイルハンドル |
16. パラメータの意味
パラメータ |
意味 |
使用メカニズム |
|---|---|---|
|
ダイオード逆飽和電流 |
|
|
ダイオード理想因子 |
|
|
光生成電流 |
共通 |
|
直列抵抗 |
共通 |
|
シャント抵抗 |
共通 |
|
TFE 振幅係数 |
|
|
TFE 指数の電圧スケール |
|
|
FN 電流の振幅係数 |
|
|
FN 指数係数 |
|
|
SCLC 係数 |
|
共通パラメータ Rs, Rsh, IPV は、輸送メカニズムの選択に関係なく使用されます。
17. 注意点・制限事項
17.1 モデル式の制限
このコードは複数の電流成分を経験的に組み合わせられるようにした拡張モデルです。各係数の厳密な物理単位、デバイス面積規格化、材料パラメータとの対応は、コードからは確認できません。
17.2 接合電圧の根探し
各電圧点ごとに Brent 法で根を探索するため、データ点数が多い場合や最適化反復回数が多い場合は計算時間が増えます。
17.3 指数関数のクリップ
指数関数の引数は \([-700, 700]\) にクリップされます。これにより数値オーバーフローは避けられますが、極端な電圧やパラメータでは物理的な指数増加が頭打ちになります。
17.4 パラメータ相関
I0, ndiode, Rs, Rsh, IPV, A_tfe などは相関しやすく、測定範囲が狭い場合は一意に決まりにくい可能性があります。必要に応じて --fix により一部パラメータを固定してください。
17.5 B_fn と正値制約
B_fn はコード上、正値でなければなりません。また内部最適化では log10 スケールに含まれています。
17.6 j_sclc_trap_transition() は未接続
トラップ遷移 SCLC 関数は実装されていますが、parse_mech_mode() や PARAM_NAMES には m_sclc, Vtfl が含まれていません。通常の CLI 実行ではこのモデルは使われません。
17.7 入力 CSV の形式
read_data() は DataName 行以降の DataValue 行を読む専用形式です。一般的な列名付き CSV にはそのまま対応していません。
17.8 実行終了時の入力待ち
各モードの最後で input() により Enter 入力待ちになります。バッチ処理や自動実行では、この仕様に注意してください。
18. エラー条件
コード上で明示的に検証される主なエラー条件は次の通りです。
条件 |
エラー内容 |
|---|---|
|
|
|
無効なスキップ数 |
|
電圧範囲指定が不正 |
|
温度が不正 |
|
ブレンド幅が不正 |
|
表示間隔が不正 |
|
プロット更新間隔が不正 |
|
最大反復回数が不正 |
|
許容誤差が不正 |
|
未知パラメータ |
log スケール対象パラメータが 0 以下 |
正値制約違反 |
|
理想因子が不正 |
|
FN 係数が不正 |
入力 CSV に有効データがない |
データなし |
クリッピング後にデータが残らない |
データなし |
19. 代表的な解析ワークフロー
19.1 初回解析
mode=initで初期値を推定する生成された
*-parameters.csvを確認する明らかに固定したいパラメータの
optidを 0 にするmode=fitでフィッティングするPNG と Excel で結果を確認する
19.2 フィットが不安定な場合
--xmin,--xmaxでフィット範囲を制限する--fix ndiodeなどで相関しやすいパラメータを固定する最初は
diodeだけでフィットし、その後tfe,fn,sclcを追加する--nmaxiterを増やす--method Powellなど別の最適化手法を試すリバース特性のみが合わない場合は
--reverseIV diode+tfeや--reverseIV diode+fnを試す
20. まとめ
pvfit.py は、拡張一ダイオードモデルを基礎として、ダイオード電流、TFE、FN、SCLC を任意に組み合わせられる IV フィッティングツールです。
中心となるモデル式は次の3式です。
外部電圧 \(V\) ごとに \(V_d\) を数値的に解くことで、直列抵抗とシャント抵抗を含む非線形 IV 特性を安定に計算します。さらに、フォワード・リバースで異なる輸送モデルを設定し、\(V_d=0\) 近傍でシグモイド関数により滑らかに接続できます。