PID制御の基礎
誤差の「今・積み重ね・変化」を微積分で読み取り、目標値へ滑らかに近づける制御工学の数学
- 1
- PID制御は、目標値と現在値の差である「誤差 」に対し、比例(P: 今の誤差の大きさ)、積分(I: 誤差の蓄積)、微分(D: 誤差の変化速度)の3つの働きを組み合わせて制御量を決める手法
- 2
- 比例だけの制御では目標値に到達しきらない定常偏差が残り、積分項がこれを解消する。一方、微分項は急激な変化を予測して抑え、行き過ぎ(オーバーシュート)や振動を抑制する
- 3
- エアコンの温度調整、自動車のクルーズコントロール、ドローンの姿勢制御など、現代のあらゆるフィードバック制御システムの土台になっている最も基本的な制御アルゴリズム
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
PID制御は、目標値と現在値の差である「誤差 $e(t)$」に対し、比例(P: 今の誤差の大きさ)、積分(I: 誤差の蓄積)、微分(D: 誤差の変化速度)の3つの働きを組み合わせて制御量を決める手法
身につく武器・思考力
比例だけの制御では目標値に到達しきらない定常偏差が残り、積分項がこれを解消する。一方、微分項は急激な変化を予測して抑え、行き過ぎ(オーバーシュート)や振動を抑制する
実社会・ITでの活躍現場
- •組み込み制御システムにおける離散時間PIDコントローラの実装
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
Kp(比例)・Ki(積分)・Kd(微分)の3つのゲインをスライダーで調整し、「シミュレーション実行」ボタンを押してみよう。目標値(点線)に対する系の応答曲線(実線)が時間とともにどう変化するかがグラフに描かれる。Kpを大きくしすぎると振動が起き、Kiを入れると徐々にずれが解消され、Kdを入れると行き過ぎが滑らかに抑えられる様子を観察できる。
— Kpを上げすぎると振動し、Kiが定常偏差を消し、Kdが行き過ぎを滑らかに抑えます。
↑ このシミュレーションは簡易的な質点モデル(制御入力を加速度とみなし、摩擦による減衰を加えたもの)です。実際の温度制御やモーター制御でも、誤差の比例・積分・微分という同じ3つの働きの組み合わせで応答特性を調整します。
PID制御において、目標値に近づいた際の「オーバーシュート(行き過ぎて振動する現象)」を抑えるために最も直接的に働く項はどれか?
Layer 2 — 定義・受験・証明
定義
目標値 (目標温度・目標位置など)と実際の出力 の差を誤差 とする。PID制御は、この誤差から次式で制御入力 を決定する。
第1項(比例項)は現在の誤差の大きさに比例した修正、第2項(積分項)は過去からの誤差の累積に比例した修正、第3項(微分項)は誤差の瞬間的な変化率(傾き)に比例した修正を表す。デジタル実装では微分・積分を離散化し、時刻ステップ ごとに次のように近似計算する。
公式・数理モデル
証明・導出
各項の役割を微積分の観点から導出する:
【比例項が定常偏差を残す理由】 比例制御のみ()で単純な一次遅れ系 を制御する場合、定常状態()では となり、 をどれだけ大きくしても には理論上到達しない( の極限でのみ一致)。この残差 が「定常偏差」である。
【積分項が定常偏差を解消する理由】 積分項を加えると、定常状態では制御入力 自身が一定値に収束するために誤差の積分 が有界であり続ける必要がある。誤差 が恒常的に正または負のままだと積分は無限に発散してしまうため、定常状態では必然的に となる(積分の発散を防ぐ唯一の解が誤差ゼロ)。これにより定常偏差が理論上完全に解消される。
【微分項がオーバーシュートを抑える理由】 誤差の時間微分 は、誤差が今後どちらの方向にどれだけ速く変化しようとしているかを表す「予測」情報である。目標値に近づく速度が速い( が大きく負)局面では、微分項 が制御入力を早めに減速させるブレーキとして働き、慣性で目標値を通り過ぎてしまう現象(オーバーシュート)と、それに続く振動を抑制する。これはテイラー展開による1次近似 を用いて未来の誤差を先読みして補正していると解釈できる。
押さえておきたいポイント
- P単独では定常偏差が残り、PIで偏差は解消するが振動しやすくなり、PID(P+I+D)で追従性と安定性のバランスが取れる
- 積分項の使いすぎは「積分ワインドアップ(integral windup)」と呼ばれる過剰な蓄積による大きなオーバーシュートを招くため、実装では積分項に上限値(アンチワインドアップ処理)を設けるのが一般的
- 各ゲイン の調整法として、Ziegler–Nichols法などの経験的チューニング手法が古くから使われている
- PID制御はエアコン、サーモスタット、自動車のクルーズコントロール、産業用ロボットアーム、ドローンの姿勢安定化など、現代のフィードバック制御システム全般の基礎になっている
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
組み込み制御システムにおける離散時間PIDコントローラの実装
センサーから読み取った現在値と目標値の誤差をもとに、離散時間で比例・積分・微分の3項を計算し、モーターやヒーターなどのアクチュエータへの制御入力を決定する、組み込みシステムで広く使われるPIDコントローラのTypeScript実装。
1class PIDController {2 private integral = 0;3 private prevError = 0;45 constructor(6 private kp: number,7 private ki: number,8 private kd: number,9 private dt: number // 制御周期(秒)10 ) {}1112 // 現在の目標値と実測値から制御入力を計算13 update(setpoint: number, measured: number): number {14 const error = setpoint - measured;1516 this.integral += error * this.dt; // 積分項: 誤差の累積17 const derivative = (error - this.prevError) / this.dt; // 微分項: 誤差の変化率1819 const output =20 this.kp * error + this.ki * this.integral + this.kd * derivative;2122 this.prevError = error;23 return output;24 }25}2627// 例: 目標温度 25°C に向けたヒーター制御シミュレーション28const pid = new PIDController(2.0, 0.5, 0.8, 0.1);29let temperature = 18; // 現在温度30const target = 25;3132for (let step = 0; step < 50; step++) {33 const controlSignal = pid.update(target, temperature);34 // 簡易的な一次遅れ系として温度を更新(実際はセンサー値を読み取る)35 temperature += controlSignal * 0.05;36 if (step % 10 === 0) {37 console.log(`ステップ ${step}: 温度 = ${temperature.toFixed(2)}°C`);38 }39}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元