根軌跡法(Root Locus Method)は、フィードバック制御系のゲインを変化させたときに、閉ループ極がどのように移動するかを図示する方法です。制御系の安定性やゲイン調整の指針を視覚的に得ることができます。
本記事では、根軌跡の基本概念から描画ルール、Pythonでのシミュレーションまでを解説します。
本記事の内容
- 根軌跡の基本概念
- 根軌跡の描画ルール
- 具体例による描画
- Pythonによる根軌跡プロット
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
根軌跡とは
開ループ伝達関数が
$$ L(s) = K \frac{N(s)}{D(s)} = K \frac{(s – z_1)(s – z_2) \cdots (s – z_m)}{(s – p_1)(s – p_2) \cdots (s – p_n)} $$
のとき、閉ループ特性方程式は
$$ 1 + L(s) = 0 \quad \Leftrightarrow \quad D(s) + K N(s) = 0 $$
この方程式の根(閉ループ極)が、ゲイン $K$ を $0$ から $\infty$ まで変化させたときに $s$ 平面上に描く軌跡が根軌跡です。
根軌跡の描画ルール
根軌跡を描くための基本ルールをまとめます。
ルール1: 出発点と終着点
$K = 0$ では閉ループ極は開ループ極 $p_i$ に一致し、$K \to \infty$ では開ループ零点 $z_j$ または無限遠に収束します。
- 出発点: 開ループ極($n$ 個)
- 終着点: 開ループ零点($m$ 個)+ 無限遠($n – m$ 個)
ルール2: 実軸上の根軌跡
実軸上の点が根軌跡上にあるのは、その右側にある実軸上の開ループ極と零点の合計数が奇数のときです。
ルール3: 漸近線
$n – m$ 本の漸近線が存在し、その角度と交点は
$$ \theta_k = \frac{(2k+1)\pi}{n – m}, \quad k = 0, 1, \dots, n – m – 1 $$
$$ \sigma_a = \frac{\sum p_i – \sum z_j}{n – m} $$
ルール4: 分岐点
実軸上で根軌跡が分岐する点は、次の条件を満たします。
$$ \frac{dK}{ds} = 0 \quad \text{ここで} \quad K = -\frac{D(s)}{N(s)} $$
ルール5: 虚軸との交点
根軌跡が虚軸と交わる点は、ラウス・フルヴィッツ法で臨界ゲインを求めることで得られます。
具体例
開ループ伝達関数
$$ L(s) = \frac{K}{s(s+1)(s+3)} $$
を考えます。
極: $s = 0, -1, -3$($n = 3$)、零点: なし($m = 0$)
漸近線: $n – m = 3$ 本
$$ \theta_k = \frac{(2k+1)\pi}{3} = 60°, 180°, 300° $$
$$ \sigma_a = \frac{0 + (-1) + (-3)}{3} = -\frac{4}{3} $$
実軸上の根軌跡: $(-\infty, -3]$ と $[-1, 0]$ の区間
虚軸との交点: 特性方程式 $s^3 + 4s^2 + 3s + K = 0$ にラウスの方法を適用すると、臨界ゲイン $K_{cr} = 12$ で虚軸と交わります。
Pythonでの実装
根軌跡の描画
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
# 開ループ伝達関数: L(s) = K / (s(s+1)(s+3))
L = ctrl.tf([1], [1, 4, 3, 0])
# 根軌跡
plt.figure(figsize=(10, 7))
rlist, klist = ctrl.root_locus(L, plot=False)
# 手動で描画
for i in range(rlist.shape[1]):
plt.plot(np.real(rlist[:, i]), np.imag(rlist[:, i]), 'b', linewidth=1)
# 開ループ極
poles = ctrl.poles(L)
plt.plot(np.real(poles), np.imag(poles), 'rx', markersize=12, markeredgewidth=2, label='Open-loop poles')
# 漸近線
sigma_a = -4/3
angles = [60, 180, 300]
for angle in angles:
dx = np.cos(np.radians(angle))
dy = np.sin(np.radians(angle))
plt.plot([sigma_a, sigma_a + 5*dx], [0, 5*dy],
'g--', alpha=0.5, linewidth=1)
plt.axvline(x=0, color='k', linewidth=0.5)
plt.axhline(y=0, color='k', linewidth=0.5)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Root Locus: $L(s) = K / s(s+1)(s+3)$')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim([-6, 2])
plt.ylim([-4, 4])
plt.tight_layout()
plt.show()
ゲインと閉ループ応答の関係
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
# 開ループ伝達関数
L = ctrl.tf([1], [1, 4, 3, 0])
# 異なるゲインでの閉ループ応答
gains = [1, 5, 10, 12, 15]
t = np.linspace(0, 15, 1000)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# ステップ応答
for K in gains:
G_cl = ctrl.feedback(K * L, 1)
poles_cl = ctrl.poles(G_cl)
is_stable = all(np.real(p) < 0 for p in poles_cl)
if is_stable:
t_out, y_out = ctrl.step_response(G_cl, T=t)
axes[0].plot(t_out, y_out, label=f'K={K}', linewidth=2)
axes[0].axhline(y=1.0, color='k', linestyle='--', alpha=0.3)
axes[0].set_xlabel('Time [s]')
axes[0].set_ylabel('Output y(t)')
axes[0].set_title('Step Response for Different Gains')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# 閉ループ極の軌跡
for K in gains:
G_cl = ctrl.feedback(K * L, 1)
poles_cl = ctrl.poles(G_cl)
color = 'r' if any(np.real(p) > 0 for p in poles_cl) else 'b'
axes[1].plot(np.real(poles_cl), np.imag(poles_cl), 'o',
markersize=8, color=color, label=f'K={K}')
axes[1].axvline(x=0, color='k', linewidth=0.5)
axes[1].axhline(y=0, color='k', linewidth=0.5)
axes[1].set_xlabel('Real')
axes[1].set_ylabel('Imaginary')
axes[1].set_title('Closed-loop Poles')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
ゲイン $K$ を増加させると閉ループ極が虚軸に近づき、$K = 12$ で虚軸上に、$K > 12$ で右半面に移動してシステムが不安定になることが確認できます。
まとめ
本記事では、根軌跡法の理論と描き方について解説しました。
- 根軌跡はゲイン $K$ の変化に伴う閉ループ極の軌跡を $s$ 平面上に描いたもの
- 開ループ極から出発し、開ループ零点または無限遠に終着する
- 漸近線、実軸上の軌跡、分岐点、虚軸との交点の各ルールで描画できる
- 根軌跡から安定限界ゲインや応答特性を視覚的に判断できる
次のステップとして、以下の記事も参考にしてください。