10. 単段ロケット上昇
例題07の Goddard 問題を、メートル・キログラム・秒の実際の単位で解きます。 空気の密度は高度とともに指数関数的に薄くなり、重力は地球中心からの距離の2乗に反比例します。 桁の大きく違う量を同時に扱うため、ソルバーが解きやすいように単位をそろえる工夫も学びます。
| 項目 | 内容 |
|---|---|
| 状態 | 地球中心からの距離 、鉛直速度 、質量 |
| 制御 | 推力 |
| 目的 | 最終的な距離 (到達高度)を最大にする |
| 区間 | 1区間、50ノード、終了時刻は自由 |
| 新しく学ぶこと | 実際の単位、指数関数の大気モデル、逆2乗の重力、単位のスケーリング |
全体の質量 5000 kg、そのうち 3000 kg が推進剤のロケットを、地表から真上へ打ち上げます。 推進剤を使い切ったあとも惰性で上がり、上昇が止まった点が到達高度です。この到達高度を最大にする推力の出し方を求めます。
考え方は例題07と同じです。全開で吹かすと低空で速度が出すぎて空気抵抗で損をし、 ゆっくり吹かすと重力に逆らう時間が長くなって損をします。違いは、物理量を実際の単位で書くことです。 位置は地表からの高度ではなく地球中心からの距離 で表します(地表では km)。 機体は真上にしか動かない1次元の運動です。
- は地球中心からの距離 [m]、 は鉛直上向きの速度 [m/s]、 は機体の質量 [kg]、 は推力 [N] です。
- 質量の式の は排気速度 [m/s] です。比推力 は「1 kg 重の推進剤で何秒間 1 kg 重の推力を出せるか」を表す エンジンの燃費の指標で、大きいほど同じ推力で推進剤の消費が少なくなります。
右辺に現れる空気抵抗 、空気の密度 、重力加速度 は次のとおりです。
- 空気抵抗は動圧 に抵抗係数 と断面積 を掛けたものです。
- 密度 は高度 の指数関数で、高度が m 上がるごとに (約 37 %)に減ります。 をスケールハイトと呼びます。
- 重力加速度は地球中心からの距離の2乗に反比例します。 は地球の重力定数です。地表では約 9.82 m/s² になります。
地表で静止した状態から出発します。終端では推進剤 3000 kg を使い切り(質量 2000 kg)、上昇が止まった(速度 0)瞬間とします。 終端の質量 2000 kg は、初期質量に比 を掛けた値です。
最大推力は初期重量の2倍です。
到達点の距離を最大にするため、マイナスをつけて最小化します。 で割っているのは値を 1 程度にするためで、答えには影響しません。
| 記号 | 意味 | 値 |
|---|---|---|
| 地球の重力定数 | m³/s² | |
| 地球の半径 | 6371 km | |
| 標準重力加速度 | 9.80665 m/s² | |
| 初期質量 | 5000 kg | |
| 推進剤を使い切ったときの質量 | 2000 kg(初期質量の 0.4 倍) | |
| 抵抗係数 | 0.2 | |
| 断面積 | 10 m² | |
| 比推力 | 300 s | |
| 最大推力 | 初期重量の 2 倍(98066.5 N) | |
| 地表の空気の密度 | 1.225 kg/m³ | |
| スケールハイト | 8500 m |
最大推力で吹かすと、推進剤は毎秒 kg 減ります。全開なら 3000 kg を 90 s で使い切る計算です。
単位のスケーリング
Section titled “単位のスケーリング”この問題では、距離は m、質量は kg、時間は s、推力は N と、量の桁が大きく違います。 そのまま最適化すると、ソルバーは変数ごとの動かし方の感覚がつかめず、収束しにくくなります。 そこで各量を次の代表的な大きさで割り、1 程度の値にしてから最適化します(単位をそろえる)。
| 量 | 単位にとった値 | 大きさ |
|---|---|---|
| 距離 | 6371 km | |
| 速度 | (地表での円軌道速度) | 約 7.91 km/s |
| 質量 | 5000 kg | |
| 時間 | 距離の単位 ÷ 速度の単位 | 約 805 s |
| 推力 | 質量 × 距離 ÷ 時間² | 約 49.1 kN |
運動方程式や条件は物理単位のまま書き、割り算はライブラリが内部で行います。
時間区間を s とし、次のように与えます。
- 距離は から km へなめらかに変わる3次式(両端で傾き 0)。
- 速度は 0。
- 質量は 5000 kg から 2000 kg へ変わる3次式(出発時の傾き −0.6 kg/s、終端で傾き 0)。
- 推力は最大推力から 0 へ下がる3次式(両端で傾き 0)。

- 到達高度は 65.5 km です。
- 推進剤は約 114 s で尽き、その後は惰性で上がって 188 s に最高点に達します。
- 推力は「最大推力 → 中間の推力 → ゼロ」と変わります。例題07と同じ形です。
例題07と同じ形の答え
Section titled “例題07と同じ形の答え”最初の約 20 s は最大推力で吹かして速度を稼ぎます。速度が上がると空気抵抗が大きくなるので、推力を 70〜80 kN 程度に落とし、 抵抗による損失と重力による損失のつり合う速度を保ちながら上昇します(特異弧)。 高度が上がって空気が薄くなると、残りの推進剤を燃やし切って速度を最大にし、あとは惰性で上がります。
最大推力のまま吹かせば 90 s で燃え尽きるところを、推力を絞ることで燃焼が約 114 s まで延びています。 空気の濃い低空では急がず、空気が薄くなってから速度を上げる、というのが最適な使い方です。
例題07は量を無次元にした問題でしたが、物理の構造は同じなので、実際の単位で書いても同じ形の答えになります。
推力の波打ち
Section titled “推力の波打ち”中間の推力の区間で推力が波打ち、燃焼終了の前後でなめらかにゼロへ落ちています。本当の最適解では推力はゼロへ不連続に切り替わります。 例題07と同じく、不連続な関数を1本の多項式で表そうとしたためです(区間に分ける)。 例題08のように燃焼終了で区間を分ければ、この振動は小さくできます。
試してみよう
Section titled “試してみよう”- 抵抗係数
self.Cdを 0(空気抵抗なし)にする。特異弧がなくなり、最大推力で吹かして燃やし切る答えに近づくか、到達高度がどれだけ上がるかを見る。 - 比推力
self.Ispを 300 から 450 に上げる。同じ推進剤で長く吹かせるので、到達高度が大きく伸びることを確かめる。 - 最大推力
self.max_thrust(初期重量に対する比)を 1.5 に下げると、最大推力で吹かす時間が長くなり、特異弧が短くなるかを見る。
uv run python examples/10_rocket_ascent_single_stage.pyexamples/10_rocket_ascent_single_stage.py を GitHub で見る