07. Goddard問題・単一区間
鉛直に打ち上げるロケットを、決まった量の推進剤で最も高く上げるには、推力をどう出せばよいでしょうか。 ロケットの父 R. H. Goddard が提起した、最適制御の代表的な問題です。
| 項目 | 内容 |
|---|---|
| 状態 | 高度 、速度 、質量 |
| 制御 | 推力 |
| 目的 | 最終高度 を最大にする |
| 区間 | 1区間、50ノード、終了時刻は自由 |
| 新しく学ぶこと | 質量が減る運動方程式、最大化問題の書き方、不連続な制御を1本の多項式で表したときの限界 |
ロケットは推進剤を燃やして推力を得ます。推進剤を使うほど機体は軽くなり、同じ推力でもよく加速するようになります。 一方、速く飛ぶと空気抵抗が速度の2乗で増え、推進剤を抵抗に打ち勝つために浪費します。 ただし空気は高度が上がると急に薄くなるので、高いところでは抵抗はあまり問題になりません。
「最初から全開で吹かす」と低空で速度が出すぎて抵抗で損をし、「ゆっくり吹かす」と重力に逆らう時間が長くなって損をします。 最適な推力はこの間のどこかにあり、それは時刻とともに変わります。
計算を簡単にするため、量はすべて地球半径・地表の重力・初期質量を 1 とする無次元量で表します。
右辺に現れる抵抗 と重力 は次のとおりです。
- 抵抗 は速度の2乗に比例し、空気の密度にあたる指数関数の項によって、高度が上がると急に小さくなります。
- 重力 は地球中心からの距離の2乗に反比例します。
- 質量は推力に比例して減ります。 は排気速度で、大きいほど同じ推力で推進剤の消費が少なくなります。
地表で静止した状態から出発します。終端では推進剤を使い切って(質量 0.6)、上昇が止まった(速度 0)瞬間とします。 その瞬間が最高到達点です。
推力の上限は初期重量の 3.5 倍です。
最終高度を最大にしたいので、マイナスをつけて最小化します。
| 記号 | 意味 | 値 |
|---|---|---|
| 初期高度・地表の重力・初期質量 | 1 | |
| 抵抗の係数 | 310 | |
| 空気が薄くなる速さ | 500 | |
| 排気速度 | 0.5 | |
| 最大推力 | 3.5 | |
| 推進剤を使い切ったときの質量 | 0.6 |
高度は 1 から 1.01 へ、質量は 1 から 0.6 へなめらかに変わる3次式、速度は 0、推力は最大から 0 へ下がる3次式で与えます。 終了時刻の初期推定は 0.3 です。

- 最高到達高度は 1.0128 で、地球半径の約 1.3 % の高さまで上がります。
- 推進剤は時刻 0.079 ごろに尽き、その後は惰性で上昇して時刻 0.199 に最高点に達します。
- 推力は「最大推力 → 中間の推力 → ゼロ」の3段階に変わります。
中間の推力(特異弧)
Section titled “中間の推力(特異弧)”最初は重力に逆らって早く速度を得るため、最大推力で吹かします。速度が上がって抵抗が大きくなると、 推力をあえて落とし、抵抗と重力の損失がつり合う速度を保つように調整します。この推力が最大でもゼロでもない区間を 特異弧(singular arc)といいます。高度が上がって空気が薄くなると、残りの推進剤を使い切ってから惰性で上昇します。
推力の上下限だけで答えが決まる「バンバン制御」(例題02)と違い、特異弧では推力の値そのものを 物理のつり合いから決める必要があり、間接法では扱いが難しいことで知られます。 直接法では特別な扱いなしに求まります。
推力のグラフを見ると、中間の推力の区間で値が波打ち、燃焼終了の前後でなめらかに(実際より遅く)ゼロへ落ちています。 本当の最適解では推力はゼロへ不連続に切り替わります。50ノードの1本の多項式で不連続な関数を表そうとしたため、 多項式が振動しているのです。擬スペクトル法が不連続を苦手とする典型例です。
例題08 では、燃焼終了の時刻で区間を分けることで、この振動を解消します。
試してみよう
Section titled “試してみよう”- ノード数(
Problem([0.0, 0.3], [50], ...)の50)を 30 や 80 に変え、推力の振動と最高到達高度がどう変わるか比べる。 - 抵抗の係数
PARAMETERS["Dc"]を小さくすると、特異弧が短くなり、最大推力で吹かす時間が長くなることを確かめる。 - 最大推力
T_maxを下げると、推力の上限で吹かす時間が長くなる。
uv run python examples/07_goddard_0knot.pyexamples/07_goddard_0knot.py を GitHub で見る