pvanalyze.py ドキュメント

1. プログラム概要

pvanalyze.py は、太陽電池デバイスの IV 特性および光学スペクトルを解析するための Python スクリプトです。主に以下の処理を行います。

  • 反射率スペクトル R と透過率スペクトル Tr から、吸収率 A と吸収係数 \(\alpha\) を計算する。

  • 暗状態 IV と光照射 IV から、単一ダイオードモデル相当の代表パラメータ I0, ndiode, IPV, Rs, Rsh を経験的に抽出する。

  • 光照射 IV から、\(V_{oc}\), \(J_{sc}\), 最大出力点、FF、変換効率を計算する。

  • 吸収係数とフォトンフラックスから EQE / IQE を計算する。

  • 解析結果をログファイル、PNG プロット、必要に応じて Excel ファイルに保存する。

このスクリプトは、非線形最小二乗フィットで単一ダイオードモデルを厳密に最適化するものではありません。コード上では、局所多項式平滑化、接線推定、微分、ゼロクロス補間を用いて、IV 曲線から代表パラメータを抽出します。

2. 実行モード

analyze

暗状態 IV と光照射 IV を読み込み、IV パラメータ、発電特性、量子効率を計算します。

主な処理は次の順です。

  1. コマンドライン引数を読み込む。

  2. 入射光条件からフォトンエネルギー \(E\) とパワー密度 \(P_0\) を決定する。

  3. 暗状態 IV CSV と光照射 IV CSV を読み込む。

  4. 指定されたスイープ番号を選択する。

  5. 暗状態 IV から I0, ndiode, Rs, Rsh などを推定する。

  6. 光照射 IV から IPV などを推定する。

  7. 光照射 IV から \(V_{oc}\), \(J_{sc}\), FF, \(P_{max}\) を計算する。

  8. --alpha で指定された Excel から吸収係数を読み込む。

  9. EQE / IQE を計算する。

  10. ログと IV 比較プロットを保存する。

alpha

反射率・透過率スペクトルから吸収係数を計算し、プロットのみを保存します。Excel 保存は行いません。

make_alpha

alpha と同じ計算を行い、さらに吸収スペクトルを Excel に保存します。

3. 必要ライブラリ

標準ライブラリ

  • sys

  • argparse

  • builtins

  • pathlib

  • traceback

  • csv

  • math

非標準ライブラリ

  • numpy

  • matplotlib

  • openpyxl

インストール例:

pip install numpy matplotlib openpyxl

4. グローバル定数

変数名

意味

KB

\(1.380649 \times 10^{-23}\)

ボルツマン定数 J/K

E_CHARGE

\(1.602176634 \times 10^{-19}\)

電気素量 C

H

\(6.62607015 \times 10^{-34}\)

プランク定数 J s

C

\(2.99792458 \times 10^8\)

光速 m/s

PARAM_NAMES

I0, ndiode, IPV, Rs, Rsh

抽出対象のIVパラメータ

EPS_I

\(1.0 \times 10^{-15}\)

対数計算時に加える微小電流

DPV_NM

46.837

既定のPV層膜厚 nm

AREA_MM2

\(0.5 \times 0.5 \times \pi\)

電極面積 mm\(^2\)

AREA_CM2

AREA_MM2 * 0.01

電極面積 cm\(^2\)

PHOTON_FLUX

\(1.95804 \times 10^{18}\)

既定フォトンフラックス cm\(^{-2}\) s\(^{-1}\)

PHOTON_NM

1363.0

既定フォトン波長 nm

PIN

空文字

入射光パワー密度の既定値

fontsize

16

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

5. 入力ファイル

IV CSV ファイル

read_data() は以下の形式を想定します。

  • MetaData 行があり、RecordTime を含む場合は記録時刻として保存する。

  • DataName 行以降をデータ領域とみなす。

  • DataValue 行の2列目を電圧、3列目を電流として読み取る。

概念的な形式:

