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 するだけでなく、コマンドラインから直接実行できます。

直接実行した場合の処理は次の流れです。

  1. コマンドライン引数を解析する

  2. 引数の妥当性を検証する

  3. ログファイルを開き、標準出力とログファイルの両方に出力する

  4. 入力 CSV が指定されていれば IV データを読み込む

  5. 既存のパラメータ CSV があれば読み込む

  6. 必要に応じて初期値を推定する

  7. 使用モデルに応じて未使用パラメータを自動固定する

  8. analyze, init, fit, sim の各モードを実行する

  9. グラフ、Excel、パラメータ CSV、ログを保存する

  10. 終了前に Enter 入力を待つ

3. 使用されている電気特性モデル

3.1 モデルの基本構造

このコードで計算される外部電流 \(I(V)\) は、接合電圧 \(V_d\) を介して定義されます。

まず、選択された輸送メカニズムの接合電流を \(I_j(V_d)\) とします。シャント抵抗を流れる電流を含めた枝電流 \(I_{\mathrm{branch}}\) は次式です。

\[ I_{\mathrm{branch}}(V_d) = I_j(V_d) + \frac{V_d}{R_{sh}} \]

外部印加電圧 \(V\) は、接合電圧 \(V_d\) と直列抵抗 \(R_s\) による電圧降下を用いて、次の暗黙方程式で表されます。

\[ V = V_d + R_s I_{\mathrm{branch}}(V_d) \]

したがって、モデル電流は次式で与えられます。

\[ I(V) = I_{\mathrm{branch}}(V_d) - I_{PV} = I_j(V_d) + \frac{V_d}{R_{sh}} - I_{PV} \]

ここで、\(I_{PV}\) は光生成電流に相当するパラメータです。コードでは \(I_{PV}\) を正の値として扱い、最終電流から差し引きます。そのため、\(V=0\) 近傍では \(I_{PV}\) が大きいほど負方向の短絡電流が現れます。

3.2 接合電圧 \(V_d\) の数値解法

外部電圧 \(V\) ごとに、次の残差関数を定義します。

\[ F(V_d; V) = V_d + R_s \left( I_j(V_d) + \frac{V_d}{R_{sh}} \right) - V \]

コードでは、この \(F(V_d; V)=0\) を満たす \(V_d\) を Brent 法で探索します。

\[ F(V_d; V)=0 \]

探索範囲内で符号変化が見つからない場合は、フォールバックとして \(V_d \approx V\) を用います。さらに例外が発生した場合は、次の近似式で電流を返します。

\[ I(V) \approx \frac{V}{R_s + R_{sh}} - I_{PV} \]

3.3 フォワードモデルとリバースモデルのブレンド

--forwardIV--reverseIV が同じ輸送メカニズムの集合である場合、接合電流はそのモデルだけで計算されます。

一方、フォワード側とリバース側で異なるモデルを指定した場合、\(V_d=0\) 近傍でシグモイド関数により滑らかにブレンドされます。

ブレンド係数 \(w(V_d)\) は次式です。

\[ w(V_d) = \frac{1}{1+\exp\left(-\frac{V_d}{dV}\right)} \]

ここで、\(dV\)--dv_blend で指定される遷移幅です。

接合電流は次式で合成されます。

\[ I_j(V_d) = w(V_d) I_{j,\mathrm{forward}}(V_d) + \left(1-w(V_d)\right) I_{j,\mathrm{reverse}}(V_d) \]

\(dV\) が非常に小さい場合、コード上は \(V_d \ge 0\) で 1、\(V_d < 0\) で 0 となるステップ関数に近い動作になります。

4. 電流成分の数式

4.1 ダイオード電流

ダイオード成分は Shockley 型の指数関数で計算されます。

熱電圧に理想因子 \(n\) を含めた有効電圧 \(V_t\) は次式です。

\[ V_t = \frac{n k_B T}{q} \]

ここで、\(k_B\) は Boltzmann 定数、\(q\) は電気素量、\(T\) は温度です。

ダイオード電流は次式です。

\[ I_{\mathrm{diode}}(V_d) = I_0 \left[ \exp\left(\frac{V_d}{V_t}\right)-1 \right] \]

実装では、指数関数のオーバーフローを防ぐため、指数の引数は \([-700, 700]\) にクリップされます。

4.2 TFE フォワード電流

TFE は、コード中では熱アシストトンネルフィールドエミッション電流として扱われています。フォワード側の TFE 成分は次式です。

