1次遅れ系は、制御工学で最も基本的なシステムです。RC回路やタンクの液面制御など多くの物理系が1次遅れで近似でき、伝達関数 $G(s) = \frac{K}{Ts + 1}$ というシンプルな形で表されます。
本記事では、1次遅れ系の伝達関数の意味、ステップ応答とランプ応答の解析的な導出、Pythonによる可視化までを解説します。
本記事の内容
- 1次遅れ系の伝達関数とパラメータの意味
- ステップ応答の導出と時定数 $T$ の幾何学的意味
- ランプ応答と定常偏差
- Pythonでの可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
1次遅れ系の伝達関数
1次遅れ系の標準形は
$$ \begin{equation} G(s) = \frac{K}{Ts + 1} \end{equation} $$
ここで
- $K$ : 定常ゲイン(直流ゲイン)– 入力が一定のとき、十分時間が経った後の出力と入力の比
- $T$ : 時定数 [s] — 応答の速さを決めるパラメータ
極の位置
分母 $Ts + 1 = 0$ より
$$ s = -\frac{1}{T} $$
時定数 $T > 0$ のとき極は負の実軸上にあり、システムは常に安定です。$T$ が小さいほど極は原点から遠くなり、応答が速くなります。
ステップ応答の導出
単位ステップ入力 $u(t) = 1 \ (t \geq 0)$ を加えます。ラプラス変換すると $U(s) = \frac{1}{s}$ です。
出力のラプラス変換は
$$ Y(s) = G(s) U(s) = \frac{K}{Ts + 1} \cdot \frac{1}{s} = \frac{K}{s(Ts + 1)} $$
部分分数展開を行います。
$$ \frac{K}{s(Ts + 1)} = \frac{A}{s} + \frac{B}{Ts + 1} $$
通分して
$$ K = A(Ts + 1) + Bs $$
$s = 0$ を代入: $K = A$
$s = -\frac{1}{T}$ を代入: $K = B \left(-\frac{1}{T}\right)$ より $B = -KT$
したがって
$$ Y(s) = \frac{K}{s} – \frac{KT}{Ts + 1} = \frac{K}{s} – \frac{K}{s + \frac{1}{T}} $$
逆ラプラス変換すると
$$ \begin{equation} y(t) = K \left(1 – e^{-t/T}\right) \quad (t \geq 0) \end{equation} $$
時定数 $T$ の幾何学的意味
ステップ応答 $y(t) = K(1 – e^{-t/T})$ における時定数 $T$ には次の意味があります。
1. 定常値の 63.2% に達する時間
$$ y(T) = K(1 – e^{-1}) = K \times 0.632 $$
2. 初期傾斜の延長が定常値に達する時間
$t = 0$ での傾きは
$$ \left.\frac{dy}{dt}\right|_{t=0} = \frac{K}{T} e^{-0/T} = \frac{K}{T} $$
この傾きの直線 $y = \frac{K}{T} t$ が定常値 $K$ に達するのは $t = T$ です。
3. 主な到達時間
| 時間 | 到達率 |
|---|---|
| $t = T$ | 63.2% |
| $t = 2T$ | 86.5% |
| $t = 3T$ | 95.0% |
| $t = 4T$ | 98.2% |
| $t = 5T$ | 99.3% |
実用上、$t = 4T \sim 5T$ でほぼ定常値に達したとみなせます。
ランプ応答
ランプ入力 $u(t) = t \ (t \geq 0)$ に対する応答を求めます。$U(s) = \frac{1}{s^2}$ です。
$$ Y(s) = \frac{K}{Ts + 1} \cdot \frac{1}{s^2} = \frac{K}{s^2(Ts + 1)} $$
部分分数展開すると
$$ \frac{K}{s^2(Ts + 1)} = \frac{A}{s} + \frac{B}{s^2} + \frac{C}{Ts + 1} $$
通分して係数比較すると $A = -KT$, $B = K$, $C = KT^2$ が得られます。
$$ Y(s) = \frac{-KT}{s} + \frac{K}{s^2} + \frac{KT^2}{Ts + 1} $$
逆ラプラス変換すると
$$ \begin{equation} y(t) = K\left(t – T + Te^{-t/T}\right) \quad (t \geq 0) \end{equation} $$
十分時間が経つと $e^{-t/T} \to 0$ となり
$$ y(t) \approx K(t – T) = Kt – KT $$
入力 $u(t) = t$ と比べると、出力は時間 $T$ だけ遅れ、定常偏差 $KT$ が残ります。$K = 1$ の場合、定常偏差は時定数 $T$ に等しくなります。
Pythonでの実装
ステップ応答と時定数の影響
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
# 異なる時定数でのステップ応答
K = 1.0
taus = [0.2, 0.5, 1.0, 2.0, 5.0]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
t = np.linspace(0, 15, 500)
for T in taus:
G = ctrl.tf([K], [T, 1])
t_out, y_out = ctrl.step_response(G, T=t)
ax1.plot(t_out, y_out, linewidth=2, label=f'T={T}')
# 63.2%到達点をマーク
ax1.plot(T, K * 0.632, 'o', markersize=6, color='black')
ax1.axhline(y=K, color='k', linestyle='--', alpha=0.3, label=f'Steady state = {K}')
ax1.set_xlabel('Time [s]')
ax1.set_ylabel('Output y(t)')
ax1.set_title('Step Response: Effect of Time Constant T')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 時定数の幾何学的意味
T = 1.0
t_detail = np.linspace(0, 6, 500)
y_step = K * (1 - np.exp(-t_detail / T))
ax2.plot(t_detail, y_step, 'b', linewidth=2, label='$y(t) = K(1 - e^{-t/T})$')
ax2.axhline(y=K, color='k', linestyle='--', alpha=0.3)
# 初期傾斜の延長線
t_tangent = np.linspace(0, T * 1.3, 100)
y_tangent = (K / T) * t_tangent
ax2.plot(t_tangent, y_tangent, 'r--', linewidth=1.5, label='Initial slope')
# 63.2%のマーク
ax2.plot(T, K * 0.632, 'ro', markersize=8, zorder=5)
ax2.annotate(f't=T={T}, y=0.632K', xy=(T, K * 0.632),
xytext=(T + 0.5, K * 0.4), fontsize=10,
arrowprops=dict(arrowstyle='->', color='red'))
ax2.axvline(x=T, color='gray', linestyle=':', alpha=0.5)
ax2.set_xlabel('Time [s]')
ax2.set_ylabel('Output y(t)')
ax2.set_title(f'Geometric Meaning of Time Constant (T={T})')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
定常ゲインの影響とランプ応答
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
# 定常ゲインの影響
T = 1.0
gains = [0.5, 1.0, 2.0, 3.0]
t = np.linspace(0, 8, 500)
for K in gains:
G = ctrl.tf([K], [T, 1])
t_out, y_out = ctrl.step_response(G, T=t)
ax1.plot(t_out, y_out, linewidth=2, label=f'K={K}')
ax1.set_xlabel('Time [s]')
ax1.set_ylabel('Output y(t)')
ax1.set_title(f'Step Response: Effect of DC Gain K (T={T})')
ax1.legend()
ax1.grid(True, alpha=0.3)
# ランプ応答
K = 1.0
taus_ramp = [0.5, 1.0, 2.0]
t_ramp = np.linspace(0, 10, 500)
ax2.plot(t_ramp, t_ramp, 'k--', linewidth=1.5, label='Input: u(t) = t')
for T in taus_ramp:
G = ctrl.tf([K], [T, 1])
# ランプ入力 = 積分器 * ステップ
G_ramp = G * ctrl.tf([1], [1, 0])
t_out, y_out = ctrl.step_response(G_ramp, T=t_ramp)
ax2.plot(t_out, y_out, linewidth=2, label=f'T={T} (error={K*T:.1f})')
ax2.set_xlabel('Time [s]')
ax2.set_ylabel('Output y(t)')
ax2.set_title('Ramp Response: Steady-State Error = KT')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
ランプ応答では、時定数 $T$ が大きいほど定常偏差が大きくなることが確認できます。
まとめ
本記事では、1次遅れ系の応答特性について解説しました。
- 1次遅れ系の伝達関数は $G(s) = \frac{K}{Ts+1}$ で、$K$ は定常ゲイン、$T$ は時定数
- ステップ応答は $y(t) = K(1 – e^{-t/T})$ で、$t = T$ で定常値の 63.2% に到達
- ランプ応答では定常偏差 $KT$ が残る
- 時定数 $T$ が小さいほど応答が速く、$4T \sim 5T$ で定常値にほぼ到達
次のステップとして、以下の記事も参考にしてください。