SPICE のコンパニオンモデルと数値積分法による微分方程式の離散化

# SPICE のコンパニオンモデルと数値積分法による微分方程式の離散化

## はじめに
SPICE などの回路シミュレータでは、コンデンサやインダクタなどのエネルギー蓄積素子を「微分方程式」として扱う必要があります。しかし、シミュレータが実際に解くのは、微分方程式そのものではなく、**数値積分法**を用いて離散化した結果の「代数方程式」です。

この際に登場するキーワードが **「コンパニオンモデル」** です。本記事では、コンパニオンモデルとは何か、そして数値積分法によってどのように微分方程式を代数方程式に変換しているのかを、わかりやすく解説します。  
さらに、電圧源や電流源が数式上でどのように扱われているのか（特に Modified Nodal Analysis での取り扱い方）についても触れます。

---

## 1. コンパニオンモデルとは何か

### 1-1. 微分方程式を線形回路に置き換える仕組み
- コンデンサやインダクタなどの素子は、**電流と電圧の関係を微分方程式**で表します (例: 
$$
C \frac{dv}{dt} = i, \quad 
L \frac{di}{dt} = v
$$
など)。
- 数値解析 (Backward Euler, Trapezoidal, Gear 法など) を用いると、**各時刻ステップで「抵抗 + 電源」の形**に置き換えられます。
- この「抵抗 + 電源」の形に変換された一時的な等価回路こそ、**コンパニオンモデル (companion model)** と呼ばれます。

### 1-2. コンパニオンモデルの具体例

#### コンデンサの場合
- 微分方程式  
$$
i_C(t) = C \frac{dv_C(t)}{dt}
$$

- 台形則やバックワード・オイラー法で離散化  
$$
i_C(t + \Delta t) \approx C \frac{v_C(t+\Delta t) - v_C(t)}{\Delta t}
$$

- これを変形すると、**等価抵抗 + 等価電源**(電流源や電圧源) の形で表せるようになり  
  → **コンパニオンモデル**として、SPICE は「時刻 $t + \Delta t$」のコンデンサを “抵抗 + ソース” で扱う

### 1-3. なぜコンパニオンモデルを使うのか
1. **Modified Nodal Analysis (MNA) に組み込みやすい**  
   - コンデンサやインダクタを、その時刻ステップに応じた「線形回路」とみなして行列 $\mathbf{A}$、ベクトル $\mathbf{b}$ を組み立てられる。
2. **ステップごとにパラメータ更新**  
   - 前のステップでの電圧・電流を反映し、次のステップでは適切に抵抗値や等価電源の値を更新する。
3. **非線形素子とまとめて解ける**  
   - MOSFET・BJT などの非線形素子があっても、コンパニオンモデル化した L・C と合わせてニュートン法で一括して解くことができる。

---

## 2. 数値積分法で微分方程式を代数方程式にする仕組み

### 2-1. 微分を差分に置き換える
コンデンサの場合は 
$$
i_C = C \frac{dv_C}{dt},
$$
インダクタの場合は 
$$
v_L = L \frac{di_L}{dt}
$$
という微分方程式があります。これを台形則やバックワード・オイラー法などの **数値積分法** で離散化すると、

- **微分** 
$$
\frac{d}{dt}
$$ 
を
- **前の時刻と現在の時刻の値の差**
$$
\frac{x(t+\Delta t) - x(t)}{\Delta t}
$$
に置き換えられ、**離散的な差分方程式**を得られます。

### 2-2. コンパニオンモデル化による線形近似回路
差分方程式で表されたコンデンサやインダクタは、**各ステップだけ有効な線形回路**として書き下すことができます。  
- コンデンサ → 「等価抵抗 + 等価電流源 (or 電圧源)」  
- インダクタ → 「等価抵抗 + 等価電圧源 (or 電流源)」  

この一時的な線形回路がコンパニオンモデルです。

### 2-3. 非線形素子がある場合
- MOSFET や BJT、ダイオードなどの **非線形素子** は、電圧と電流の関係がノード電圧ベクトル $\mathbf{x}$ に依存するため、線形とは限りません。
- そのため、**離散化しても回路全体は非線形方程式**になります。
- SPICE では、**ニュートン法**を使って「コンパニオンモデルで線形化された L・C」と「非線形素子」の組み合わせを同時に解き、収束解を得ています。

---

## 3. 電圧源・電流源は数式上でどう表されるか

### 3-1. 電圧源の場合
- **理想直流電圧源**  
  ノード $a$ とノード $b$ 間が一定電圧 $V_s$ なら
  $$
  V_a - V_b = V_s
  $$
  と表されます。SPICE の MNA 方程式では、補助変数を導入したり行列を拡張したりして、この「既知電圧」を組み込みます。