\[ I_{\mathrm{TFE,f}}(V_d) = A_{\mathrm{tfe}} \left[ \exp\left(\frac{V_d}{E_{00}}\right)-1 \right] \]

\(E_{00}\) はゼロ除算を防ぐため、実装上は最小値 \(10^{-12}\) に制限されます。

4.3 TFE リバース電流

リバース側の TFE 成分は、\(-V_d\) に対して指数関数的に増加する負電流として定義されています。

\[ I_{\mathrm{TFE,r}}(V_d) = - A_{\mathrm{tfe}} \left[ \exp\left(\frac{-V_d}{E_{00}}\right)-1 \right] \]

この式により、\(V_d<0\) で負方向の電流が大きくなります。

4.4 Fowler-Nordheim 型トンネル電流

コードでは fn として Fowler-Nordheim 型の電流成分が実装されています。

フォワード側では、\(V_d>10^{-12}\) のときのみ次式で計算されます。

\[ I_{\mathrm{FN,f}}(V_d) = A_{\mathrm{fn}} V_d^2 \exp\left( -\frac{B_{\mathrm{fn}}}{V_d} \right) \]

\(V_d \le 10^{-12}\) の場合、フォワード FN 電流は 0 です。

リバース側では、\(V_d<-10^{-12}\) のとき、\(|V_d|=-V_d\) として次式で計算されます。

\[ I_{\mathrm{FN,r}}(V_d) = - A_{\mathrm{fn}} |V_d|^2 \exp\left( -\frac{B_{\mathrm{fn}}}{|V_d|} \right) \]

\(V_d \ge -10^{-12}\) の場合、リバース FN 電流は 0 です。

4.5 SCLC 電流

SCLC は空間電荷制限電流です。実際に junction_current_forward()junction_current_reverse() から呼ばれる SCLC 成分は、電圧の 2 乗に比例する単純なモデルです。

\[ I_{\mathrm{SCLC}}(V_d) = \operatorname{sign}(V_d) K_{\mathrm{sclc}} |V_d|^2 \]

この式は、電圧の符号に応じて電流方向を反転します。

4.6 トラップ遷移 SCLC モデル

コードには j_sclc_trap_transition() という関数も存在します。この関数は、トラップ制限 SCLC とトラップフリー SCLC の遷移を滑らかに表すための補助モデルです。

低電圧側のトラップ制限電流は次式です。

\[ I_{\mathrm{low}} = K_{\mathrm{sclc}} |V_d|^{m_{\mathrm{sclc}}} \]

高電圧側のトラップフリー電流は次式です。

\[ I_{\mathrm{high}} = K_{\mathrm{tf}} |V_d|^2 \]

ここで、

\[ K_{\mathrm{tf}} = K_{\mathrm{sclc}} V_{\mathrm{tfl}}^{m_{\mathrm{sclc}}-2} \]

遷移係数は次式です。

\[ w_{\mathrm{tfl}} = \frac{1}{1+\exp\left(-\frac{|V_d|-V_{\mathrm{tfl}}}{dV}\right)} \]

最終的な電流は次式です。

\[ I_{\mathrm{SCLC,tfl}} = \operatorname{sign}(V_d) \left[ (1-w_{\mathrm{tfl}}) I_{\mathrm{low}} + w_{\mathrm{tfl}} I_{\mathrm{high}} \right] \]

ただし、この関数で必要な \(m_{\mathrm{sclc}}\)\(V_{\mathrm{tfl}}\) はコマンドライン引数や PARAM_NAMES に含まれていません。したがって、現在のメインモデルではこのトラップ遷移 SCLC は自動的には使用されません。

4.7 接合電流の合成

フォワード側の接合電流は、選択されたメカニズムの和です。

\[ I_{j,\mathrm{forward}} = \sum_{\alpha \in M_f} I_{\alpha,\mathrm{forward}}(V_d) \]

リバース側の接合電流も同様です。

\[ I_{j,\mathrm{reverse}} = \sum_{\alpha \in M_r} I_{\alpha,\mathrm{reverse}}(V_d) \]

ここで、\(M_f\)--forwardIV で指定されたメカニズム集合、\(M_r\)--reverseIV で指定されたメカニズム集合です。

指定可能なメカニズム名は次の通りです。

指定名

内容

主なパラメータ

diode

Shockley 型ダイオード電流

I0, ndiode

tfe

TFE 電流

A_tfe, E00

fn

Fowler-Nordheim 型電流

