コンテンツにスキップ

最適制御問題とは

最適制御問題は「時間とともに変わる操作のうち、条件を満たしながら目的をいちばん良くするもの」を探す問題です。 このページでは、問題を構成する要素を具体例で一つずつ説明し、最後に一般的な数式の形にまとめます。

高校や大学初年級で学ぶ最適化は、たとえば f(x)=(x−1)2f(x) = (x-1)^2 を最小にする数 xx を求める問題です。 答えは x=1x = 1 という一つの数です。変数が何個かに増えても、探すのは有限個の数の組です。

最適制御問題で探すのは、時刻 tt の関数 u(t)u(t) です。たとえば「各時刻にアクセルをどれだけ踏むか」は、 時刻ごとに値がある関数です。関数は無数の値の集まりなので、探す範囲がとても広く、 しかも各時刻の操作が後の状態に影響します。今アクセルを踏みすぎると、後で強くブレーキを踏む必要が生じます。 このように時間方向につながった影響を考えながら、操作の時間変化をまるごと決めるのが最適制御です。

具体例:止まるまでの最短時間

Section titled “具体例:止まるまでの最短時間”

例題02 の問題で、構成要素を見ていきます。

止まっている台車を 10 m 先まで動かし、そこでぴったり止めたい。加速度の大きさは 2 m/s² までしか出せない。 いちばん早く着くには、加速度をどう変えればよいか。

状態:システムの「今の様子」

Section titled “状態:システムの「今の様子」”

その時刻のシステムの様子を表す量を状態といいます。この例では位置 xx と速度 vv です。 状態がわかれば、その後の動きを計算する出発点がそろいます。 状態をまとめてベクトル x(t)\boldsymbol{x}(t) と書きます。

時刻ごとに自由に選べる量を制御(または制御入力)といいます。この例では加速度 aa です。 最適制御問題で求める答えは、この制御の時間履歴 a(t)a(t) です。制御をまとめて u(t)\boldsymbol{u}(t) と書きます。

運動方程式:制御から状態の変化が決まる

Section titled “運動方程式:制御から状態の変化が決まる”

制御を選ぶと状態がどう変化するかを、微分方程式で表します。この例では

x˙=v,v˙=a\dot{x} = v, \qquad \dot{v} = a

です(x˙\dot{x} は xx の時間微分 dx/dtdx/dt)。一般には

x˙(t)=f(x(t),u(t),t)\dot{\boldsymbol{x}}(t) = \boldsymbol{f}\bigl(\boldsymbol{x}(t), \boldsymbol{u}(t), t\bigr)

と書きます。ロケットなら f\boldsymbol{f} に推力・空気抵抗・重力・推進剤の消費が入ります。 最適制御では、**運動方程式は「守らなければならない条件」**として扱われます。 物理法則に反する動きは、どれだけ目的に有利でも選べません。

出発時と到着時に状態が満たすべき条件を境界条件といいます。この例では

x(0)=0,v(0)=0,x(tf)=10,v(tf)=0x(0) = 0,\quad v(0) = 0,\qquad x(t_f) = 10,\quad v(t_f) = 0

です。tft_f は終了時刻です。この例のように終了時刻そのものが未知で、答えの一部として決まる問題も多くあります。

運動の途中でずっと守らなければならない条件を経路制約(または単に制約)といいます。この例では

−2≤a(t)≤2-2 \le a(t) \le 2

です。ロケットなら「推力は最大推力以下」「加速度は 8 G 以下」「高度は地表より上」などが制約になります。

小さくしたい量を数式で表したものを目的関数(評価関数、コスト関数)といいます。この例では到着時刻そのものです。

J=tfJ = t_f

大きくしたい量(到達高度など)は、マイナスをつけて最小化します。

この問題の答えは「前半は最大の加速度で加速し、ちょうど中間点で最大の減速に切り替える」です。 所要時間は 210/2=4.472\sqrt{10/2} = 4.47 秒です。OpenGoddard で解くと、この答えが数値的に得られます。

例題02の解。位置・速度・加速度の時間履歴。点は計算で求めた値、黒の破線は手計算で求めた解析解です。加速度が上限と下限の間を一度だけ切り替わる制御を「バンバン制御」といいます。
例題02の解。位置・速度・加速度の時間履歴。点は計算で求めた値、黒の破線は手計算で求めた解析解です。加速度が上限と下限の間を一度だけ切り替わる制御を「バンバン制御」といいます。

