最適制御問題とは
最適制御問題は「時間とともに変わる操作のうち、条件を満たしながら目的をいちばん良くするもの」を探す問題です。 このページでは、問題を構成する要素を具体例で一つずつ説明し、最後に一般的な数式の形にまとめます。
普通の最適化との違い
Section titled “普通の最適化との違い”高校や大学初年級で学ぶ最適化は、たとえば を最小にする数 を求める問題です。 答えは という一つの数です。変数が何個かに増えても、探すのは有限個の数の組です。
最適制御問題で探すのは、時刻 の関数 です。たとえば「各時刻にアクセルをどれだけ踏むか」は、 時刻ごとに値がある関数です。関数は無数の値の集まりなので、探す範囲がとても広く、 しかも各時刻の操作が後の状態に影響します。今アクセルを踏みすぎると、後で強くブレーキを踏む必要が生じます。 このように時間方向につながった影響を考えながら、操作の時間変化をまるごと決めるのが最適制御です。
具体例:止まるまでの最短時間
Section titled “具体例:止まるまでの最短時間”例題02 の問題で、構成要素を見ていきます。
止まっている台車を 10 m 先まで動かし、そこでぴったり止めたい。加速度の大きさは 2 m/s² までしか出せない。 いちばん早く着くには、加速度をどう変えればよいか。
状態:システムの「今の様子」
Section titled “状態:システムの「今の様子」”その時刻のシステムの様子を表す量を状態といいます。この例では位置 と速度 です。 状態がわかれば、その後の動きを計算する出発点がそろいます。 状態をまとめてベクトル と書きます。
制御:自分で決められる入力
Section titled “制御:自分で決められる入力”時刻ごとに自由に選べる量を制御(または制御入力)といいます。この例では加速度 です。 最適制御問題で求める答えは、この制御の時間履歴 です。制御をまとめて と書きます。
運動方程式:制御から状態の変化が決まる
Section titled “運動方程式:制御から状態の変化が決まる”制御を選ぶと状態がどう変化するかを、微分方程式で表します。この例では
です( は の時間微分 )。一般には
と書きます。ロケットなら に推力・空気抵抗・重力・推進剤の消費が入ります。 最適制御では、**運動方程式は「守らなければならない条件」**として扱われます。 物理法則に反する動きは、どれだけ目的に有利でも選べません。
境界条件:始まりと終わり
Section titled “境界条件:始まりと終わり”出発時と到着時に状態が満たすべき条件を境界条件といいます。この例では
です。 は終了時刻です。この例のように終了時刻そのものが未知で、答えの一部として決まる問題も多くあります。
制約:途中で守る条件
Section titled “制約:途中で守る条件”運動の途中でずっと守らなければならない条件を経路制約(または単に制約)といいます。この例では
です。ロケットなら「推力は最大推力以下」「加速度は 8 G 以下」「高度は地表より上」などが制約になります。
目的関数:何を良くしたいか
Section titled “目的関数:何を良くしたいか”小さくしたい量を数式で表したものを目的関数(評価関数、コスト関数)といいます。この例では到着時刻そのものです。
大きくしたい量(到達高度など)は、マイナスをつけて最小化します。
この問題の答えは「前半は最大の加速度で加速し、ちょうど中間点で最大の減速に切り替える」です。 所要時間は 秒です。OpenGoddard で解くと、この答えが数値的に得られます。

直感的に予想できる答えですが、条件が少し複雑になるだけで(空気抵抗がある、燃料で質量が減る、高度によって空気の濃さが変わる) 手計算では答えが出せなくなります。そのような問題を数値計算で解くのが OpenGoddard の役割です。
目的関数の2つの形
Section titled “目的関数の2つの形”目的関数には、性質の違う2種類の項があります。
| 種類 | 形 | 意味 | 例 |
|---|---|---|---|
| 終端コスト(Mayer 型) | 終わったときの状態だけで決まる | 所要時間 、最終高度 、残った質量 | |
| 積分コスト(Lagrange 型) | 途中の経過を積み上げる | 操作量の二乗和 、燃料消費 |
両方を足した形を Bolza 型といいます。例題01 は所要時間(終端コスト)と 操作量の二乗積分(積分コスト)の和を最小にします。「早く着きたいが、急ぎすぎると操作が大きくなる」という釣り合いを取る問題です。
ここまでの要素をまとめると、OpenGoddard が扱う最適制御問題は次の形になります。
| 記号 | 名前 | 例題02では |
|---|---|---|
| 状態 | ||
| 制御 | ||
| 運動方程式の右辺 | ||
| 終端コスト | ||
| 積分コストの被積分関数 | なし() | |
| 境界条件 | ||
| 経路制約 |
経路制約は「」の形にそろえて書きます。 なら です。 OpenGoddard のコードでもこの向きで書きます(問題の書き方)。
区間に分ける
Section titled “区間に分ける”ロケットの段分離のように、途中で運動方程式や機体の性質が変わる問題があります。 このような問題は、時間を区間(phase)に分け、区間ごとに運動方程式を与えます。 区間の境目では「位置と速度はつながる」「質量は分離した段の分だけ減る」といった接続条件を課します。 OpenGoddard では区間の数を自由に増やせます(例題11)。
なぜ数値計算が必要なのか
Section titled “なぜ数値計算が必要なのか”答えは関数なので、厳密には無限個の値を決める問題です。手計算で解けるのは、 例題01〜03のように運動方程式が簡単で制約が少ない場合に限られます。 実用的な問題では、関数を有限個の数で近似して、コンピュータで解ける形に変換します。 その変換の考え方には大きく2つの流派があります。次のページで説明します。