A_fn, B_fn

sclc

空間電荷制限電流

K_sclc

複数のメカニズムは diode+tfe+sclc のように + で連結します。カンマ区切りも解析できます。none または off は空のメカニズム集合として扱われます。

5. フィッティングで使う目的関数

5.1 符号付きログ圧縮

フィッティングでは、電流をそのまま最小二乗するのではなく、符号を保持したログ圧縮表現を使います。

\[ y(I) = \operatorname{sign}(I) \log_{10} \left( |I|+\varepsilon_I \right) \]

ここで、\(\varepsilon_I=10^{-15}\) です。

5.2 残差平方和

測定電流を \(I_{\mathrm{meas},i}\)、モデル電流を \(I_{\mathrm{calc},i}\) とすると、目的関数は次式です。

\[ RSS = \sum_i \left[ y(I_{\mathrm{meas},i}) - y(I_{\mathrm{calc},i}) \right]^2 \]

この目的関数は、電流の絶対値が桁違いに変化する IV データに対して、低電流領域と高電流領域の両方を比較しやすくする目的で使われています。

5.3 最適化パラメータのスケール

次のパラメータは、内部では \(\log_{10}\) スケールで最適化されます。

  • I0

  • IPV

  • Rs

  • Rsh

  • A_tfe

  • E00

  • A_fn

  • B_fn

  • K_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\) が最大となる代表点を探し、その勾配から次式で推定します。

\[ R_s \approx \frac{1}{\left| \max_{V>0} \frac{dI}{dV} \right|} \]

正電圧データがない場合は、全データ範囲の最大勾配を使います。

6.3 シャント抵抗 \(R_{sh}\) の初期値

負電圧領域 \(V<0\)\(dI/dV\) が最小となる代表点を探し、その勾配から次式で推定します。

\[ R_{sh} \approx \frac{1}{\max\left( \left|\min_{V<0}\frac{dI}{dV}\right|, 10^{-12} \right)} \]

負電圧データがない場合は、全データ範囲の最小勾配を使います。

6.4 短絡電流と光電流

短絡電流は \(V=0\) 近傍の局所多項式値として推定されます。

\[ I_{SC} \approx I_{\mathrm{sm}}(0) \]

光電流の初期値は次式です。

\[ I_{PV} = \max(-I_{SC}, \varepsilon_I) \]

6.5 開放電圧

開放電圧は、\(I(V)=0\) となる電圧として、多項式根または局所二次フィットから推定されます。

\[ I(V_{OC})=0 \]

最終的にコードでは estimate_voc_local_quadratic() による局所二次近似結果を使っています。

6.6 逆飽和電流 \(I_0\)

負電圧領域の代表点 \(V_{sh}\) における電流を \(I_{sh}\) として、次式で初期推定します。

\[ I_0 = \max(I_{SC}-I_{sh}, 10^{-12}) \]

この推定はコード上の経験的な初期値であり、物理的に厳密な抽出式ではありません。

6.7 TFE パラメータの初期値

負電圧側の十分負の領域で、次の近似に基づいて一次フィットを行います。

\[ \ln |I| \approx a V + b \]

傾き \(a\) から \(E_{00}\) を次式で推定します。

\[ E_{00} = \frac{1}{|a|} \]

代表点 \((V_{\mathrm{tfe}}, I_{\mathrm{tfe}})\) から、次式で \(A_{\mathrm{tfe}}\) を推定します。

\[ A_{\mathrm{tfe}} = |I_{\mathrm{tfe}}| \exp \left( \frac{V_{\mathrm{tfe}}}{E_{00}} \right) \]

負電圧領域のデータ点が十分でない場合、A_tfe=1.0e-30, E00=1.0e-3 が使われます。

7. 必要ライブラリ

7.1 標準ライブラリ

  • os

  • sys

  • argparse

  • builtins

  • pathlib

  • traceback

  • csv

7.2 非標準ライブラリ

  • numpy

  • scipy

  • matplotlib

  • openpyxl

インストール例は次の通りです。

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

想定列は次の通りです。

列名

意味

varname

パラメータ名

value

パラメータ値

optid

0 の場合は固定、1 の場合は最適化対象

error

推定誤差。読み込み時には主に値と固定設定が使われる

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

主なシートは次の通りです。

シート名

内容

iv_data

電圧、測定電流、初期モデル電流、最終モデル電流、絶対値、log10 絶対値

init_params

初期パラメータ

final_params

最終パラメータと推定誤差

