equation-selfconsistent-diode.py
このドキュメントは、Pythonプログラム equation-selfconsistent-diode.py の技術的な側面を解説します。
プログラムの動作
equation-selfconsistent-diode.py は、ダイオードと抵抗が直列接続された回路の電流-電圧特性を、自己無撞着法(Self-Consistent Method)を用いて計算するプログラムです。
主な機能:
ダイオードと抵抗の直列回路における電流 \(I\) を、印加電圧 \(V\) の関数として計算します。
ダイオードの非線形特性により解析的に解けない回路方程式を、反復的な数値計算(自己無撞着法)によって近似的に解きます。
計算された \(V\)-\(I\) 特性は、
matplotlibを使用してリアルタイムにグラフ表示されます。計算範囲(最小電圧、最大電圧、電圧ステップ)や自己無撞着法の混合パラメータは、コマンドライン引数で変更可能です。
解決する課題: ダイオードの電流-電圧特性は指数関数的であるため、抵抗との直列回路では、回路方程式が超越方程式となり、電流を解析的に求めることが困難です。このプログラムは、反復計算アルゴリズムである自己無撞着法を用いることで、この非線形方程式の数値解を効率的に導出します。
原理
このプログラムは、抵抗 \(R\) とダイオードが直列に接続された回路に電圧 \(V\) が印加されたときの電流 \(I\) を計算します。
回路方程式: 抵抗にかかる電圧を \(V_R\)、ダイオードにかかる電圧を \(V_D\) とすると、キルヒホッフの電圧則により以下の関係が成り立ちます。
また、オームの法則により \(V_R = R \cdot I\) です。これを代入すると、ダイオードにかかる電圧は次のようになります。
ダイオード方程式: ダイオードの電流-電圧特性は、以下のようなショックレーの理想ダイオード方程式で表されます。
ここで、
\(I_0\): 逆飽和電流(コードでは
I0)\(e\): 素電荷(コードでは
e)\(k_B\): ボルツマン定数(コードでは
kB)\(T\): 温度(コードでは
T)\(n\): 理想係数(コードでは
ndiode)
プログラム内では、定数項をまとめて \(ekBT = \frac{e}{n k_B T}\) と定義しています。
自己無撞着法 (Self-Consistent Method) と混合法 (Mixing): 上記の方程式系は \(I\) について解析的に解くことが困難なため、自己無撞着法を用いて数値的に解を求めます。 この方法は、初期値 \(I_{\text{initial}}\) から出発し、以下の反復計算によって \(I\) の値を更新していきます。
現在の電流値 \(I_{\text{current}}\) を使ってダイオード電圧 \(V_D = V - R \cdot I_{\text{current}}\) を計算します。
この \(V_D\) をダイオード方程式に代入し、新しい電流値 \(I_{\text{new}}\) を計算します。 $\(I_{\text{new}} = I_0 \left( \exp \left( ekBT \cdot (V - R \cdot I_{\text{current}}) \right) - 1 \right)\)$
混合法を用いて、次の反復で使用する電流値 \(I_{\text{next}}\) を更新します。 $\(I_{\text{next}} = (1 - k_{\text{mix}}) \cdot I_{\text{current}} + k_{\text{mix}} \cdot I_{\text{new}}\)\( ここで \)k_{\text{mix}}\( は混合パラメータ(コードでは `kmix`)で、通常 \)0 < k_{\text{mix}} \le 1$ の値を取ります。これにより、解への収束が安定化または高速化されます。
収束条件 \(|I_{\text{new}} - I_{\text{current}}| < \epsilon\) (ここで \(\epsilon\) は許容誤差、コードでは
eps)を満たすまでステップ1〜3を繰り返します。または、最大反復回数nmaxiterに達した場合に計算を終了します。
必要な非標準ライブラリとインストール方法
このプログラムは、以下の非標準ライブラリを使用しています。
numpy: 数値計算機能(配列操作、数学関数など)を提供します。matplotlib: グラフ描画機能を提供します。
これらのライブラリは、Pythonのパッケージインストーラ pip を使用してインストールできます。コマンドプロンプトやターミナルで以下のコマンドを実行してください。
pip install numpy matplotlib
必要な入力ファイル
このプログラムは、特定の入力ファイルを必要としません。 回路パラメータや計算範囲は、プログラム内に直接記述されているか、コマンドライン引数として与えられます。
生成される出力ファイル
このプログラムは、ファイルとしては何も生成しません。 計算結果は、以下の形式で標準出力(コンソール)に表示されます。
各電圧ポイントでの自己無撞着法の反復計算の進行状況。
収束が成功したか、または失敗したかのメッセージ。
最終的な \(V\)-\(I\) 特性曲線は、
matplotlibを用いたインタラクティブなグラフウィンドウとして表示されます。
コマンドラインでの使用例 (Usage)
基本的な実行コマンドと引数の説明は以下の通りです。
python equation-selfconsistent-diode.py Vmin Vmax Vstep kmin
引数の説明:
Vmin: 計算を開始する最小電圧(V)。浮動小数点数。Vmax: 計算を終了する最大電圧(V)。浮動小数点数。Vstep: 電圧の刻み幅(V)。浮動小数点数。kmin: 自己無撞着法の混合パラメータkmixの値。浮動小数点数。
これらの引数はすべてオプションです。引数が指定されない場合、プログラム内のデフォルト値が使用されます。
コマンドラインでの具体的な使用例
例1: 引数なしで実行する(デフォルト値を使用)
python equation-selfconsistent-diode.py
このコマンドを実行すると、プログラム内のデフォルト値 (Vmin=0.0, Vmax=0.7, Vstep=0.01, kmix デフォルト 0.2) を使用して計算が実行されます。
実行結果の抜粋:
Solution of diode circuit current by self-consistent method
V = 0.0 V
Iter 0: I: 0.000000000000 => -0.000000000001, dI = -1e-12
Success: Convergence reached: dI = -1.0000000000000001e-12 < eps = 1e-10
V = 0.01 V
Iter 0: I: 0.000000000000 => -0.000000000001, dI = -1e-12
Success: Convergence reached: dI = -1.0000000000000001e-12 < eps = 1e-10
...
V = 0.69 V
Iter 0: I: 0.000000000000 => 0.000001886869, dI = 1.8869e-06
Iter 10: I: 0.000001886869 => 0.000002358586, dI = 4.7172e-07
Iter 20: I: 0.000002358586 => 0.000002476483, dI = 1.1789e-07
Iter 30: I: 0.000002476483 => 0.000002506085, dI = 2.9602e-08
Iter 40: I: 0.000002506085 => 0.000002513470, dI = 7.3846e-09
Iter 50: I: 0.000002513470 => 0.000002515321, dI = 1.8510e-09
Iter 60: I: 0.000002515321 => 0.000002515785, dI = 4.6391e-10
Iter 70: I: 0.000002515785 => 0.000002515901, dI = 1.1627e-10
Iter 73: I: 0.000002515901 => 0.000002515903, dI = 2.9090e-11
Success: Convergence reached: dI = 2.9090150917244585e-11 < eps = 1e-10
Press ENTER to exit>>
この後、\(V\)-\(I\) グラフが新しいウィンドウで表示され、ユーザーがEnterキーを押すとプログラムが終了します。
例2: 計算範囲と混合パラメータを指定して実行する
python equation-selfconsistent-diode.py 0.0 1.0 0.05 0.5
このコマンドは、以下の設定でプログラムを実行します。
Vmin = 0.0VVmax = 1.0VVstep = 0.05Vkmix = 0.5
実行結果の抜粋:
Solution of diode circuit current by self-consistent method
V = 0.0 V
Iter 0: I: 0.000000000000 => -0.000000000001, dI = -1e-12
Success: Convergence reached: dI = -1.0000000000000001e-12 < eps = 1e-10
V = 0.05 V
Iter 0: I: 0.000000000000 => -0.000000000001, dI = -1e-12
Success: Convergence reached: dI = -1.0000000000000001e-12 < eps = 1e-10
...
V = 0.95 V
Iter 0: I: 0.000000000000 => 0.000014603623, dI = 1.4604e-05
Iter 10: I: 0.000014603623 => 0.000017122709, dI = 2.5191e-06
Iter 20: I: 0.000017122709 => 0.000017726584, dI = 6.0388e-07
Iter 30: I: 0.000017726584 => 0.000017876879, dI = 1.5029e-07
Iter 40: I: 0.000017876879 => 0.000017914445, dI = 3.7566e-08
Iter 50: I: 0.000017914445 => 0.000017923880, dI = 9.4354e-09
Iter 60: I: 0.000017923880 => 0.000017926217, dI = 2.3375e-09
Iter 70: I: 0.000017926217 => 0.000017926798, dI = 5.8170e-10
Iter 80: I: 0.000017926798 => 0.000017926941, dI = 1.4385e-10
Iter 81: I: 0.000017926941 => 0.000017926977, dI = 3.5962e-11
Success: Convergence reached: dI = 3.5961916301323386e-11 < eps = 1e-10
Press ENTER to exit>>
同様に、計算結果のログが出力され、最終的に \(V\)-\(I\) グラフが描画されます。