Circuit Simulator Appletで回路シミュレーションを始める

回路シミュレータとして、ブラウザ上で動作する「Circuit Simulator Applet」は、電子回路の学習に非常に便利なツールです。

インストール不要でブラウザから直接利用でき、電流の流れや電圧の変化をリアルタイムに可視化できます。今回は、このツールの使い方と合わせて、電子回路の基礎理論をPythonでシミュレーションする方法を解説します。

本記事の内容

  • Circuit Simulator Appletの概要
  • RLC回路の基礎理論
  • 過渡応答と周波数応答の解析
  • Pythonでの回路シミュレーション

RLC回路の基礎

電子回路の基本素子である抵抗(R)、インダクタ(L)、キャパシタ(C)の特性を理解しましょう。

各素子のインピーダンス

交流回路における各素子のインピーダンス $Z$ は次の通りです。

$$ \begin{align} Z_R &= R \\ Z_L &= j\omega L \\ Z_C &= \frac{1}{j\omega C} \end{align} $$

ここで $\omega = 2\pi f$ は角周波数、$j$ は虚数単位です。

直列RLC回路

直列RLC回路の合成インピーダンスは、

$$ Z(\omega) = R + j\omega L + \frac{1}{j\omega C} = R + j\left(\omega L – \frac{1}{\omega C}\right) $$

共振周波数

インピーダンスの虚部がゼロとなる周波数が共振周波数 $f_0$ です。

$$ \omega_0 L = \frac{1}{\omega_0 C} \implies f_0 = \frac{1}{2\pi\sqrt{LC}} $$

共振時にはインピーダンスが最小($Z = R$)となり、電流が最大になります。

Q値と帯域幅

直列RLC回路のQ値は、

$$ Q = \frac{1}{R}\sqrt{\frac{L}{C}} = \frac{\omega_0 L}{R} = \frac{1}{\omega_0 CR} $$

3dB帯域幅 $B$ との関係は、

$$ B = \frac{f_0}{Q} $$

過渡応答

直列RLC回路のステップ応答

直列RLC回路にステップ電圧を印加したときの微分方程式は、

$$ L\frac{d^2 i}{dt^2} + R\frac{di}{dt} + \frac{i}{C} = 0 $$

特性方程式 $Ls^2 + Rs + 1/C = 0$ の根は、

$$ s_{1,2} = -\frac{R}{2L} \pm \sqrt{\left(\frac{R}{2L}\right)^2 – \frac{1}{LC}} $$

減衰係数 $\alpha = R/(2L)$ と固有周波数 $\omega_0 = 1/\sqrt{LC}$ を定義すると、

  • 過減衰 ($\alpha > \omega_0$): 2つの実数根。振動せずに減衰
  • 臨界減衰 ($\alpha = \omega_0$): 重根。最速で減衰
  • 不足減衰 ($\alpha < \omega_0$): 複素根。振動しながら減衰

減衰比 $\zeta = \alpha / \omega_0$ を用いると、

$$ \zeta = \frac{R}{2}\sqrt{\frac{C}{L}} = \frac{1}{2Q} $$

Pythonでの回路シミュレーション

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 回路パラメータ
R = 100.0   # 抵抗 [Ohm]
L = 10e-3   # インダクタンス [H]
C = 100e-9  # 容量 [F]

# 特性値の計算
f0 = 1 / (2 * np.pi * np.sqrt(L * C))
Q = (1 / R) * np.sqrt(L / C)
zeta = 1 / (2 * Q)
omega0 = 2 * np.pi * f0

print(f"=== 直列RLC回路の特性 ===")
print(f"共振周波数 f0 = {f0:.1f} Hz")
print(f"Q値 = {Q:.2f}")
print(f"減衰比 zeta = {zeta:.3f}")
print(f"帯域幅 B = {f0/Q:.1f} Hz")
if zeta < 1:
    print(f"応答タイプ: 不足減衰(振動的)")
elif zeta == 1:
    print(f"応答タイプ: 臨界減衰")
else:
    print(f"応答タイプ: 過減衰")

# --- 過渡応答のシミュレーション ---
def rlc_ode(t, y, R, L, C, V_in):
    """直列RLC回路の状態方程式
    y[0] = i (電流), y[1] = v_c (キャパシタ電圧)
    """
    i, vc = y
    di_dt = (V_in - R * i - vc) / L
    dvc_dt = i / C
    return [di_dt, dvc_dt]

# ステップ応答
V_step = 1.0  # ステップ電圧 [V]
t_span = (0, 0.005)
t_eval = np.linspace(0, 0.005, 5000)
y0 = [0.0, 0.0]

sol = solve_ivp(rlc_ode, t_span, y0, t_eval=t_eval,
                args=(R, L, C, V_step), method='RK45')

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

# ステップ応答(電流)
axes[0, 0].plot(sol.t * 1000, sol.y[0] * 1000, 'b-', linewidth=1.5)
axes[0, 0].set_xlabel('Time [ms]')
axes[0, 0].set_ylabel('Current [mA]')
axes[0, 0].set_title(f'Step Response (R={R}Ω, L={L*1e3}mH, C={C*1e9}nF)')
axes[0, 0].grid(True)

# ステップ応答(キャパシタ電圧)
axes[0, 1].plot(sol.t * 1000, sol.y[1], 'r-', linewidth=1.5)
axes[0, 1].axhline(V_step, color='gray', linestyle='--', alpha=0.5)
axes[0, 1].set_xlabel('Time [ms]')
axes[0, 1].set_ylabel('Capacitor Voltage [V]')
axes[0, 1].set_title('Capacitor Voltage')
axes[0, 1].grid(True)

# --- 周波数応答 ---
f = np.logspace(2, 6, 1000)
omega = 2 * np.pi * f
Z = R + 1j * omega * L + 1 / (1j * omega * C)
H = 1 / Z  # 伝達関数(電圧→電流)

# ボード線図(ゲイン)
gain_db = 20 * np.log10(np.abs(H) / np.max(np.abs(H)))
axes[1, 0].semilogx(f, gain_db, 'b-', linewidth=2)
axes[1, 0].axvline(f0, color='red', linestyle='--', label=f'f0={f0:.0f}Hz')
axes[1, 0].set_xlabel('Frequency [Hz]')
axes[1, 0].set_ylabel('Gain [dB]')
axes[1, 0].set_title('Frequency Response (Bode Plot)')
axes[1, 0].legend()
axes[1, 0].grid(True)
axes[1, 0].set_ylim(-40, 5)

# ボード線図(位相)
phase = np.degrees(np.angle(H))
axes[1, 1].semilogx(f, phase, 'r-', linewidth=2)
axes[1, 1].axvline(f0, color='red', linestyle='--', alpha=0.5)
axes[1, 1].set_xlabel('Frequency [Hz]')
axes[1, 1].set_ylabel('Phase [deg]')
axes[1, 1].set_title('Phase Response')
axes[1, 1].grid(True)

plt.tight_layout()
plt.show()

まとめ

本記事では、回路シミュレーションの基礎とRLC回路の理論を解説しました。

  • Circuit Simulator Appletはブラウザ上で手軽に回路シミュレーションができるツールである
  • 直列RLC回路の共振周波数は $f_0 = 1/(2\pi\sqrt{LC})$ で与えられる
  • 過渡応答は減衰比 $\zeta$ により過減衰・臨界減衰・不足減衰に分類される
  • Q値が大きいほど共振のピークが鋭くなり、帯域幅が狭くなる
  • Pythonのscipy.integrate.solve_ivpで回路の過渡応答を数値的にシミュレーションできる