1次遅れ系の応答特性

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$ で定常値にほぼ到達

次のステップとして、以下の記事も参考にしてください。