【続編】非線形素子を含む回路方程式とヤコビアン行列の導入

# 【続編】SPICE における非線形素子を含む回路方程式とヤコビアン行列の導入 ～ニュートン法での解法～

しばらく前に書いた、
"SPICE のコンパニオンモデルと数値積分法による微分方程式の離散化"
という記事で、コンパニオンモデルや数値積分法を使ってコンデンサ・インダクタを「線形要素＋等価ソース」に置き換え、ステップごとに回路方程式を解く過渡解析の流れを紹介しました。

しかし、実際の回路には **非線形素子**（ダイオード、BJT、MOSFET など）が含まれることが多いです。このような **非線形特性**をどのように扱うのかが SPICE の核となる部分です。  
本記事では、**非線形素子**を含む回路方程式を **ニュートン法**で解く際に、**ヤコビアン行列（ジャコビアン）** がどう登場してくるのかを、なるべく分かりやすく解説します。

---

## 1. 非線形素子の $i\text{-}v\$ 関係

### 1-1. ダイオードやトランジスタの例
- **ダイオード**:  
  一般的な式として  
  $$
  i_D = I_S \Bigl(e^{\frac{v_D}{V_T}} - 1\Bigr)
  $$
  のような指数関数的な電流–電圧特性。  
- **BJT や MOSFET**:  
  BSIM、PSP など大規模モデルを使うと多くのパラメータが登場し、電圧依存の電流が高度に近似されます（実装は複雑ですが、本質は「ノード電圧に依存する非線形関数」という点で同じ）。

### 1-2. 非線形方程式としての表現
SPICE は Modified Nodal Analysis (MNA) をベースに「ノード電圧（未知数）」を求めますが、非線形素子があると以下のように
$$
\mathbf{A}(\mathbf{x}) \, \mathbf{x} = \mathbf{b}(\mathbf{x}, t)
$$
という形になり、**$\mathbf{x}$ に依存する関数**が行列や右辺ベクトルに含まれます。つまり「線形行列」ではなく、**非線形方程式**です。

---

## 2. ニュートン法をどう使うのか

### 2-1. 一般的なニュートン法の形
非線形ベクトル方程式  
$$
\mathbf{f}(\mathbf{x}) = \mathbf{0}
$$
を解くとき、ニュートン法は以下の反復を行います。  
$$
\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - \Bigl[\mathbf{J}(\mathbf{x}^{(k)})\Bigr]^{-1} \, \mathbf{f}\bigl(\mathbf{x}^{(k)}\bigr),
$$
ここで  
$$
\mathbf{J}(\mathbf{x}) = \frac{\partial \mathbf{f}}{\partial \mathbf{x}}
$$
が**ヤコビアン行列**です。  

### 2-2. 回路方程式における $\mathbf{f}(\mathbf{x})$
SPICE の回路方程式を  
$$
\mathbf{f}(\mathbf{x}) = \mathbf{A}(\mathbf{x})\,\mathbf{x} - \mathbf{b}(\mathbf{x}, t)= \mathbf{0}
$$
の形で書くとき、ニュートン法は

1. **ヤコビアン行列**  
   $$
   \mathbf{J}\bigl(\mathbf{x}^{(k)}\bigr) = \frac{\partial}{\partial \mathbf{x}}      \Bigl[\mathbf{A}(\mathbf{x})\,\mathbf{x} - \mathbf{b}(\mathbf{x}, t)\Bigr]
   $$
2. **残差ベクトル**  
   $$
   \mathbf{f}\bigl(\mathbf{x}^{(k)}\bigr)    = \mathbf{A}\bigl(\mathbf{x}^{(k)}\bigr)      \,\mathbf{x}^{(k)}    - \mathbf{b}\bigl(\mathbf{x}^{(k)}, t\bigl)
   $$
をステップごとに計算し、  
$$
\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - \Bigl[\mathbf{J}\bigl(\mathbf{x}^{(k)}\bigr)\Bigr]^{-1} 
\, \mathbf{f}\bigl(\mathbf{x}^{(k)}\bigr).
$$

---

## 3. ヤコビアン行列（ジャコビアン）の役割

### 3-1. 具体的な非線形素子の微分
たとえば、ダイオード電流  
$$
i_D = I_S \Bigl(e^{\frac{v_D}{V_T}} - 1\Bigr)
$$
が、ノード電圧 $v_D$ に依存する場合、ヤコビアン行列の該当要素には  
$$
\frac{\partial i_D}{\partial v_D} 
= I_S \,\frac{1}{V_T} \, e^{\frac{v_D}{V_T}}
$$
が組み込まれます。  

MOSFET や BJT でも**端子電圧を微分**した値（コンダクタンスや相互コンダクタンス）がヤコビアン行列の要素になります。