- **時間依存の電圧源**  
  波形 $v_s(t)$ を与えると、各ステップで
  $$
  V_a(t) - V_b(t) = v_s(t)
  $$
  として扱われ、時刻 $t_n$ ごとに $v_s(t_n)$ を計算して行列の右辺などに反映します。

### 3-2. 電流源の場合
- **理想直流電流源**  
  ノード $a$ からノード $b$ に電流 $I_s$ が流れるなら
  $$
  I_{ab} = I_s
  $$
  という形になり、KCL（電流和=0）の方程式の**右辺**に「既知の注入電流」として組み込まれます。

- **時間依存の電流源**  
  $i_s(t)$ が与えられていれば、各ステップで
  $$
  I_{ab}(t) = i_s(t)
  $$
  として扱われ、やはり MNA の右辺ベクトルに時刻ごとの値を反映します。

### 3-3. MNA方程式(イメージ)
多くの場合、MNA では
$$
\mathbf{A}(\mathbf{x}) \, \mathbf{x} = \mathbf{b}(\mathbf{x}, t)
$$
という形でノード電圧などを未知数として解きます。  
- **電圧源**: ノード間電位差が既知 → 行列に制約を追加、または補助変数を導入して表現  
- **電流源**: KCL の右辺に既知の電流として組み込み → ノード電流バランスの “注入項” に反映

---

## 4. 実際の SPICE の解法フロー

1. **時刻ステップの選択**  
   - Adaptive Time Stepping によって $\Delta t$ が決まる。
2. **コンパニオンモデルの構成**  
   - コンデンサやインダクタを、その時刻ステップに合わせて「等価抵抗＋等価電源」に変換 (コンパニオンモデル)。
3. **非線形素子 + コンパニオンモデル + 電圧源/電流源 でノード方程式を組立**  
   - MNA により行列 
   $$
   \mathbf{A}(\mathbf{x})
   $$
   とベクトル 
   $$
   \mathbf{b}(\mathbf{x}, t)
   $$
   を用意 (電圧源・電流源は「既知値」として組み込む)。
4. **ニュートン法で反復**  
   - 非線形な 
   $$
   \mathbf{A}(\mathbf{x}) \,\mathbf{x} = \mathbf{b}(\mathbf{x}, t)
   $$
   を収束させる (残差が十分小さいか、変数更新量が小さいかで判定)。
5. **解の確定 & トランケーション誤差 (LTE) 評価**  
   - 解が得られたら、予測子修正子法による局所誤差を見積もり、ステップ幅を調整。
6. **次のステップへ**  
   - 時刻を進め、再びコンパニオンモデルを組み直す。これを繰り返す。

---

## 5. まとめ

1. **コンパニオンモデル**  
   - コンデンサやインダクタを、**数値積分法**で離散化し、各時刻ステップで“抵抗 + ソース”という線形要素に置き換える手法。  
   - Modified Nodal Analysis (MNA) のフレームワークに組み込みやすく、L・C を含む大規模回路を効率よく解析できる。

2. **数値積分法による微分方程式の代数方程式化**  
   - $$ \frac{d}{dt} $$ を差分 $$ \frac{x_{n+1} - x_n}{\Delta t} $$ に置き換えることで、微分方程式を離散化し、代数方程式として扱う。  
   - 完全に線形な回路であればそのまま線形方程式で解けるが、非線形素子がある場合は最終的に「非線形方程式 + ニュートン反復」となる。

3. **電圧源・電流源の取り扱い**  
   - **電圧源**: ノード間電位差が既知値（時間依存なら $v_s(t)$） → MNA では行列の拡張や拘束条件として扱う  
   - **電流源**: KCL における「既知の注入電流」（時間依存なら $i_s(t)$） → ノード方程式の右辺に反映

4. **SPICE の全体像**  
   - 「コンパニオンモデル」と「非線形素子(ニュートン法)」、そして「電圧源/電流源(既知値)」を組み合わせて、ステップごとに回路方程式を更新・解くプロセスを繰り返す。  
   - この流れにより、大規模かつ複雑な回路の過渡解析を可能にしている。

以上が、「コンパニオンモデル」と「数値積分法による微分方程式の離散化」、および「電圧源/電流源の数式表現」の概要です。微分方程式を差分化することで、時間軸上の連続問題を離散化し、SPICE ではそれを等価の線形回路（コンパニオンモデル）＋非線形素子の組み合わせとして解いています。そして、電源類は「既知の拘束条件」として回路方程式に組み込まれます。これにより、過渡解析をステップごとに効率的・合理的に進められるわけです。