06. 単純な2次元ロケット
加速度の大きさは決まっていて、向きだけを自由に変えられる機体があります。 静止した状態から、高さ 1 m の水平な飛行に最も早く移るには、加速度をどの向きに向ければよいでしょうか。 ロケットを軌道に乗せる問題を、重力も空気もない平面に単純化したものです。
| 項目 | 内容 |
|---|---|
| 状態 | 水平速度 、鉛直速度 、水平位置 、高さ |
| 制御 | 加速度の向き (水平から測った角度) |
| 目的 | 終了時刻 を最小にする |
| 区間 | 1区間、20ノード、終了時刻は自由 |
| 新しく学ぶこと | 2次元の運動、制御が「大きさ」ではなく「向き」の角度であること |
ロケットを打ち上げて軌道に乗せるときは、最初は上へ向かって高度を稼ぎ、だんだん機体を倒して横向きの速度をつけ、 目標の高度では上下の速度がゼロになって水平に飛ぶようにします。この「機体をどう倒していくか」が問題の核心です。
この例題では、それを最も単純な形にします。
- 機体は平面上を動き、重力も空気抵抗もありません。
- 加速度の大きさは常に で、変えられるのは向き だけです。
- 止まった状態から出発し、高さ 1 m で、水平速度 1 m/s・鉛直速度 0 の状態になったら到着です。どの水平位置で到着してもかまいません。
上だけに加速すれば早く高さを稼げますが、鉛直速度が残って止まれず、水平速度もつきません。 横だけに加速すれば高さが稼げません。向きを時間とともにどう変えるかで、到着までの時間が変わります。
- は水平・鉛直方向の速度 [m/s]、 は水平位置と高さ [m] です。
- 加速度 を角度 の向きに出すので、水平成分は 、鉛直成分は です。
- は真横( 方向)、 は真上、 は斜め下向きです。
原点で静止した状態から出発します。終端では高さ 1 m、水平速度 1 m/s、鉛直速度 0 にします。 終端の水平位置 には条件をつけません。どこで到着するかも最適化の結果として決まります。
加速度の向きは前方( が増える側)の半円に限ります。後ろ向きに加速しても得はないので、 この範囲で角度を一意に決めるための制約です。
到着までの時間を最小にします。
| 記号 | 意味 | 値 |
|---|---|---|
| 加速度の大きさ | 1 m/s² |
時間区間を s とし、(0 から 1 へ進む割合)を使って次のように与えます。
- 水平速度は (0 から 1 へ直線的に増える)、水平位置はそれを積分した 。
- 高さは (0 から 1 へなめらかに上がり、両端で傾き 0)、鉛直速度はその時間微分 。
- 角度はこれらの速度変化から決まる向き で、上向きから下向きへ変わります。


- 到着までの最短時間は 2.085 s です。
- 到着する水平位置は 1.043 m です。
- 加速度の向きは、最初は 1.35 rad(約 77°、ほぼ上向き)、 最後は -1.34 rad(約 −77°、ほぼ下向き)で、その間をなめらかに変わります。
上げてから、下で止める
Section titled “上げてから、下で止める”前半は加速度をほぼ上に向け、鉛直速度を急いで稼ぎます。そのままでは高さ 1 m を通り過ぎてしまうので、 後半は加速度を下に向けて鉛直速度を打ち消し、ちょうど高さ 1 m で になるようにします。 鉛直速度は中ほどで最大になり、そこから 0 に戻ります。
水平方向はどうでしょう。角度が に近いと は小さく、水平速度はあまり増えません。 角度が 0 を横切る中盤に水平速度が大きく伸び、最後に 1 m/s に達します。 鉛直の「上げて止める」と水平の「1 m/s まで加速する」を、決まった大きさの加速度を振り分けながら同時に満たす、というのがこの問題の答えです。
前半の上向きと後半の下向きはほぼ対称になっています。重力がないので、上げる動作と止める動作に差がないためです。
角度の正接が時間の1次式になる
Section titled “角度の正接が時間の1次式になる”重力のない平面で、一定の大きさの加速度の向きだけを選んで最短時間で目標に達する問題には、 最適な向きが
の形( は定数)になるという性質が知られています。線形タンジェント則(linear tangent law)と呼ばれ、 実際のロケットの誘導則の基礎になっています。ここでは終端の水平位置が自由なので、分母が定数のこの形になります。
数値解の も、時刻に対してほぼ直線になります。このため は、両端では に近い値でゆっくり変わり、 中ほどで急に向きを変える S 字の曲線になります。初期推定の も同じ形をしているので、 ソルバーはこの形の係数を調整するだけで答えに近づけます。
この性質は、最適性の条件を先に導く間接法から得られます。直接法の OpenGoddard では こうした式を知らなくても、運動方程式と条件を書くだけで同じ形の解が得られます。
試してみよう
Section titled “試してみよう”- 加速度の大きさ
PARAMETERS["a"]を 2 にすると、到着時間は短くなります。軌跡の形や角度の変化がどう変わるか比べてみましょう。 - 終端の条件に水平位置(
result.equal(x[-1], ...))を加えると、到着地点が指定されます。このときは が時間の1次式ではなくなり、角度の変化の形が変わります。 - ノード数(
Problem([0.0, 2.0], [20], ...)の20)を 10 や 40 に変え、最短時間が何桁目まで変わらないかを確かめる。
uv run python examples/06_simple_rocket_2d.pyexamples/06_simple_rocket_2d.py を GitHub で見る