インピーダンスとは、交流回路における電流の流れにくさを示す量です。単位はオーム ($\Omega$) ですが、直流回路の抵抗とは異なり、複素数で表現されます。
交流回路では、電圧と電流の間に位相差が生じるため、単なる実数の抵抗だけでは回路の特性を記述できません。インピーダンスは、この位相差の情報も含む複素数表現です。
本記事の内容
- インピーダンスの数学的定義
- 各回路素子のインピーダンス
- インピーダンスの直列・並列接続
- インピーダンス整合の概念
- Pythonでの計算と可視化
オームの法則の拡張
直流回路のオームの法則は $V = IR$ ですが、交流回路では複素表現を用いて次のように拡張されます。
$$ \tilde{V} = Z \cdot \tilde{I} $$
ここで $\tilde{V}$、$\tilde{I}$ は電圧と電流のフェーザ(複素振幅)、$Z$ はインピーダンスです。
交流信号の複素数表現
交流電圧 $v(t) = V_0 \cos(\omega t + \phi)$ は、複素指数関数を用いて次のように表現されます。
$$ v(t) = \text{Re}[V_0 e^{j(\omega t + \phi)}] = \text{Re}[\tilde{V} e^{j\omega t}] $$
ここで $\tilde{V} = V_0 e^{j\phi}$ がフェーザです。
各素子のインピーダンス
抵抗 R
$$ Z_R = R $$
電圧と電流は同位相(位相差0度)です。
インダクタ L
$$ Z_L = j\omega L = \omega L \cdot e^{j\pi/2} $$
電流は電圧より90度遅れます。これは、インダクタが電流の変化を妨げる性質(自己誘導)に起因します。
キャパシタ C
$$ Z_C = \frac{1}{j\omega C} = \frac{1}{\omega C} \cdot e^{-j\pi/2} $$
電流は電圧より90度進みます。キャパシタは電圧の変化を妨げる性質を持ちます。
インピーダンスの一般形
$$ Z = R + jX $$
ここで $R$ は抵抗(レジスタンス)、$X$ はリアクタンスです。
- $X > 0$: 誘導性(インダクタ的)
- $X < 0$: 容量性(キャパシタ的)
- $X = 0$: 純抵抗
直列・並列接続
直列接続
$$ Z_{\text{total}} = Z_1 + Z_2 + \cdots + Z_n $$
並列接続
$$ \frac{1}{Z_{\text{total}}} = \frac{1}{Z_1} + \frac{1}{Z_2} + \cdots + \frac{1}{Z_n} $$
2つのインピーダンスの並列は、
$$ Z_{\text{total}} = \frac{Z_1 Z_2}{Z_1 + Z_2} $$
アドミタンス
インピーダンスの逆数をアドミタンス $Y$ と呼びます。
$$ Y = \frac{1}{Z} = G + jB $$
ここで $G$ はコンダクタンス、$B$ はサセプタンスです。並列回路の解析ではアドミタンスが便利です。
インピーダンス整合
信号源から負荷への電力伝送を最大化するためには、インピーダンス整合が必要です。
信号源のインピーダンスを $Z_s = R_s + jX_s$、負荷のインピーダンスを $Z_L = R_L + jX_L$ とすると、最大電力伝送条件は、
$$ Z_L = Z_s^* = R_s – jX_s $$
つまり、負荷インピーダンスが信号源インピーダンスの複素共役のとき、電力伝送が最大になります。このとき伝送される最大電力は、
$$ P_{\max} = \frac{|V_s|^2}{8R_s} $$
Pythonでのインピーダンス計算と可視化
import numpy as np
import matplotlib.pyplot as plt
# 回路パラメータ
R = 50.0 # 抵抗 [Ohm]
L = 1e-3 # インダクタンス [H]
C = 10e-9 # 容量 [F]
# 周波数範囲
f = np.logspace(3, 7, 1000) # 1kHz ~ 10MHz
omega = 2 * np.pi * f
# 各素子のインピーダンス
Z_R = R * np.ones_like(f)
Z_L = 1j * omega * L
Z_C = 1 / (1j * omega * C)
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# 各素子のインピーダンスの大きさ
axes[0, 0].loglog(f, np.abs(Z_R), 'r-', linewidth=2, label=f'R = {R} Ohm')
axes[0, 0].loglog(f, np.abs(Z_L), 'b-', linewidth=2, label=f'L = {L*1e3} mH')
axes[0, 0].loglog(f, np.abs(Z_C), 'g-', linewidth=2, label=f'C = {C*1e9} nF')
axes[0, 0].set_xlabel('Frequency [Hz]')
axes[0, 0].set_ylabel('|Z| [Ohm]')
axes[0, 0].set_title('Impedance Magnitude')
axes[0, 0].legend()
axes[0, 0].grid(True, which='both', alpha=0.3)
# 直列RLC回路のインピーダンス
Z_series = R + 1j * omega * L + 1 / (1j * omega * C)
f0 = 1 / (2 * np.pi * np.sqrt(L * C))
axes[0, 1].semilogy(f, np.abs(Z_series), 'b-', linewidth=2)
axes[0, 1].axvline(f0, color='red', linestyle='--', label=f'f0 = {f0/1e3:.1f} kHz')
axes[0, 1].set_xlabel('Frequency [Hz]')
axes[0, 1].set_ylabel('|Z| [Ohm]')
axes[0, 1].set_title('Series RLC Impedance')
axes[0, 1].legend()
axes[0, 1].grid(True, which='both', alpha=0.3)
axes[0, 1].set_xscale('log')
# インピーダンスの複素平面表示(ナイキスト図)
# 並列RLC回路
Z_parallel = 1 / (1/R + 1/(1j*omega*L) + 1j*omega*C)
axes[1, 0].plot(np.real(Z_parallel), np.imag(Z_parallel), 'b-', linewidth=1)
axes[1, 0].plot(np.real(Z_parallel[0]), np.imag(Z_parallel[0]), 'go', markersize=8, label='Low freq')
axes[1, 0].plot(np.real(Z_parallel[-1]), np.imag(Z_parallel[-1]), 'ro', markersize=8, label='High freq')
axes[1, 0].set_xlabel('Re(Z) [Ohm]')
axes[1, 0].set_ylabel('Im(Z) [Ohm]')
axes[1, 0].set_title('Parallel RLC Impedance (Nyquist Plot)')
axes[1, 0].legend()
axes[1, 0].grid(True)
axes[1, 0].set_aspect('equal')
# 電力伝送効率とインピーダンス整合
R_source = 50 # 信号源抵抗
R_load = np.linspace(1, 200, 200)
V_s = 1.0 # 信号源電圧
# 負荷に伝送される電力
P_load = V_s**2 * R_load / (R_source + R_load)**2
P_max = V_s**2 / (4 * R_source)
axes[1, 1].plot(R_load, P_load / P_max, 'b-', linewidth=2)
axes[1, 1].axvline(R_source, color='red', linestyle='--',
label=f'R_L = R_s = {R_source} Ohm (matched)')
axes[1, 1].set_xlabel('Load Resistance [Ohm]')
axes[1, 1].set_ylabel('Normalized Power')
axes[1, 1].set_title('Power Transfer vs Load Resistance')
axes[1, 1].legend()
axes[1, 1].grid(True)
plt.tight_layout()
plt.show()
# 数値確認
print(f"\n=== インピーダンスの数値例 (f = {f0:.0f} Hz) ===")
idx = np.argmin(np.abs(f - f0))
print(f"周波数: {f[idx]:.0f} Hz")
print(f"Z_R = {Z_R[idx]:.1f} Ohm")
print(f"Z_L = {Z_L[idx]:.1f}j Ohm (|Z_L| = {np.abs(Z_L[idx]):.1f} Ohm)")
print(f"Z_C = {Z_C[idx]:.1f}j Ohm (|Z_C| = {np.abs(Z_C[idx]):.1f} Ohm)")
print(f"Z_series = {Z_series[idx]:.1f} Ohm (|Z| = {np.abs(Z_series[idx]):.1f} Ohm)")
まとめ
本記事では、インピーダンスの基礎について解説しました。
- インピーダンスは交流回路における電流の流れにくさを複素数で表したものである
- 抵抗は実数、インダクタとキャパシタは純虚数のインピーダンスを持つ
- 直列接続はインピーダンスの和、並列接続は逆数の和で計算する
- インピーダンス整合($Z_L = Z_s^*$)により最大電力伝送が実現する
- ナイキスト図(複素平面)でインピーダンスの周波数特性を可視化できる
次のステップとして、以下の記事も参考にしてください。