MetaData,RecordTime,2026-03-24 14:15:24
DataName,Voltage,Current
DataValue,0.000,-1.0e-6
DataValue,0.010,-9.8e-7

読み込んだ IV データは、電圧の増減方向が反転した点で複数スイープに分割されます。--sweep_dark--sweep_light で、どのスイープを解析するかを指定します。

光学スペクトルファイル

read_optical_spectrum() は、テキストファイルから数値2列を抽出します。

  • 1列目: 波長 nm

  • 2列目: 反射率または透過率の値

タブ区切り、空白区切り、カンマ区切りに近い形式をある程度許容します。文字コードは cp932, utf-8-sig, utf-8, latin1 の順で読み込みを試行します。

吸収係数 Excel ファイル

read_alpha_from_excel() は、alpha_spectrum シートを持つ Excel ファイルを想定します。このシートは save_alpha_to_excel() で生成される形式です。

内容

photon_energy_eV

フォトンエネルギー eV

wavelength_nm

波長 nm

R

反射率 0から1

Tr

透過率 0から1

A

吸収率 0から1

alpha_cm^-1

吸収係数 cm\(^{-1}\)

6. 出力ファイル

モード

出力ファイル

内容

analyze

{outprefix}_analyze.txt

標準出力と同じ解析ログ

analyze

{outprefix}_iv.png

暗状態・光照射 IV、接線、ndiode 曲線、PV出力の比較プロット

alpha

{outprefix}_alpha.txt

光学解析ログ

alpha

{outprefix}_alpha_E.png

\(\alpha(E)\) プロット

make_alpha

{outprefix}_alpha.txt

光学解析ログ

make_alpha

{outprefix}_alpha_E.png

\(\alpha(E)\) プロット

make_alpha

{outprefix}_alpha.xlsx

吸収スペクトル Excel

analyze モードでは Excel 出力は実装されていません。

7. 電気特性モデルと抽出パラメータ

このコードが抽出する主な IV パラメータは、単一ダイオードモデルで使われる以下の量です。

パラメータ

意味

単位

I0

逆方向飽和電流の代表値

A

ndiode

ダイオード理想因子

無次元

IPV

光生成電流の代表値

A

Rs

直列抵抗

\(\Omega\)

Rsh

並列抵抗

\(\Omega\)

一般的な単一ダイオードモデルは、例えば次の暗黙式で表されます。

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

ここで、\(q\) は電気素量、\(k_B\) はボルツマン定数、\(T\) は温度、\(n\)ndiode です。

ただし、pvanalyze.py の中では、この式を数値的に解いてフィッティングする処理は確認できません。実装されているのは、測定 IV 曲線から上記パラメータに対応する代表値を抽出する処理です。

8. パラメータ抽出の数式

8.1 前処理: 重複電圧の平均化

同じ電圧値 \(x\) が複数存在する場合、対応する電流値を平均化します。

\[ \bar{I}(V_j) = \frac{1}{N_j} \sum_{i: V_i = V_j} I_i \]

コードでは、\(|V_i - V_j| < 10^{-15}\) 程度を同一電圧として扱います。

8.2 局所多項式平滑化

smooth_polyfit() は Savitzky-Golay 風の局所多項式平滑化を行います。各点 \(i\) の近傍ウィンドウに対して、局所座標 \(u = j - i\) を用い、多項式

\[ p_i(u) = c_0 + c_1 u + c_2 u^2 + \cdots + c_m u^m \]

を最小二乗で当てはめます。

\[ \min_{c_0,\ldots,c_m} \sum_{j \in W_i} \left[ I_j - p_i(j-i) \right]^2 \]

平滑化後の値は中心点での値として

\[ I_{sm,i} = p_i(0) \]

で与えられます。

既定では、ウィンドウ点数は5、次数は3です。

8.3 局所多項式補間

local_poly_value() は、指定点 \(x_0\) に近い npts 点を選び、多項式

\[ p(x) = \sum_{m=0}^M c_m x^m \]

を当てはめ、\(p(x_0)\) を返します。

\[ I(x_0) \simeq p(x_0) \]

