本節では、Python制御ライブラリ(control
, scipy
)を用いた
基本的な制御系設計・解析手法を学びます。
MATLABと類似の操作性を持ち、古典〜状態空間まで幅広く対応できます。
import control
import matplotlib.pyplot as plt
# G(s) = 1 / (s^2 + 2s + 1)
num = [1]
den = [1, 2, 1]
G = control.tf(num, den)
# ステップ応答
t, y = control.step_response(G)
plt.plot(t, y)
plt.title("Step Response")
plt.grid()
plt.show()
Pythonでは control.ss()
関数を使って状態空間表現(State-Space)を構成できます。
import control
# モデル定義
A = [[0, 1],
[-1, -2]]
B = [[0],
[1]]
C = [[1, 0]]
D = [[0]]
sys_ss = control.ss(A, B, C, D)
# 固有値(極)の取得
poles = control.pole(sys_ss)
print("Poles:", poles)
• control.ss(A, B, C, D):状態空間システムを定義
• control.pole(sys_ss):固有値を算出 → 安定性を確認
制御系では、負帰還構造を用いて出力の安定化や誤差低減を実現します。
Pythonでは control.feedback()
を使って簡単に閉ループ系を構成できます。
対象プラント:
\[G(s) = \frac{1}{s^2 + 2s + 1}\]制御器: $K=2$ の比例制御とする。
import control
import matplotlib.pyplot as plt
# プラント(伝達関数)
G = control.tf([1], [1, 2, 1])
K = 2.0 # 比例ゲイン
# 負帰還系(閉ループ系)の構築
G_cl = control.feedback(K * G, 1)
# ステップ応答のプロット
t, y = control.step_response(G_cl)
plt.plot(t, y)
plt.title("Closed-loop Step Response")
plt.xlabel("Time [s]")
plt.ylabel("Output")
plt.grid()
plt.show()
周波数領域の特性は、制御系の安定性やロバスト性を評価する上で極めて重要です。
Pythonでは control.bode()
関数でボード線図(振幅・位相)を描画できます。
これらを対数スケールで描くことで、フィルタ特性・位相遅れ・安定余裕が視覚的に把握できます。
import control
import matplotlib.pyplot as plt
# 伝達関数 G(s)
G = control.tf([1], [1, 2, 1])
# Bodeプロット(dB表記、Hzスケール)
mag, phase, omega = control.bode(G, dB=True, Hz=True)
plt.show()
control.margin()
を使えば、以下の情報を数値として取得できます:
ゲイン交差周波数(Gain crossover frequency): | G(jω) | = 1(0dB)となる周波数 |
import control
G = control.tf([1], [1, 2, 1])
gm, pm, wg, wp = control.margin(G)
print(f"Gain Margin : {gm:.2f}")
print(f"Phase Margin : {pm:.2f} deg")
print(f"Gain Crossover Freq : {wg:.2f} rad/s")
print(f"Phase Crossover Freq: {wp:.2f} rad/s")
この情報をもとに、安定性の余裕と応答のロバスト性を評価できます。
制御系の設計では、ゲイン余裕(GM)や位相余裕(PM)をある程度確保しておくことで、
モデル誤差・ノイズ・遅延などに対してロバストな安定性が得られます。
指標 | 推奨範囲 | 説明 |
---|---|---|
ゲイン余裕 (GM) | ≧ 6 dB | ゲインが6 dB増加しても不安定化しない |
位相余裕 (PM) | ≧ 30〜45 度 | 遅延や近似誤差に対する余裕がある |
クロス周波数 | 数 Hz〜数 kHz | 応答速度の指標(高すぎるとノイズに弱い) |
⚠️ 注意:高い応答性(速さ)を求めすぎると、位相余裕が不足して振動や発散を引き起こすことがあります。
機能 | Python関数 |
---|---|
Bode線図の描画 | control.bode(sys) |
安定余裕の数値取得 | gm, pm, wg, wp = control.margin(sys) |
ゲイン交差周波数の取得 | wg |
位相交差周波数の取得 | wp |
安定余裕は、制御対象が未知成分を含む場合や制御器設計の初期検証段階で特に重要です。
02_simulation_setup.md
参照