summary

ファイル名、記録時刻、データ点数、RSS

analyze モードでは Excel 保存は行われません。

9.4 PNG グラフ

次の PNG ファイルを保存します。

{outprefix}-iv.png

グラフは2パネル構成です。

  • 左: 線形スケールの IV カーブ

  • 右: abs(I) の対数スケール表示

fit モードでは、線形近似によるモデル電流の信頼性区間が水色領域として表示されます。

10. コマンドライン引数

引数

デフォルト

意味

--mode

choice

fit

実行モード。analyze, init, fit, sim

--method

str

Nelder-Mead

scipy.optimize.minimize の最適化手法

--infile

str

なし

入力 IV CSV ファイル

--temperature

float

300.0

モデル温度 K

--xmin

float

なし

読み込み・フィット・プロットに使う最小電圧

--xmax

float

なし

読み込み・フィット・プロットに使う最大電圧

--ndataskip

int

0

データ間引き数。0 なら全点使用

--forwardIV

str

diode

フォワード側の輸送メカニズム

--reverseIV

str

diode+tfe

リバース側の輸送メカニズム

--dv_blend

float

0.05

フォワード/リバースモデルのブレンド幅 V

--ninterval_print

int

10

フィッティング中のコンソール出力間隔

--ninterval_plot

int

10

フィッティング中のアニメーション更新間隔

--nmaxiter

int

1000

最適化の最大イテレーション数

--tol

float

1.0e-7

最適化許容誤差

--fix

list

固定するパラメータ名のリスト

--outprefix

str

pvfit

出力ファイル接頭辞

次のモデルパラメータは、コマンドラインから初期値を上書きできます。

引数

意味

--I0

ダイオード逆飽和電流

--ndiode

ダイオード理想因子

--IPV

光生成電流

--Rs

直列抵抗

--Rsh

シャント抵抗

--A_tfe

TFE 振幅係数

--E00

TFE の特性電圧またはエネルギー相当係数

--A_fn

FN 電流の振幅係数

--B_fn

FN 電流の指数係数

--K_sclc

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

この例では、ndiodeRs は最適化されません。

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

関数

役割

model(V, p, forwardIV, reverseIV, dV, temperature)

拡張 SDM により IV カーブを計算

junction_current_forward(Vd, p, mode_set, temperature)

フォワード側の接合電流を合成

junction_current_reverse(Vd, p, mode_set, temperature)

リバース側の接合電流を合成

j_diode(Vd, I0, ndiode, temperature)

ダイオード電流を計算

j_tfe_forward(Vd, A_tfe, E00)

フォワード TFE 電流を計算

j_tfe_reverse(Vd, A_tfe, E00)

リバース TFE 電流を計算

j_fn_forward(Vd, A_fn, B_fn)

フォワード FN 電流を計算

j_fn_reverse(Vd, A_fn, B_fn)

リバース FN 電流を計算

j_sclc(Vd, K_sclc)

SCLC 電流を計算

j_sclc_trap_transition(Vd, K_sclc, m_sclc, Vtfl, dV)

トラップ遷移 SCLC を計算。ただし main モデルからは未使用

14.2 データ入出力 API

関数

役割

read_data(infile, xmin, xmax, ndataskip)

IV CSV を読み込む

load_param_csv(csv_path)

パラメータ CSV を読み込む

save_param_csv(csv_path, params, fix_set, errors, rss)

パラメータ CSV を保存

save_iv_to_excel(outfile_xlsx, V, I_input, I_init, I_fit, info, params_init, params_final, rss, errors)

IV データとパラメータを Excel 保存

14.3 初期値推定・数値補助 API

関数

役割

estimate_initial_params(V, I_meas, temperature)

IV データから初期パラメータを推定

estimate_voc_local_quadratic(V, I, nlsq_points)

VOC を局所二次近似で推定

solve_root_poly(x, y, target_y, order)

多項式フィットから目標値の根を推定

local_poly_value(x, y, x0, npts, order)

局所多項式により指定点の値を推定

smooth_polyfit(y, window_points, poly_order)

局所多項式平滑化

sigmoid_blend(x, dV)

シグモイドブレンド係数を計算

same_sign(a, b)

2値の符号が同じか判定

14.4 フィッティング API

関数

役割

pack_free_params(params, fix_set)

自由パラメータを最適化ベクトルへ変換

unpack_free_params(p_free, base_params, fix_set)

最適化ベクトルをパラメータ辞書へ戻す