この処理は、\(I(V=0)\)\(J(V=0)\) の推定に使われます。

8.4 直列抵抗 Rs の抽出

estimate_rs_tangent_point() は、順方向バイアス側で微分係数 \(dI/dV\) が最大となる点を探します。

平滑化電流を \(I_{sm}(V)\) とすると、数値微分は

\[ g(V_i) = \frac{d I_{sm}}{dV}(V_i) \]

です。

順方向領域 \(V_i > 0\) から候補点を選び、端点の影響を避けるため一部を除外した上で、

\[ i_s = \arg\max_i g(V_i) \]

を代表点とします。

代表点近傍の7点に対して局所直線

\[ I \simeq a_s V + b_s \]

を最小二乗で当てはめます。

直列抵抗は

\[ R_s = \frac{1}{a_s} \]

として計算されます。estimate_initial_params() では最終的に

\[ R_s \leftarrow |R_s| \]

が使われます。

代表点電圧・電流は

\[ V_s = V_{i_s} \]
\[ I_s = a_s V_s + b_s \]

です。

8.5 並列抵抗 Rsh の抽出

estimate_rsh_tangent_point() は、逆方向バイアス側 \(V < 0\)\(|dI/dV|\) が最小となる点を選びます。

\[ i_{sh} = \arg\min_{i: V_i < 0} \left| \frac{d I_{sm}}{dV}(V_i) \right| \]

逆方向データが無い場合は、全体から \(|dI/dV|\) が最小の点を使います。

代表点近傍の7点に対して、まず局所直線

\[ I \simeq a_{fit} V + b_{fit} \]

を当てはめます。

コードでは、傾きを正値として扱うため

\[ a_{sh} = |a_{fit}| \]

とします。代表点

\[ V_{sh} = V_{i_{sh}} \]

における元の直線上の電流は

\[ I_{fit,ref} = a_{fit} V_{sh} + b_{fit} \]

です。正の傾き \(a_{sh}\) を持ちながら代表点を通る切片は

\[ b_{sh} = I_{fit,ref} - a_{sh} V_{sh} \]

となります。

したがって、コード上のシャント代表電流は

\[ I_{sh} = a_{sh} V_{sh} + b_{sh} \]

です。

並列抵抗は

\[ R_{sh} = \frac{1}{a_{sh}} \]

で計算され、estimate_initial_params() では

\[ R_{sh} \leftarrow |R_{sh}| \]

が使われます。

ログ表示される Ish(0) は、この補正後直線の切片

\[ I_{sh}(0) = b_{sh} \]

です。

8.6 逆方向飽和電流 I0 の抽出

estimate_initial_params() では、I0 をシャント代表電流の絶対値として定義しています。

\[ I_0 = |I_{sh}| \]

これは厳密な Shockley 式の切片フィットではなく、コード上の経験的な代表値です。

8.7 光生成電流 IPV の抽出

光照射 IV では、平滑化された電流 \(I_{sm}(V)\) から \(V=0\) の電流を局所多項式で推定し、その符号を反転して IPV とします。

\[ I_{PV} = - I_{sm}(0) \]

暗状態 IV については、いったん同じ方法で推定した後、exec_analyze() 内で

\[ I_{PV,dark} = 0 \]

に上書きされます。

8.8 ダイオード理想因子 ndiode の抽出

estimate_ndiode_representative_point() は、順方向領域の対数電流から ndiode を推定します。

まず、以下の条件を満たすデータを使います。

\[ V_i > 0 \]
\[ |I_i| > |I_{sh}| \]

電流の対数を

\[ L(V_i) = \ln(|I_i| + \varepsilon_I) \]

とします。ここで

\[ \varepsilon_I = 10^{-15} \]

です。

L(V) を局所多項式で平滑化して \(L_{sm}(V)\) を作り、一次微分と二次微分を数値的に計算します。

