NOTインバータとロジスティック関数によるアナログモデリング(伝達関数)とニューラルネットによるNOTゲート学習


## ■ 1. はじめに

CMOSインバータは「0→1」「1→0」のデジタル論理動作を行う基本回路ですが、アナログ的にみるとその**入力電圧に対する出力電圧は非線形で滑らかに反転**する特徴があります。この記事ではこの挙動を**ロジスティック関数**で近似し、さらには**伝搬遅延を持つ動的応答**や、**ニューラルネットワークによるNOT回路の学習**までを解説します。

---

## ■ 2. CMOSインバータのアナログ的S字応答


### ■ CMOSインバータのロジスティック関数モデル（出力電圧）

CMOSインバータのアナログ的な出力電圧 $V_{\text{out}}$ は、入力電圧 $V_{\text{in}}$ に対して以下のように滑らかに反転する特性を持ちます：

$$
V_{\text{out}}(V_{\text{in}}) = \frac{V_{\text{DD}}}{1 + \exp\left(\frac{V_{\text{in}} - V_{\text{th}}}{k}\right)}
$$

---

### ■ 各記号の意味

| 記号               | 説明                          |
| ---------------- | --------------------------- |
| $V_{\text{DD}}$  | 電源電圧（例：5V）                  |
| $V_{\text{in}}$  | 入力電圧（0～$V_{\text{DD}}$）     |
| $V_{\text{out}}$ | 出力電圧（0～$V_{\text{DD}}$）     |
| $V_{\text{th}}$  | スレッショルド電圧（スイッチングの中心、例：2.5V） |
| $k$              | 変化の急峻さを調整する係数（小さいほど急）       |

---

### ■ 特性

* $V_{\text{in}} \ll V_{\text{th}} \Rightarrow V_{\text{out}} \to V_{\text{DD}}$（論理1）
* $V_{\text{in}} \gg V_{\text{th}} \Rightarrow V_{\text{out}} \to 0$（論理0）
* $V_{\text{in}} = V_{\text{th}} \Rightarrow V_{\text{out}} = \frac{V_{\text{DD}}}{2}$

この式は**CMOSインバータの非線形なS字型の電圧特性**を、数学的にシンプルに再現できるロジスティック（シグモイド）関数です。

---




---

### ● グラフによる可視化（Python）

```python
import numpy as np
import matplotlib.pyplot as plt

VDD = 5.0
Vth = 2.5
k = 0.05

Vin = np.linspace(0, 5, 500)
Vout = VDD / (1 + np.exp((Vin - Vth)/k))

plt.plot(Vin, Vout)
plt.xlabel("Input Voltage Vin [V]")
plt.ylabel("Output Voltage Vout [V]")
plt.title("CMOS Inverter Response (Logistic Model)")
plt.grid(True)
plt.show()
````

このグラフでは $V_{\text{in}} = V_{\text{th}}$ でちょうど $V_{\text{out}} = \frac{V_{DD}}{2}$ となり、急激な反転が再現されます。

---

## ■ 3. 伝搬遅延付きモデル（RCによる近似）

CMOSインバータの現実的な応答には、**出力変化に時間遅延**があります。これを1次ローパスフィルタで近似すると、次のような伝達関数が得られます：

$$
G(s) = \frac{-1}{\tau s + 1}, \quad \tau = RC
$$

これは入力信号の反転出力が、時定数 $\tau$ をもって遅れて滑らかに出てくる動的モデルです。アナログ回路や信号処理シミュレーションで多用されます。

### ● モデル例
```python
# 必要なライブラリをインストール・インポート
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# === パラメータ一元管理 ===
R = 1e3       # 抵抗値 [Ohm]
C = 1e-9      # 静電容量 [F]
tau = R * C   # 時定数 τ = RC

# === 伝達関数定義 G(s) = -1 / (τs + 1) ===
num = [-1]              # 分子
den = [tau, 1]          # 分母（1次遅れ系）
system = signal.TransferFunction(num, den)

# === 1. ボード線図（ゲインと位相） ===
w, mag, phase = signal.bode(system)

plt.figure()
plt.semilogx(w, mag)
plt.title("Bode Plot (Magnitude)")
plt.xlabel("Frequency [rad/s]")
plt.ylabel("Magnitude [dB]")
plt.grid(True)

plt.figure()
plt.semilogx(w, phase)
plt.title("Bode Plot (Phase)")
plt.xlabel("Frequency [rad/s]")
plt.ylabel("Phase [deg]")
plt.grid(True)

# === 2. ステップ応答 ===
t, y = signal.step(system)

plt.figure()
plt.plot(t, y)
plt.title("Step Response of CMOS Inverter with RC Delay")
plt.xlabel("Time [s]")
plt.ylabel("Output Voltage Vout [V]")
plt.grid(True)

plt.show()
```

---

### ■ 出力の説明

* **ボード線図（Magnitude）**：

  * 高周波数に向かうとゲインが減衰（-20dB/dec）する
  * 低周波ではゲインは $-1$ に近づく（=0dB）

* **位相応答**：

  * 位相は $-90^\circ$ に向かって単調に減少
  * 低周波ではほぼ 0°

* **ステップ応答**：

  * 負の1次応答（反転して -1 に漸近）
  * 時定数 $\tau$ に従って出力が滑らかに反転

---




## ■ 4. ニューラルネットワークによるNOTゲートの学習

### ● 学習目的

「入力が0なら出力1、入力が1なら出力0」というNOTゲートの論理動作を、\*\*機械学習モデル（ニューラルネット）\*\*で再現します。

---

### ● 教師データ（ロジスティック入力）

| 入力 $x$ | 出力 $y = \text{NOT}(x)$ |
| ------ | ---------------------- |
| 0      | 1                      |
| 1      | 0                      |

※ 中間値（0.1～0.9）も含めると連続値に対する滑らかな反転が学習可能（アナログ的モデル）

---

### ● モデル例（PyTorch）

```python
import torch
import torch.nn as nn
import torch.optim as optim

# データ生成（連続値でロジスティック的反転）
x = torch.linspace(0, 1, 100).view(-1, 1)
y = 1 / (1 + torch.exp((x - 0.5)/0.05))  # ロジスティックNOT出力

# ニューラルネット定義
model = nn.Sequential(
    nn.Linear(1, 10),
    nn.Tanh(),
    nn.Linear(10, 1),
    nn.Sigmoid()
)

loss_fn = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 学習ループ
for epoch in range(1000):
    y_pred = model(x)
    loss = loss_fn(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# 結果プロット
import matplotlib.pyplot as plt
plt.plot(x.detach().numpy(), y.detach().numpy(), label="Target")
plt.plot(x.detach().numpy(), y_pred.detach().numpy(), label="NN Output")
plt.legend()
plt.title("NN Approximation of NOT Gate (Analog)")
plt.xlabel("Input x")
plt.ylabel("Output y")
plt.grid(True)
plt.show()
```

---

## ■ 5. まとめ

| 手法        | 概要                      | 応用               |
| --------- | ----------------------- | ---------------- |
| ロジスティック関数 | CMOSインバータのアナログS字反転特性を近似 | アナログ回路・連続制御      |
| 伝達関数モデル   | RC遅延を含む1次系として動的特性を近似    | 制御工学・シミュレーション    |
| ニューラルネット  | ロジック動作をデータ駆動で学習         | AIハードウェア模倣・ゲート学習 |

---