キルヒホッフの法則(Kirchhoff’s laws)は、電気回路解析の最も基本的な法則です。電流の保存(KCL)と電圧の保存(KVL)という2つの法則により、任意の回路の電流・電圧を体系的に求めることができます。
本記事の内容
- KCL(電流則)の定義と導出
- KVL(電圧則)の定義と導出
- 回路方程式の立て方
- 網目電流法
- 節点電位法
- Pythonでの連立方程式による回路解析
前提知識
この記事を読む前に、以下の知識があると理解が深まります。
- オームの法則 $V = RI$
- 線形代数の基礎(連立方程式)
キルヒホッフの電流則(KCL)
定義
KCL(Kirchhoff’s Current Law): 回路の任意の節点(ノード)に流入する電流の総和はゼロです。
$$ \boxed{\sum_{k=1}^{n} i_k = 0} $$
ここで $i_k$ は節点に流入する電流を正、流出する電流を負とします。
物理的背景
KCLは電荷保存則の直接的な帰結です。定常状態では節点に電荷が蓄積されないため、流入する電荷量と流出する電荷量は等しくなります。
例えば、3本の枝が集まる節点で $i_1$ が流入、$i_2, i_3$ が流出する場合:
$$ i_1 – i_2 – i_3 = 0 \implies i_1 = i_2 + i_3 $$
キルヒホッフの電圧則(KVL)
定義
KVL(Kirchhoff’s Voltage Law): 回路の任意の閉路(ループ)に沿った電圧降下の総和はゼロです。
$$ \boxed{\sum_{k=1}^{n} v_k = 0} $$
物理的背景
KVLはエネルギー保存則の帰結です。電荷が閉路を1周すると元の電位に戻るため、電位の上昇と降下の合計はゼロになります。
例えば、電圧源 $E$ と抵抗 $R_1, R_2$ の直列回路で:
$$ E – R_1 i – R_2 i = 0 \implies i = \frac{E}{R_1 + R_2} $$
回路方程式の例
2つのループを含む回路を考えます。電圧源 $E_1, E_2$ と抵抗 $R_1, R_2, R_3$ が接続され、$R_3$ は共有枝であるとします。
KVLをループ1($E_1$-$R_1$-$R_3$ を通る経路)に適用:
$$ E_1 – R_1 i_1 – R_3(i_1 – i_2) = 0 $$
$$ (R_1 + R_3) i_1 – R_3 i_2 = E_1 \tag{1} $$
KVLをループ2($E_2$-$R_2$-$R_3$ を通る経路)に適用:
$$ E_2 – R_2 i_2 – R_3(i_2 – i_1) = 0 $$
$$ -R_3 i_1 + (R_2 + R_3) i_2 = E_2 \tag{2} $$
網目電流法(Mesh Current Method)
網目電流法は、各独立ループに仮想的な網目電流を割り当て、KVLのみで方程式を立てる系統的な手法です。
$n$ 個の網目に対して、行列形式で:
$$ \boxed{\bm{R} \bm{i} = \bm{v}} $$
ここで $\bm{R}$ は抵抗行列、$\bm{i}$ は網目電流ベクトル、$\bm{v}$ は電圧源ベクトルです。
上の例では:
$$ \begin{pmatrix} R_1 + R_3 & -R_3 \\ -R_3 & R_2 + R_3 \end{pmatrix} \begin{pmatrix} i_1 \\ i_2 \end{pmatrix} = \begin{pmatrix} E_1 \\ E_2 \end{pmatrix} $$
抵抗行列 $\bm{R}$ は対称行列です。対角成分はそのループの全抵抗の和、非対角成分は共有枝の抵抗(符号は負)です。
節点電位法(Node Voltage Method)
節点電位法は、基準節点(グラウンド)を定め、各節点の電位を未知数としてKCLで方程式を立てます。
$$ \boxed{\bm{G} \bm{v}_n = \bm{i}_s} $$
ここで $\bm{G}$ はコンダクタンス行列、$\bm{v}_n$ は節点電位ベクトル、$\bm{i}_s$ は電流源ベクトルです。
コンダクタンス $G_k = 1/R_k$ を用いて、節点 $j$ でのKCL:
$$ \sum_{k} G_k (v_j – v_k) = i_{s,j} $$
Pythonでの実装
import numpy as np
import matplotlib.pyplot as plt
# === 網目電流法による回路解析 ===
# 回路: E1=10V, E2=5V, R1=2Ω, R2=4Ω, R3=6Ω(共有枝)
R1, R2, R3 = 2.0, 4.0, 6.0
E1, E2 = 10.0, 5.0
# 抵抗行列と電圧ベクトル
R_matrix = np.array([
[R1 + R3, -R3],
[-R3, R2 + R3]
])
v_source = np.array([E1, E2])
# 連立方程式を解く
i_mesh = np.linalg.solve(R_matrix, v_source)
print("=== 網目電流法 ===")
print(f"網目電流 i1 = {i_mesh[0]:.4f} A")
print(f"網目電流 i2 = {i_mesh[1]:.4f} A")
print(f"R3を流れる電流 = {i_mesh[0] - i_mesh[1]:.4f} A")
# === 節点電位法 ===
# 同じ回路を節点電位法で解く
# 節点A(R1とR2とR3の接続点)、グラウンド基準
# E1 -> R1 -> 節点A -> R2 -> E2、節点A -> R3 -> GND
G1, G2, G3 = 1/R1, 1/R2, 1/R3
G_matrix = np.array([[G1 + G2 + G3]])
i_source = np.array([E1*G1 + E2*G2])
v_node = np.linalg.solve(G_matrix, i_source)
print(f"\n=== 節点電位法 ===")
print(f"節点電位 Va = {v_node[0]:.4f} V")
# === より大きな回路の解析 ===
# 4ループ回路
np.random.seed(42)
n_loops = 4
R_vals = np.random.uniform(1, 10, size=(n_loops, n_loops))
R_large = np.zeros((n_loops, n_loops))
for i in range(n_loops):
R_large[i, i] = np.sum(R_vals[i, :])
for j in range(n_loops):
if i != j:
R_large[i, j] = -R_vals[i, j] * 0.3
# 対称化
R_large = (R_large + R_large.T) / 2
E_vals = np.array([12, 0, -5, 8])
i_large = np.linalg.solve(R_large, E_vals)
# 可視化
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# (a) 網目電流の結果
labels = ['Loop 1', 'Loop 2']
colors = ['steelblue', 'coral']
axes[0].bar(labels, i_mesh, color=colors, edgecolor='black')
axes[0].set_ylabel('電流 [A]')
axes[0].set_title('網目電流法の結果')
axes[0].grid(True, alpha=0.3, axis='y')
for idx, val in enumerate(i_mesh):
axes[0].text(idx, val + 0.02, f'{val:.3f} A', ha='center', fontsize=11)
# (b) 抵抗値と電流の関係(R3を変化)
R3_range = np.linspace(0.5, 20, 100)
i1_vals = []
i2_vals = []
for r3 in R3_range:
R_tmp = np.array([[R1 + r3, -r3], [-r3, R2 + r3]])
i_tmp = np.linalg.solve(R_tmp, v_source)
i1_vals.append(i_tmp[0])
i2_vals.append(i_tmp[1])
axes[1].plot(R3_range, i1_vals, 'b-', linewidth=2, label='$i_1$')
axes[1].plot(R3_range, i2_vals, 'r-', linewidth=2, label='$i_2$')
axes[1].plot(R3_range, np.array(i1_vals) - np.array(i2_vals),
'g--', linewidth=2, label='$i_1 - i_2$ (R3電流)')
axes[1].set_xlabel('$R_3$ [Ω]')
axes[1].set_ylabel('電流 [A]')
axes[1].set_title('$R_3$ を変化させたときの電流')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
# (c) 4ループ回路の結果
loop_labels = [f'Loop {i+1}' for i in range(n_loops)]
axes[2].bar(loop_labels, i_large, color='teal', edgecolor='black')
axes[2].set_ylabel('電流 [A]')
axes[2].set_title('4ループ回路の網目電流')
axes[2].grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.savefig('kirchhoff_laws.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、キルヒホッフの法則について解説しました。
- KCL: 節点に流入する電流の総和はゼロ(電荷保存則)
- KVL: 閉路の電圧降下の総和はゼロ(エネルギー保存則)
- 網目電流法: 各ループにKVLを適用し $\bm{R}\bm{i} = \bm{v}$ を解く
- 節点電位法: 各節点にKCLを適用し $\bm{G}\bm{v}_n = \bm{i}_s$ を解く
- Pythonの
numpy.linalg.solveで効率的に解ける
次のステップとして、以下の記事も参考にしてください。