signed_log10_current(I, eps)

符号付きログ電流へ変換

objective(p_free, V, I_meas, args, base_params, fix_set)

残差平方和を計算

get_jacobian(p_free, V, temperature, args, base_params, fix_set)

ヤコビ行列を数値微分で計算

estimate_errors(res, V, I_meas, temperature, args, base_params, fix_set)

パラメータ誤差と信頼区間を推定

exec_fit(V, I_meas, info, csv_path, params, fix_set, args)

fit モード本体

14.5 CLI・表示 API

関数

役割

initialize()

argparse により CLI 引数を定義・解析

validate_args(args)

引数の妥当性を検証

print_args_and_derived(args)

引数と派生設定を表示

parse_mech_mode(mode_str)

モデル指定文字列をメカニズム集合へ変換

used_params_from_modes(forwardIV, reverseIV)

使用パラメータ集合を判定

setup_parameters(params, args, csv_fix, args_fix, forwardIV, reverseIV)

パラメータ値と固定設定を最終決定

print_parameter_repeat(params, fix_set, used, auto_fixed, title)

パラメータ一覧を表示

initialize_plot(V, I_meas, I_sim, title)

フィット中アニメーション用プロットを初期化

plot_iv(fig, axes, V, I_meas, I_start, I_final, info, mode, sigma_log, mode_label, outfile, pause)

IV グラフを描画・保存

dual_print(*args, **kwargs)

標準出力とログファイルへ同時出力

main()

コマンドライン実行のエントリーポイント

15. グローバル変数

変数

初期値

意味

KB

1.380649e-23

Boltzmann 定数

E_CHARGE

1.602176634e-19

電気素量

PARAM_NAMES

リスト

最適化対象候補のパラメータ名

LOG_PARAMS

セット

内部で log10 最適化するパラメータ

EPS_I

1.0e-15

ログ電流計算用の微小電流

EPS_R

1.0e-12

抵抗のゼロ除算防止用の微小値

DEFAULT_PARAMETERS

辞書

シミュレーションや初期値欠落時の既定値

fontsize

16

プロット表示用フォントサイズ

_original_print

None

元の print 関数保存用

_redirect_fp

None

ログファイルハンドル

16. パラメータの意味

パラメータ

意味

使用メカニズム

I0

ダイオード逆飽和電流

diode

ndiode

ダイオード理想因子

diode

IPV

光生成電流

共通

Rs

直列抵抗

共通

Rsh

シャント抵抗

共通

A_tfe

TFE 振幅係数

tfe

E00

TFE 指数の電圧スケール

tfe

A_fn

FN 電流の振幅係数

fn

B_fn

FN 指数係数

fn

K_sclc

SCLC 係数

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. エラー条件

コード上で明示的に検証される主なエラー条件は次の通りです。

条件

エラー内容

mode=init, fit, analyze--infile がない

--infile is required

--ndataskip < 0

無効なスキップ数

--xmin > --xmax

電圧範囲指定が不正

--temperature <= 0

温度が不正

--dv_blend < 0

ブレンド幅が不正

--ninterval_print <= 0

表示間隔が不正

--ninterval_plot <= 0

プロット更新間隔が不正

--nmaxiter <= 0

最大反復回数が不正

--tol <= 0

許容誤差が不正

--fix に未知のパラメータ名がある

未知パラメータ

log スケール対象パラメータが 0 以下

正値制約違反

ndiode <= 0

理想因子が不正

B_fn <= 0

FN 係数が不正

入力 CSV に有効データがない

データなし

クリッピング後にデータが残らない

データなし

19. 代表的な解析ワークフロー

19.1 初回解析

  1. mode=init で初期値を推定する

  2. 生成された *-parameters.csv を確認する

  3. 明らかに固定したいパラメータの optid を 0 にする

  4. mode=fit でフィッティングする

  5. 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式です。

\[ I_{\mathrm{branch}}(V_d) = I_j(V_d) + \frac{V_d}{R_{sh}} \]
\[ V = V_d + R_s I_{\mathrm{branch}}(V_d) \]
\[ I(V) = I_{\mathrm{branch}}(V_d) - I_{PV} \]

外部電圧 \(V\) ごとに \(V_d\) を数値的に解くことで、直列抵抗とシャント抵抗を含む非線形 IV 特性を安定に計算します。さらに、フォワード・リバースで異なる輸送モデルを設定し、\(V_d=0\) 近傍でシグモイド関数により滑らかに接続できます。