---
title: 発展：最適制御とMPC
url: https://doc.liz6.com/ja/theory/02-control-theory/11-optimal-and-predictive-control
locale: ja
area: theory
tags:
- 制御理論
- 基礎理論
date: 2026-09-10
modified: 2026-09-10
description: 極配置は望む動特性を指定しますが、偏差と操作のコストまでは決めません。最適制御はその取捨選択を目的関数にし、MPCは有限の未来と制約を毎回の決定に組み込みます。状態フィードバック、ディジタル制御、二次関数が前提です。
---

# 発展：最適制御とMPC

極配置は望む動特性を指定しますが、偏差と操作のコストまでは決めません。最適制御はその取捨選択を目的関数にし、MPCは有限の未来と制約を毎回の決定に組み込みます。[状態フィードバック](10-state-feedback-and-observers.md)、[ディジタル制御](07-sampling-and-delay.md)、二次関数が前提です。

## LQR：目的を定義する

連続系$\dot x=Ax+Bu$に対し、

$$J=\int_0^\infty(x^\mathsf TQx+u^\mathsf TRu)dt,\qquad Q\succeq0,\ R\succ0$$

を最小化します。$Q$は状態偏差、$R$は操作への重みです。mをcmに変えて重みを変えなければ、物理的な好みも変わります。許容偏差や操作量を正規化尺度にできます。

可安定性と可検出性の標準条件下で、安定化Riccati解$X$は

$$A^\mathsf TX+XA-XBR^{-1}B^\mathsf TX+Q=0$$

を満たし、$u=-Kx$、$K=R^{-1}B^\mathsf TX$です。$X$はコスト行列で、状態ではありません。基本LQRには操作量の硬い制約がなく、後からクリップすると最適性と保証が変わります。

## 手計算できる例

$\dot x=u$、$Q=q>0$、$R=\rho>0$では$-X^2/\rho+q=0$なので、安定化解は

$$X=\sqrt{q\rho},\qquad u=-\sqrt{q/\rho}\,x.$$

$q=\rho=1$なら$x=e^{-t}x_0$です。$\rho=4$にするとゲインは0.5になり、収束が遅くなります。$x_0=2$で各最適コストは4と8ですが、目的関数が違うので、その数値だけで優劣は決まりません。

## MPC：系列を計算し、最初だけ実行する

離散モデル$x_{k+1}=Ax_k+Bu_k$で、毎回

$$\min_{u_{0:N-1}}\sum_{i=0}^{N-1}(x_i^\mathsf TQx_i+u_i^\mathsf TRu_i)+V_f(x_N)$$

を解きます。$x_0=\hat x_k$、モデル、状態制約$x_i\in\mathcal X$、入力制約$u_i\in\mathcal U$、必要なら終端制約を課します。最初の操作だけ実行し、次に測定・推定して再最適化します。

外乱やモデル誤差によるずれを新しい情報で修正でき、既知の将来目標も利用できます。予測軌道と実現軌道を区別します。[do-mpcの原理説明](https://www.do-mpc.com/en/latest/theory_mpc.html)は有限時域、推定、制約をまとめています。

## 有限候補で仕組みを見る

無次元モデル$x_{k+1}=x_k+u_k$、$x_0=2.5$、目標0、操作候補$\{-1,-0.5,0,0.5,1\}$を使います。実験のコストは

$$J_N=\sum_{i=0}^{N-1}\left(x_{i+1}^2+\rho u_i^2\right)$$

で、追加の終端項はありません。前節の記法とは異なり、操作後の状態を評価します。全$5^N$系列を探索し、有限集合内の大域的最適解を得ます。一般の連続入力MPCの最適解とは区別します。

**発展：最適制御とMPC · 実験**

x(k+1)=x(k)+u(k)、x0=2.5、候補0、±0.5、±1、コストΣ[x(i+1)²+ρu(i)²]です。5^N候補を探索し最初の操作だけ実行します。破線は外乱を知らない最初の予測です。


予測長と操作重みを変え、最初の予測、実際の軌道、操作を比較します。3回目の操作後に+1外乱を加えられますが、事前には予測に含めません。同コストなら最初の操作の絶対値が小さいもの、さらに同じなら列挙順を優先します。

$N=1,\rho=1,x=2.5$で、$u=-1$のコストは$1.5^2+1=3.25$、$u=-0.5$は$2^2+0.25=4.25$なので−1を選びます。連続入力を$[-1,1]$に制限するなら、停留点$u=-x/(1+\rho)$を区間へ射影します。有限候補なら近傍候補も比較します。

## 可行性と安定性は別に確認する

現在解があっても、外乱後の次回に解があるとは限りません。これが再帰的可行性です。有限時域で最適でも、無限時間の収束は自動保証されません。適切な終端コスト、終端集合、局所制御則などを用いますが、必要条件は対象に依存します。

予測を長くすると遠くまで見られますが計算量が増えます。期限を超えれば制御に遅れが加わります。タイムアウトや解なしの場合の代替操作、制約の優先順位、推定誤差、モデル更新を定義します。ソフト制約には許容違反量と罰則を明示し、硬い限界を無断で緩めません。

## 理解を確かめる

LQRの操作をクリップしても元の問題の最適解ですか。

<details><summary>考え方</summary>

閉ループが変わるため、そうとは言えません。飽和を分析するか制約付き問題として解き、安定性と可行性を再確認します。

</details>

一度計算した系列をずっと実行しないのはなぜですか。

<details><summary>考え方</summary>

外乱、モデル誤差、推定更新で状態が予測からずれるためです。新しい情報で再最適化しますが、計算遅延も実装に含めます。

</details>

## 再現と次の学習

[python-controlの`lqr`](https://python-control.readthedocs.io/en/stable/generated/control.lqr.html)はゲイン、Riccati解、閉ループ固有値を返します。SciPy経路で標量例を確認します。

```python
import control as ct
K, X, poles = ct.lqr([[0.0]], [[1.0]], [[1.0]], [[4.0]], method="scipy")
print(K, X, poles)
# [[0.5]] [[2.0]] [-0.5]
```

次は、モデルを改善するシステム同定、保証範囲を広げる非線形・ロバスト制御、雑音を扱う確率的推定へ進めます。[学習ルート](index.md)に戻り、目的に合わせて選んでください。
