PID制御について
本記事ではPID制御についてまとめます。PID制御は、自動制御でもっとも利用されている制御手法の一つです。ここでは、ブロック線図の構造や、PID制御器の中身(連続・離散)、設計法、数値シミュレーションについて触れたいと思います。最後にPID制御の関連動画や関連解説記事へのリンクを置いています。
PID制御とは
PID制御は、PID制御は自動制御を行う際に最も多く利用されている制御手法の一つであり、参照入力(目標入力)と出力の偏差の各時刻での値に基づいて制御入力を決める手法です。Pは比例、Iは積分、Dは微分の頭文字であり、フィードバック制御方式において、偏差信号に比例した値、偏差を積分した値、偏差を微分した値の3つの和を取った値を制御に用います。
まず、PID制御の歴史について知りたい場合は荒木・須田の解説記事を読まれると良いと思います。
まずは、PID制御の基本ブロック線図を示します。
$r$が目標値、$u$が入力で$y$が出力です。$e$は目標値と出力の偏差であり、小さい方が良いです。信号$e$の比例成分、微分成分、積分成分を足して制御入力を決定します。
制御目的
制御対象に入力 u を印加した結果出力 y が得られますが、この y の振る舞いは自由に決めることができません。 y の目標としては目標信号を与え、 例えばステップ上の目標値を与えてやりますと、ある一定の値に出力 y を整定させたいというのが制御目的になります。その目的の達成度を評価するために各種の過渡応答に関する指標があります。
目標信号 r と出力 y の偏差が常にゼロとなればよいですが、 必ずしもそうはならないため PID制御器をうまく調整することになります。制御原因を決定するときには3つの値を調整することになりますが、その際によく用いられる指標は以下の通りになります。
- 最大オーバーシュート
- 定常偏差
- 整定時間
- 立ち上がり時間
どのような応答波形なら実現できるかは、制御対象の特性に依存しますし、設計者のセンスにも依存します。様々な応答指標については以下の動画も併せてご覧頂ければと思います。
PID制御器の内部構造
その上で PID制御ではよく試行錯誤的にPIDのゲイン、すなわち係数を決定することになります。ここでは、PID制御器の構造について触れます。制御器の構造は以下の通りです。以降では、各構成要素について触れていきます。
$u(t) = K_P e(t) + K_D \frac{de(t)}{dt} + K_I\int_0^t e(t) dt$
比例動作
まず P 動作 比例動作ですが、比例動作は出力と目標値との偏差を考えて、その偏差に比例係数をかけたものを制御入力として用います。
$u(t) = K_P e(t)$
ボード線図は次のようになります。ゲインが周波数によらず一定値となっていることが わかります。
微分動作
次にD動作です。 D動作では偏差の変化量に比例した入力を構成します。 このためボード線図を見てやると低い周波数ではゲインが小さく、高い周波数ではゲインが大きくなります。
より変化に対して感度の高い入力を決定することになります。 そしてこのD動作とP動作を組み合わせたPD制御がよく使われます。
$u(t) = K_P e(t) + K_D \frac{de(t)}{dt}$
PD制御では、ゲインはある周波数まではフラットとなって、ある周波数以降では どんどん高い値になっていくボード線図の形状となります。このグラフの形状はPDゲインをどの値に設定するかによってシフトすることになります。
積分動作
最後にI動作です。 I動作では偏差信号を 考え、その積分値を考えます。この積分値に比例した入力を決定します。 このI動作に対してボード線図を見てやりますと、低い周波数では高いゲインとなり 高い周波数になるに従って、そのゲインが下がっていくような構成になっています。
この積分器を構成する時にはその初期値 を初期化することに注意する必要があります。 この積分器は目標信号がステップの場合には、目標信号と出力との偏差をゼロにする働きがあります。
$u(t) = K_P e(t) + K_D \frac{de(t)}{dt} + K_I\int_0^t e(t) dt$
これについては内部モデル原理の動画をご覧下さい。 そしてPID制御器を構成すると次のようなボード線図の形状となります。
積分器の初期値は通常0としますが、その設定を考えずに実装すると想定外の応答になることがありますので注意してください。
コントローラーを設計する際には、まず出力yがどのような応答になればよいかという ことを考える必要があります。その上でコントローラーの係数をどのような組み合わせにするかを考えることで、制御性能を良くしていくことになります。 出力の結果がどのような応答波形となるかは、制御対象の特性によっても依存しますし ゲインの係数によっても依存して変わってくることになります。以下で設計法について触れます。
離散時間系のPID制御
連続時間と同様に離散時間の場合もPID制御系を構成することができます。実装は、和分と差分を組み合わせて行います。
$u(k) = K_P e(k) + K_D (e(k)-e(k-1)) + K_I\sum_{i=0}^k e(i)$
基本的なPID制御器設計法
制御を実装するためには、K_P, K_D, K_Iをそれぞれ定める必要があります。パラメータ設計法は様々であり、モデルベース手法やモデルレス手法があります。ここではいくつか紹介します。
限界感度法
初期の設計方法として限界感度法が知られています。限界感度法は、比例動作のみでフィードバックを施し、ゲインを徐々に大きくした上で安定限界となった際のゲインに基づいてPID制御パラメータを決定する手法です。モデルレスの設計法ですが、高次の複雑な制御対象や不安定化すると危険な制御対象にはお勧めできません。どのような対象に有用であるかは、教科書等を含めた各種文献をご覧ください。
ステップ応答法
ステップ入力を印加したときの波形に基づいてゲインを設定する手法がステップ応答法です。制御対象をむだ時間プラス一次遅れ系として表現し、その係数に基づいてPIDゲインを定めます。どのような対象に有用であるかは、教科書等を含めた各種文献をご覧ください。
北森法によるPIDゲイン設計
北森法は、部分モデルマッチング法とも呼ばれ、PIDゲインを規範モデルに基づいて決定する手法です。モデルとなる入出力伝達関数(規範モデルの伝達関数)と、制御対象、PIDゲインの組において、PIDゲインを設定した制御系が低周波数から規範モデルに合わせこむ手法となっており、規範モデルさえ与えられていれば機械的にゲインを定めることができます。
《PID制御》第4回: PID制御方式の原理・実用化と設計法
※北森先生は2024年3月にお亡くなりになりました。ご冥福をお祈り致します。
周波数領域でのPID制御器設計
- 推定された周波数応答を使用した PID コントローラーの設計 - MATLAB & Simulink - MathWorks 日本
- Measurement of the Loop Gain Frequency Response of Digitally Controlled Power Converters | IEEE Journals & Magazine | IEEE Xplore
- 周波数特性分析器 技術解説集 - エヌエフ回路設計ブロック
VRFT, FRITによる制御器設計
制御データを用いて直接的に制御器設計を行う手法として、IFTやVRFT、FRITなどが知られています。PID制御器設計においても、これらの制御データに基づく手法が多く研究されています。
- 閉ループデータに基づく直接的PID調整とその不安定プロセス制御への適用
- Pythonによるデータ駆動制御VRFTによるPID制御器オートチューニング #データサイエンス - Qiita
- 制御性能評価を用いたオンライン型FRITに基づくフィードフォワードコントローラの調整法
非反証制御による設計
GKYPによる設計
周波数応答に基づいて設計を行う場合、一つのアプローチとしてGKYPが挙げられます。GKYPは一般化KYP補題であり、周波数帯域ごとに制約を与えて設計することが可能です。PID制御は、係数を決める問題ですので、GKYPとの親和性が高いです。GKYPに基づいた設計法については、以下の解説記事を参照ください。
一般化KYP補題に基づくPID制御器の設計(<特集>PID制御のパラメータチューニング)
MATLAB(PID調整器)
MATLABのPID調整アプリについては以下の記事をご覧ください。
PID コントローラーの調整 - MATLAB - MathWorks 日本
PID制御シミュレーション
Pythonのコードは以下の通りです。制御対象を2次遅れ系とし、PID制御を行っています。Google Colaboratoryにそのまま貼り付けて実行すれば応答を出すことができます。
インストール
!pip install control numpy matplotlib
Python Code
import numpy as np
import matplotlib.pyplot as plt
import control.matlab as control_matlab # control.matlab を使用して伝達関数を扱います
# Define the transfer function
# Example: A simple mass-spring-damper system transfer function from force (u) to position (x)
# G(s) = 1 / (m*s^2 + c*s + k)
m = 1.0 # mass
c = 0.5 # damping coefficient
k = 2.0 # spring constant
# Numerator and denominator coefficients of the transfer function
num = [1]
den = [m, c, k]
system_tf = control_matlab.tf(num, den)
print("Open-loop transfer function:")
print(system_tf)
# Design a controller (e.g., a simple proportional controller)
# Let's design a PID controller for better performance
Kp = 10.0 # Proportional gain
Ki = 1.0 # Integral gain
Kd = 2.0 # Derivative gain
# PID controller transfer function: C(s) = Kp + Ki/s + Kd*s = (Kp*s + Ki + Kd*s^2) / s
num_c = [Kd, Kp, Ki]
den_c = [1, 0] # s
controller_tf = control_matlab.tf(num_c, den_c)
print("\nController transfer function:")
print(controller_tf)
# Connect the system and controller in a closed-loop configuration
# Assume a unity feedback system: Y(s) / R(s) = C(s) * G(s) / (1 + C(s) * G(s))
closed_loop_system_tf = control_matlab.feedback(controller_tf * system_tf, 1)
print("\nClosed-loop transfer function:")
print(closed_loop_system_tf)
# Simulate the system response to a step input
# Time vector for simulation
t = np.linspace(0, 30, 1000) # 時間軸を30秒まで伸ばす
# Simulate the step response
yout, T = control_matlab.step(closed_loop_system_tf, t)
# Generate response plots
plt.figure()
plt.plot(T, yout)
plt.xlabel('Time')
plt.ylabel('Output (Position)')
plt.title('Closed-Loop System Step Response (Transfer Function)')
plt.grid(True)
plt.show()
PID制御の関連動画
PID制御(2万視聴)
PID制御シミュレーション(MATLAB)
関連記事(blog.control-theory.com)
- PID制御の基本理論と設計法(日本語ハブ記事) — PID制御の理論、設計法、応用を網羅した総合記事
- MEC + PID Control(英語) — PID制御にモデル誤差抑制補償器を併用してロバスト性を向上
- モデル誤差抑制補償器(MEC)の実装ガイド — 既存のPID制御系にアドオンでロバスト性を付加する手法
- State Feedback Control and State-Space Design(英語) — PIDから状態フィードバックへの発展
- System Identification: From Data to Dynamical Models(英語) — PID設計に必要なモデル取得
関連Qiita記事
- モデル誤差抑制補償器 — PID制御にMECを併用してロバスト化する事例
- 外乱オブザーバとモデル誤差抑制補償器の違い|構造比較と使い分けガイド — DOBとMECの使い分け
- 線形行列不等式(LMI)を用いた制御器の設計 — LMIによる制御器設計