\[ L'(V) = \frac{d L_{sm}}{dV} \]
\[ L''(V) = \frac{d^2 L_{sm}}{dV^2} \]

有効点は

\[ L'(V_i) > 0 \]

かつ微分値が有限な点です。その中から、対数電流が最も直線的な点、つまり二次微分の絶対値が最小となる点を代表点とします。

\[ i_n = \arg\min_i |L''(V_i)| \]

代表点での傾きを

\[ s_n = L'(V_{i_n}) \]

とすると、Shockley 型の近似

\[ I \propto \exp\left( \frac{qV}{n k_B T} \right) \]

から

\[ \frac{d \ln I}{dV} = \frac{q}{n k_B T} \]

です。したがってコードでは

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

として ndiode を計算します。

有効な ndiode が得られない場合、コードは警告を表示し、代替値として

\[ n = 1000 \]

を使います。この値は物理的な推定値ではなく、失敗時のフォールバックです。

8.9 ndiode(V) 曲線

estimate_ndiode_curve() は、暗状態 IV に対して各電圧点での局所的な理想因子を計算します。

使用条件は

\[ V_i > 0 \]
\[ I_i > 0 \]

です。

\[ L(V_i) = \ln(|I_i| + \varepsilon_I) \]
\[ n(V_i) = \frac{q}{k_B T} \left( \frac{dL}{dV}(V_i) \right)^{-1} \]

有限かつ正の値のみがプロットされます。

9. 発電特性の数式

pv_metrics_from_iv() は、光照射 IV から以下を計算します。

電流密度

電極面積を \(S\) cm\(^2\) とすると、

\[ J(V) = \frac{I(V)}{S} \]

です。

短絡電流密度

local_poly_value() により \(V=0\) の電流密度を推定します。

\[ J_{sc} = J(0) \]

コードでは符号をそのまま保持します。プロットでは発電出力の表示に \(-J\) を使います。

開放電圧

zero_crossing_x() は、電流がゼロを横切る電圧を線形補間で求めます。隣接点 \((V_1,I_1)\)\((V_2,I_2)\) の間で符号が変わる場合、

\[ V_{oc} = V_1 + \frac{0 - I_1}{I_2 - I_1} (V_2 - V_1) \]

です。ゼロクロスが無い場合は、\(|I|\) が最小の電圧を返します。

発電出力密度

発電向きの出力密度は

\[ P_{gen}(V) = -V J(V) \]

です。

最大出力点は

\[ i_{op} = \arg\max_i P_{gen}(V_i) \]
\[ V_{op} = V_{i_{op}} \]
\[ J_{op} = J(V_{op}) \]
\[ P_{max} = P_{gen}(V_{op}) \]

です。

フィルファクター

\[ FF = \frac{P_{max}}{|V_{oc} J_{sc}|} \]

分母が極端に小さい場合は nan になります。

変換効率

入射光パワー密度を \(P_0\) W/cm\(^2\) とすると、

\[ \eta = \frac{P_{max}}{P_0} \]

です。

10. 光学解析の数式

フォトンエネルギー

compute_photon_energy_eV() は、--E が正ならその値を使い、そうでなければ波長から計算します。

\[ E[\mathrm{eV}] = \frac{1239.841984}{\lambda[\mathrm{nm}]} \]

入射光パワー密度

compute_p0() は、フォトンフラックス \(F_0\) が正の場合に

\[ P_0 = F_0 E q \]

を計算します。ここで \(E\) は eV 単位の数値、\(q\) は電気素量です。eV と C の積は J に対応するため、\(P_0\) は W/cm\(^2\) になります。

反射率・透過率・吸収率

analyze_optical() は、反射率と透過率をパーセントから 0から1 の値に変換します。

\[ R = \frac{R_{percent}}{100} \]
\[ T_r = \frac{T_{percent}}{100} \]

吸収率は

\[ A = 1 - R - T_r \]

です。コードでは 0から1 の範囲にクリップされます。

吸収係数

膜厚を \(d\) nm とすると、cm 単位では

\[ d_{cm} = d_{nm} \times 10^{-7} \]

です。

透過率を、表面反射後の透過として

\[ T_r \simeq (1-R) \exp(-\alpha d_{cm}) \]

とみなすと、

\[ \alpha = -\frac{1}{d_{cm}} \ln\left( \frac{T_r}{1-R} \right) \]

となります。

コードでは、ゼロ割や対数の問題を避けるため、\(1-R\)\(T_r/(1-R)\) を下限値でクリップします。

エネルギー指定での吸収係数

alpha_at_energy() は、保存済み光学データから

\[ E = \frac{1239.841984}{\lambda} \]

を計算し、エネルギー軸上で \(\alpha(E)\) を線形補間します。

吸収係数からの吸収率

absorptance_from_alpha() は、指定エネルギーでの吸収係数 \(\alpha\) と膜厚から

\[ A(E) = 1 - \exp(-\alpha(E) d_{cm}) \]

を計算します。

11. 量子効率の数式

quantum_efficiencies() は、入射フォトンフラックス \(F_0\)、吸収率 \(A\)、光生成電流密度 \(J_{PV}\)、短絡電流密度 \(J_{sc}\) を使います。

光生成電流密度は

\[ J_{PV} = \frac{I_{PV}}{S} \]

です。

生成外部量子効率は

\[ EQE_{gen} = \frac{|J_{PV}|}{q F_0} \]

です。

生成内部量子効率は

\[ IQE_{gen} = \frac{|J_{PV}|}{q F_0 A} \]

です。

短絡電流に基づく外部量子効率は

\[ EQE = \frac{|J_{sc}|}{q F_0} \]

です。

短絡電流に基づく内部量子効率は

\[ IQE = \frac{|J_{sc}|}{q F_0 A} \]

です。

\(F_0\) が未指定または0以下の場合は、すべて nan になります。\(A\) が無効または0以下の場合、IQE 系は nan になります。

12. コマンドライン引数

引数

デフォルト

意味

--mode

str

analyze

実行モード。alpha, make_alpha, analyze

--dark

str

DARK_IV_FILE

暗状態IV CSV。analyzeで使用。

--light

str

PV_IV_FILE

光照射IV CSV。analyzeで使用。

--R

str

R_FILE

反射率スペクトルファイル。alpha / make_alphaで使用。

--Tr

str

T_FILE

透過率スペクトルファイル。--Tは温度に使うため透過率は--Tr

--eq

str

None

等価スペクトル照度ファイル用の引数。ただしコード内では実処理に未使用。

--alpha

str

ALPHA_FILE

吸収係数Excel。analyzeで読み込み、make_alphaでの出力名とは別。

--T

float

300.0

温度 K。ndiode抽出に使用。

--d

float

46.837

PV層膜厚 nm。吸収率計算に使用。

--sweep_dark

int

0

暗状態IVのスイープ選択インデックス。

--sweep_light

int

0

光照射IVのスイープ選択インデックス。

--F0

float

1.95804e18

入射フォトンフラックス cm^-2 s^-1。

--P0

str

空文字

入射光パワー密度 W/cm^2。空文字ならF0と光子エネルギーから計算。

--E

float

0.0

フォトンエネルギー eV。0なら波長から計算。

--lambda_nm

float

1363.0

フォトン波長 nm。E=0のとき使用。

--S

float

AREA_CM2

電極面積 cm^2。既定値は約0.0078539816 cm^2。

--outprefix

str

pvanalyze

出力ファイル接頭辞。

13. Usage

IV解析

python pvanalyze.py --mode analyze --dark dark.csv --light light.csv --alpha alpha.xlsx --outprefix result

この実行では、以下が行われます。

  • dark.csvlight.csv を IV データとして読み込む。

  • alpha.xlsxalpha_spectrum シートから吸収係数を読み込む。

  • IV パラメータ、PV性能、量子効率を標準出力と result_analyze.txt に出力する。

  • result_iv.png を保存する。

吸収係数 Excel の作成

python pvanalyze.py --mode make_alpha --R reflectance.txt --Tr transmittance.txt --d 46.837 --outprefix result

この実行では、以下が行われます。

  • reflectance.txttransmittance.txt からスペクトルを読み込む。

  • \(A = 1 - R - T_r\)\(\alpha\) を計算する。

  • result_alpha.xlsx を保存する。

  • result_alpha_E.png を保存する。

  • ログを result_alpha.txt に保存する。

プロットのみ作成

python pvanalyze.py --mode alpha --R reflectance.txt --Tr transmittance.txt --outprefix result

この場合、result_alpha_E.png は保存されますが、Excel は保存されません。

14. 具体的な実行例

例1: 1363 nm の単色光として解析

python pvanalyze.py --mode analyze --dark dark.csv --light light.csv --alpha result_alpha.xlsx --lambda_nm 1363 --F0 1.95804e18 --S 0.0078539816 --outprefix sample

この場合、フォトンエネルギーは

\[ E = \frac{1239.841984}{1363} \simeq 0.9096\,\mathrm{eV} \]

として計算されます。

入射光パワー密度は

\[ P_0 = F_0 E q \]

で計算され、変換効率は

\[ \eta = \frac{P_{max}}{P_0} \]

として求められます。

例2: 直接パワー密度を使いたい場合

コード構造上、compute_p0()\(F_0 > 0\) の場合に F0 を優先します。--P0 を直接使いたい場合は、--F0 0 を併用する運用が安全です。

python pvanalyze.py --mode analyze --dark dark.csv --light light.csv --alpha "" --F0 0 --P0 0.001 --outprefix sample_p0

この例では、吸収係数 Excel を使わず、入射光パワー密度 \(P_0 = 0.001\) W/cm\(^2\) として解析する意図になります。ただし、F0=0 のため EQE / IQE は nan になります。

15. 関数一覧

関数名

概要

initialize

62-97

コマンドライン引数を解析し、プログラムの初期設定を行います。

print_args_and_derived

100-177

解析されたコマンドライン引数と派生値を標準出力に表示します。

read_data

180-278

指定されたCSVファイルからI-Vデータを読み込みます。

read_alpha_from_excel

281-336

Excelファイルから吸収スペクトル(alpha)データを読み込みます。

read_optical_spectrum

339-417

指定されたテキストファイルから光学スペクトルデータ(反射率Rまたは透過率T)を読み込みます。

choose_sweep

420-443

複数のスイープデータから指定されたインデックスの単一スイープを選択します。

consolidate_duplicate_x

446-479

X軸に重複する値がある場合、Y軸の対応する値を平均して重複を解消します。

smooth_polyfit

482-534

多項式フィッティングを用いたSavitzky-Golay風の平滑化をデータに適用します。

local_poly_value

537-567

指定されたX座標の周囲のデータポイントを使用して、局所的な多項式フィッティングを行い、

zero_crossing_x

570-598

Y値がゼロを横切るX座標を線形補間によって見つけます。

interpolate_to_common_wavelength

601-619

参照波長スケール上のデータをターゲット波長スケールに線形補間します。

compute_photon_energy_eV

622-640

フォトンエネルギー(eV)を計算します。

compute_p0

643-666

入射フォトンエネルギー密度(P0)を計算します。

pv_metrics_from_iv

669-719

I-Vデータから太陽電池の主要な性能指標(Voc, Jsc, FF, Pmaxなど)を計算します。

fit_local_line

722-751

指定された中心インデックスの周囲のデータポイントを用いて局所的な線形フィッティングを行います。

estimate_rs_tangent_point

754-796

I-V曲線から直列抵抗(Rs)を推定するための接点と抵抗値を計算します。

estimate_rsh_tangent_point

799-847

I-V曲線から並列抵抗(Rsh)を推定するための接点と抵抗値を計算します。

estimate_ndiode_representative_point

850-904

I-V曲線からダイオード因子(ndiode)を推定するための代表点と値を計算します。

estimate_initial_params

907-972

I-Vデータから単一ダイオードモデルの初期パラメータ(I0, ndiode, IPV, Rs, Rsh)を推定します。

analyze_optical

975-1019

反射率(R)と透過率(T)のスペクトルデータから吸収率(A)と吸収係数(α)を計算します。

quantum_efficiencies

1022-1058

量子効率(EQEとIQE)を計算します。

alpha_at_energy

1061-1090

指定されたフォトンエネルギーにおける吸収係数(α)を光学スペクトルデータから補間して取得します。

absorptance_from_alpha

1092-1112

吸収係数と膜厚から吸収率を計算します。

save_alpha_to_excel

1115-1183

吸収スペクトルデータをExcelファイルに保存します。

plot_alpha

1186-1226

吸収係数スペクトル(α vs フォトンエネルギー)をプロットします。

estimate_ndiode_curve

1229-1266

I-Vデータから電圧に対するダイオード因子(ndiode)の曲線を推定します。

plot_iv_comparison

1269-1449

暗電流I-Vおよび光照射I-Vデータと、関連する推定値や解析結果を比較プロットします。

exec_alpha

1452-1494

alphaまたはmake_alphaモードでプログラムを実行するメイン関数。

exec_analyze

1497-1618

analyzeモードでプログラムを実行するメイン関数。

dual_print

1623-1644

標準出力とログファイルの両方にメッセージを出力します。

main

1646-1679

プログラムのエントリーポイント。

16. 主要関数の詳細

initialize()

コマンドライン引数を定義し、argparse.ArgumentParser により解析します。戻り値は (args, parser) です。

read_data(infile, xmin=None, xmax=None, ndataskip=0)

IV CSV を読み込み、電圧方向の反転ごとにスイープを分割します。戻り値は (xs_list, ys_list, inf) です。

xmin, xmax, ndataskip は関数引数として存在しますが、現在の CLI からは直接指定されていません。

read_optical_spectrum(infile)

光学スペクトルを読み込み、波長順にソートして返します。重複波長は最初に出現した値を採用します。

analyze_optical(wl_R_nm, R_percent, wl_T_nm, T_percent, d_nm)

R/T スペクトルを共通波長に補間し、\(A\)\(\alpha\) を計算します。

estimate_initial_params(V, I_meas, T=300.0)

IV 曲線から I0, ndiode, IPV, Rs, Rsh を抽出します。実装上は、以下の補助関数を組み合わせています。

  • estimate_rs_tangent_point()

  • estimate_rsh_tangent_point()

  • estimate_ndiode_representative_point()

  • local_poly_value()

pv_metrics_from_iv(V, I, S)

\(V_{oc}\), \(J_{sc}\), \(V_{op}\), \(J_{op}\), \(P_{max}\), FF を計算します。

quantum_efficiencies(F0, A_abs, JPV_A_cm2, Jsc_A_cm2)

EQE / IQE を計算します。吸収率 A_abs がない場合、IQE 系は nan になります。

plot_iv_comparison(...)

以下の4つのサブプロットを持つ図を作成します。

  1. log10(abs(I))-V

  2. forward / reverse 分離の線形 J-V

  3. ndiode(V)

  4. PV 出力曲線 \(-J\) vs \(V\)

main()

if __name__ == "__main__": から呼ばれるエントリーポイントです。ログファイルを開き、printdual_print() に差し替え、指定モードに応じて exec_alpha() または exec_analyze() を実行します。

17. クラス一覧

このスクリプトにはクラス定義はありません。

18. ライブラリとしての利用

pvanalyze.py はスクリプトとしての利用を想定していますが、関数は通常の Python モジュールとして import できます。

import pvanalyze

metrics = pvanalyze.pv_metrics_from_iv(V, I, S)

または

from pvanalyze import analyze_optical, estimate_initial_params

ただし、公開 API として安定化されたインターフェースはコード上では定義されていません。関数をライブラリとして利用する場合は、引数形式や戻り値の変更に注意してください。

19. main script として実行した場合

ファイル末尾に if __name__ == "__main__": があり、直接実行すると main() が呼び出されます。

main() は次を行います。

  1. initialize() で CLI 引数を解析する。

  2. ログファイル名を決める。

  3. builtins.printdual_print() に置き換える。

  4. mode に応じて処理を分岐する。

  5. 例外発生時は traceback を表示して終了コード1で終了する。

  6. 最後にログファイルを閉じる。

20. 注意点・制限事項

非線形フィットではない

pvanalyze.pyI0, ndiode, IPV, Rs, Rsh を抽出しますが、単一ダイオード方程式を使った非線形最適化は行っていません。抽出値は測定曲線の局所的特徴から得た代表値です。

I0 の意味

I0 = |Ish| として定義されており、厳密な逆方向飽和電流の物理フィット値ではありません。

Rsh 抽出点

コードは逆方向領域で \(|dI/dV|\) が最小の点を選びます。一般的な「逆方向で傾きが大きい点」や「0V近傍の微分抵抗」とは異なる場合があります。

ndiode の失敗時フォールバック

ndiode が求まらない場合、1000.0 が設定されます。この値は警告文にもある通り、参照すべき物理値ではありません。

--eq は未使用

--eq 引数は定義されていますが、コード中で解析には使われていません。

--P0--F0 の優先関係

compute_p0()F0 > 0 の場合に F0 由来の \(P_0\) を返します。--P0 を明示的に使いたい場合は、--F0 0 を併用する必要があります。ただし、その場合 EQE / IQE は F0 <= 0 のため nan になります。

--alpha の既定値

analyze モードでは、既定で ALPHA_FILE を読み込もうとします。吸収係数ファイルを使わない場合は、実行環境に応じて空文字を指定する必要があります。

対話停止

exec_alpha()exec_analyze() の最後に input("Press ENTER to terminate") があるため、バッチ実行では標準入力が必要です。

吸収係数の前提

吸収係数の式は

\[ T_r \simeq (1-R)\exp(-\alpha d) \]

を仮定しています。多重反射、干渉、散乱、基板吸収などは明示的には扱っていません。

データ点数とノイズ

局所多項式平滑化・微分・接線推定は、データ点数が少ない場合やノイズが大きい場合に不安定になります。特に ndiode\(\ln |I|\) の微分を使うため、ゼロ近傍や符号反転付近では注意が必要です。

21. 解析結果の読み方

analyze モードの標準出力には、主に以下のブロックが表示されます。

Device constants

膜厚、電極面積、温度を表示します。

Photon input

波長、フォトンエネルギー、フォトンフラックス、入射光パワー密度を表示します。

Dark IV estimated parameters

暗状態 IV から抽出した I0, ndiode, IPV, Rs, Rsh を表示します。暗状態では IPV は 0 に上書きされます。

また、Vs, Is, Vsh, Ish, Ish(0) も表示されます。

Illuminated IV estimated parameters

光照射 IV から抽出した I0, ndiode, IPV, Rs, Rsh を表示します。

Photovoltaic metrics

\(V_{oc}\), \(J_{sc}\), \(V_{op}\), \(J_{op}\), FF, \(P_{max}\), Efficiency を表示します。

Optical metrics

吸収係数 Excel が読み込めた場合、指定エネルギーでの \(\alpha(E)\)\(A(E)\) を表示します。

Quantum efficiencies

JPV, EQE_gen, IQE_gen, EQE, IQE を表示します。

22. まとめ

pvanalyze.py は、IV 測定と光学スペクトルを組み合わせて、太陽電池の代表的な電気・光学指標を素早く算出する解析スクリプトです。特に、局所接線に基づく Rs / Rsh、対数電流微分に基づく ndiode、ゼロ電圧近傍の局所多項式に基づく IPV の抽出式が実装上の中心です。

一方で、単一ダイオードモデル全体を最小二乗で最適化する処理はコードからは確認できません。そのため、得られるパラメータはフィット済み物理定数というよりも、測定曲線の特徴量から得た初期推定値または代表値として解釈するのが適切です。