26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PID制御の基本理論と設計法:幅広く使われるPID制御

26
Last updated at Posted at 2025-08-18

PID制御について

本記事ではPID制御についてまとめます。PID制御は、自動制御でもっとも利用されている制御手法の一つです。ここでは、ブロック線図の構造や、PID制御器の中身(連続・離散)、設計法、数値シミュレーションについて触れたいと思います。最後にPID制御の関連動画や関連解説記事へのリンクを置いています。

20250815122401.jpg

PID制御とは

PID制御は、PID制御は自動制御を行う際に最も多く利用されている制御手法の一つであり、参照入力(目標入力)と出力の偏差の各時刻での値に基づいて制御入力を決める手法です。Pは比例、Iは積分、Dは微分の頭文字であり、フィードバック制御方式において、偏差信号に比例した値、偏差を積分した値、偏差を微分した値の3つの和を取った値を制御に用います。

まず、PID制御の歴史について知りたい場合は荒木・須田の解説記事を読まれると良いと思います。

まずは、PID制御の基本ブロック線図を示します。

20240303134757.jpg

$r$が目標値、$u$が入力で$y$が出力です。$e$は目標値と出力の偏差であり、小さい方が良いです。信号$e$の比例成分、微分成分、積分成分を足して制御入力を決定します。

制御目的

制御対象に入力 u を印加した結果出力 y が得られますが、この y の振る舞いは自由に決めることができません。 y の目標としては目標信号を与え、 例えばステップ上の目標値を与えてやりますと、ある一定の値に出力 y を整定させたいというのが制御目的になります。その目的の達成度を評価するために各種の過渡応答に関する指標があります。

目標信号 r と出力 y の偏差が常にゼロとなればよいですが、 必ずしもそうはならないため PID制御器をうまく調整することになります。制御原因を決定するときには3つの値を調整することになりますが、その際によく用いられる指標は以下の通りになります。

  • 最大オーバーシュート
  • 定常偏差
  • 整定時間
  • 立ち上がり時間

どのような応答波形なら実現できるかは、制御対象の特性に依存しますし、設計者のセンスにも依存します。様々な応答指標については以下の動画も併せてご覧頂ければと思います。

制御工学基礎 part 1 (過渡応答)

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)$

ボード線図は次のようになります。ゲインが周波数によらず一定値となっていることが わかります。

20240303134824.jpg

微分動作

次にD動作です。 D動作では偏差の変化量に比例した入力を構成します。 このためボード線図を見てやると低い周波数ではゲインが小さく、高い周波数ではゲインが大きくなります。

20240303135051.jpg

より変化に対して感度の高い入力を決定することになります。 そしてこのD動作とP動作を組み合わせたPD制御がよく使われます。

$u(t) = K_P e(t) + K_D \frac{de(t)}{dt}$

PD制御では、ゲインはある周波数まではフラットとなって、ある周波数以降では どんどん高い値になっていくボード線図の形状となります。このグラフの形状はPDゲインをどの値に設定するかによってシフトすることになります。

20240303135124.jpg

積分動作

最後にI動作です。 I動作では偏差信号を 考え、その積分値を考えます。この積分値に比例した入力を決定します。 このI動作に対してボード線図を見てやりますと、低い周波数では高いゲインとなり 高い周波数になるに従って、そのゲインが下がっていくような構成になっています。

20240303135212.jpg

この積分器を構成する時にはその初期値 を初期化することに注意する必要があります。 この積分器は目標信号がステップの場合には、目標信号と出力との偏差をゼロにする働きがあります。

$u(t) = K_P e(t) + K_D \frac{de(t)}{dt} + K_I\int_0^t e(t) dt$

これについては内部モデル原理の動画をご覧下さい。 そしてPID制御器を構成すると次のようなボード線図の形状となります。

20240303140349.jpg

積分器の初期値は通常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制御器設計

VRFT, FRITによる制御器設計

制御データを用いて直接的に制御器設計を行う手法として、IFTやVRFT、FRITなどが知られています。PID制御器設計においても、これらの制御データに基づく手法が多く研究されています。

非反証制御による設計

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)

関連Qiita記事

動画ポータル・研究者ページ

26
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?