直感的に予想できる答えですが、条件が少し複雑になるだけで(空気抵抗がある、燃料で質量が減る、高度によって空気の濃さが変わる) 手計算では答えが出せなくなります。そのような問題を数値計算で解くのが OpenGoddard の役割です。

目的関数には、性質の違う2種類の項があります。

種類形意味例
終端コスト(Mayer 型)Φ(x(tf),tf)\Phi\bigl(\boldsymbol{x}(t_f), t_f\bigr)終わったときの状態だけで決まる所要時間 tft_f、最終高度 −h(tf)-h(t_f)、残った質量 −m(tf)-m(t_f)
積分コスト(Lagrange 型)∫t0tfL(x,u,t) dt\displaystyle\int_{t_0}^{t_f} L(\boldsymbol{x}, \boldsymbol{u}, t)\,dt途中の経過を積み上げる操作量の二乗和 ∫u2dt\int u^2 dt、燃料消費 ∫∣T∣dt\int \lvert T \rvert dt

両方を足した形を Bolza 型といいます。例題01 は所要時間(終端コスト)と 操作量の二乗積分(積分コスト)の和を最小にします。「早く着きたいが、急ぎすぎると操作が大きくなる」という釣り合いを取る問題です。

ここまでの要素をまとめると、OpenGoddard が扱う最適制御問題は次の形になります。

最小化J=Φ(x(tf),tf)+∫t0tfL(x(t),u(t),t) dt運動方程式x˙(t)=f(x(t),u(t),t)境界条件ψ(x(t0),t0,x(tf),tf)=0経路制約g(x(t),u(t),t)≥0\begin{aligned} &\text{最小化} && J = \Phi\bigl(\boldsymbol{x}(t_f), t_f\bigr) + \int_{t_0}^{t_f} L\bigl(\boldsymbol{x}(t), \boldsymbol{u}(t), t\bigr)\,dt \\[4pt] &\text{運動方程式} && \dot{\boldsymbol{x}}(t) = \boldsymbol{f}\bigl(\boldsymbol{x}(t), \boldsymbol{u}(t), t\bigr) \\[4pt] &\text{境界条件} && \boldsymbol{\psi}\bigl(\boldsymbol{x}(t_0), t_0, \boldsymbol{x}(t_f), t_f\bigr) = \boldsymbol{0} \\[4pt] &\text{経路制約} && \boldsymbol{g}\bigl(\boldsymbol{x}(t), \boldsymbol{u}(t), t\bigr) \ge \boldsymbol{0} \end{aligned}
記号名前例題02では
x(t)\boldsymbol{x}(t)状態(x,v)(x, v)
u(t)\boldsymbol{u}(t)制御aa
f\boldsymbol{f}運動方程式の右辺(v,a)(v, a)
Φ\Phi終端コストtft_f
LL積分コストの被積分関数なし(00)
ψ=0\boldsymbol{\psi} = \boldsymbol{0}境界条件x(0)=0, v(0)=0, x(tf)−10=0, v(tf)=0x(0)=0,\ v(0)=0,\ x(t_f)-10=0,\ v(t_f)=0
g≥0\boldsymbol{g} \ge \boldsymbol{0}経路制約2−a≥0, a+2≥02 - a \ge 0,\ a + 2 \ge 0

経路制約は「≥0\ge 0」の形にそろえて書きます。a≤2a \le 2 なら 2−a≥02 - a \ge 0 です。 OpenGoddard のコードでもこの向きで書きます(問題の書き方)。

ロケットの段分離のように、途中で運動方程式や機体の性質が変わる問題があります。 このような問題は、時間を区間(phase)に分け、区間ごとに運動方程式を与えます。 区間の境目では「位置と速度はつながる」「質量は分離した段の分だけ減る」といった接続条件を課します。 OpenGoddard では区間の数を自由に増やせます(例題11)。

答えは関数なので、厳密には無限個の値を決める問題です。手計算で解けるのは、 例題01〜03のように運動方程式が簡単で制約が少ない場合に限られます。 実用的な問題では、関数を有限個の数で近似して、コンピュータで解ける形に変換します。 その変換の考え方には大きく2つの流派があります。次のページで説明します。