### 3-2. SPICE での行列構築
- **素子単位**で $i\text{-}v$ 関係と微分を計算  
- 該当ノードに対して「行列要素」「ベクトル要素」を加算  
- これを全部の素子について積み上げると、**ヤコビアン行列 + 残差ベクトル** が完成

こうして「現在の推定解 $\mathbf{x}^{(k)}$」に基づいて導出されたヤコビアン行列を使い、次の推定解へ更新します。

---

## 4. SPICE での実装フローのイメージ

1. **コンパニオンモデル + 非線形素子の組み合わせ**  
   - コンデンサやインダクタは前回記事の通り、数値積分法で「等価抵抗＋等価ソース」に変換  
   - 非線形素子（ダイオード・トランジスタなど）も、それぞれ $i(\mathbf{x})$ と $\frac{\partial i}{\partial \mathbf{x}}$（微分）を計算する機能がある  
2. **MNA 方程式の構築**  
   - 各素子の貢献を「行列 $\mathbf{A}(\mathbf{x})$ と $\mathbf{b}(\mathbf{x}, t)$」に書き込む  
   - 非線形素子があるために $\mathbf{A}$ や $\mathbf{b}$ は $\mathbf{x}$ に依存  
3. **ニュートン反復**  
   - ある初期値 $\mathbf{x}^{(0)}$ からスタートし、  
     1. **ヤコビアン** $\mathbf{J}(\mathbf{x}^{(k)})$ を計算  
     2. **残差** $\mathbf{f}(\mathbf{x}^{(k)})$ を計算  
     3. **更新式** で $\mathbf{x}^{(k+1)}$ を求める  
     4. 収束判定（残差・更新量が小さいか確認）  
   - 収束したら、そのステップのノード電圧解が得られる  
4. **トランケーション誤差 (LTE) + ステップ制御**  
   - 「解が収束したら」→ 予測子修正子法などで誤差 (LTE) を見積もり、次のステップ幅 $\Delta t$ を決める  
   - それを繰り返すことで、過渡解析が一歩ずつ進む

---

## 5. なぜヤコビアンが重要なのか

1. **2次収束の恩恵**  
   - ニュートン法は、ヤコビアンを正しく使うと「平方収束 (2次収束)」特性があり、誤差が急速に減少する。  
   - 大規模回路解析で効率よく解を得るには不可欠。  
2. **収束失敗を減らす**  
   - 誤った微分や近似しすぎたヤコビアンを使うと、収束が遅くなったり発散する危険がある。  
   - SPICE 実装では、GMIN ステッピングやソースステッピングなど「収束支援策」も組み合わせることで安定性を確保している。  
3. **大規模回路ではソルバ最適化が必要**  
   - ヤコビアン行列はスパース（零要素が多い）であるため、高速なスパース行列ソルバの実装が性能を左右する。  
   - 並列化や分割手法など、さまざまな最適化が行われている。

---

## 6. まとめ

1. **非線形素子は、ノード電圧 $\mathbf{x}$ に依存する電流 $i(\mathbf{x})$ を生む**  
   - ダイオードやトランジスタでは、指数関数や多項式、あるいは大規模モデルで定義された非線形関数。  
2. **回路方程式は非線形となり、ニュートン法を用いる**  
   - MNA によって
     $$
     \mathbf{f}(\mathbf{x}) = \mathbf{A}(\mathbf{x}) \,\mathbf{x} - \mathbf{b}(\mathbf{x}, t)     = 0
     $$
     を組み立て、ヤコビアン行列を計算しながら反復。  
3. **ヤコビアン行列は各素子の微分で構築する**  
   - ダイオードなら $\partial i_D / \partial v_D$、MOSFET なら $\partial i_d / \partial v_{gs}, \partial v_{ds}$ などを計算して行列に反映。  
4. **ニュートン反復 + トランケーション誤差 (LTE) 評価でステップを進める**  
   - 各ステップごとにニュートン法を回して、解が得られたら LTE を評価。ステップ幅を調整して次ステップへ。

以上が、**非線形素子を含む回路方程式をヤコビアン行列とニュートン法で解く**というプロセスの概要です。  
**コンパニオンモデル（L・C の離散化）** と **非線形素子のヤコビアン**、そして **誤差制御** が組み合わさって、SPICE は大規模アナログ回路の過渡解析を実現しています。実装レベルでは、これらを効率的に組み上げるための最適化や収束対策が多数盛り込まれており、SPICE ツールは膨大なノウハウの結集ともいえる存在です。

ぜひ、今回の記事を足がかりに、SPICE のより詳細な実装（BSIM モデルの式やソルバの最適化手法など）にも興味を広げてみてください。より深い部分を理解することで、大規模回路解析の仕組みが一段と明確になるはずです。