回路シミュレータとして、ブラウザ上で動作する「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で回路の過渡応答を数値的にシミュレーションできる