化学推進エンジンの分類と燃焼室の熱力学 — 液体・固体・ハイブリッドの設計原理

Falcon 9のマーリンエンジン、SLSのRS-25、JAXAのLE-9、M-Vの固体ブースター——これらはすべて「化学推進エンジン」と一括りに語られます。しかし蓋を開けてみると、推進剤の状態(液体か固体か)、燃料と酸化剤の組み合わせ(LH2/LOX、RP-1/LOX、MMH/N2O4、APCPなど)、エンジンサイクル(ガスジェネレータ、段燃焼、エキスパンダー、エレクトリックポンプ)、ノズルの設計まで、ありとあらゆる要素が異なります。同じ「化学推進」でも、なぜこれほど多様なのか。逆に、これら多様な設計を貫く「共通の物理」は何か。

その答えは、燃焼室の中で起きている熱力学と化学平衡にあります。燃焼室温度 $T_c$、燃焼室圧力 $P_c$、燃料と酸化剤の混合比 $O/F$、そして高温で起きる分子の解離——これらが推進剤の選択、エンジンサイクル、ノズル形状のすべてを決めています。

化学推進の理解は、宇宙開発に直接結びつきます。たとえばSpaceXのRaptorエンジン(メタン/LOX、フルフロー段燃焼)と、Apollo計画のF-1エンジン(RP-1/LOX、ガスジェネレータ)の違いは、燃焼室の熱力学と機械的サイクル選択の帰結です。また、JAXAのH3ロケット用LE-9(LH2/LOX、エキスパンダーブリードサイクル)は、燃焼室温度を下げて再使用性と信頼性を高める設計思想に基づいています。NASAのアルテミス計画で復活したSLS固体ブースターは、APCP推進剤の燃焼速度則 $r = aP_c^n$ がそのまま推力プロファイルを支配しています。

本記事の内容

  • 化学推進の3分類(液体、固体、ハイブリッド)と、それぞれが選ばれる物理的理由
  • 燃焼室の熱力学:燃焼温度 $T_c$、混合比 $O/F$、化学平衡と解離損失
  • 液体エンジンサイクルの比較(ガスジェネレータ、段燃焼、エキスパンダー、エレクトリックポンプ)
  • 固体推進剤の燃焼速度則 $r = aP_c^n$ とグレイン設計
  • NASA CEA風の簡易化学平衡ソルバをPythonで実装し、3つの推進剤系の比推力をO/F・ノズル膨張比に対して可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

直感:なぜ液体・固体・ハイブリッドの3種類があるのか

化学推進エンジンの分類を覚える前に、なぜそもそも複数の方式があるのかを考えてみましょう。料理に例えると分かりやすいかもしれません。

固体推進剤は「冷凍食品」のようなものです。あらかじめ調理(混合と硬化)されており、点火するだけですぐ使えます。保存も簡単で、何年も常温で待機できます。ミサイルや固体ブースターが固体推進剤を選ぶのはこのためです。一方で、一度火を点けたら最後まで燃え続けるしかない。火力(推力)の調整も、消火も難しい。

液体推進剤は「レストランの本格料理」です。燃料と酸化剤を別々のタンクに保管し、必要なときに燃焼室へポンプで送り込んで燃やします。バルブで流量を変えれば推力を絞れる(スロットリング)、燃焼を止められる(再着火)、燃料と酸化剤の比率を最適化できる——調整の自由度が圧倒的に高い反面、ターボポンプ、極低温配管、再生冷却など、システムは極めて複雑になります。Saturn V のF-1、Space ShuttleのSSME、SpaceXのMerlin/Raptor、JAXAのLE-7A/LE-9はすべて液体ロケットです。

ハイブリッド推進剤は「固体の燃料を液体の酸化剤で焼く」中間方式です。燃料は固体グレイン(例:HTPBゴムや蝋)、酸化剤は液体(液体酸素や亜酸化窒素 N2O)。酸化剤の流量で推力を調整でき、安全性は固体並みに高く、設計は液体より単純です。Virgin GalacticのSpaceShipTwoのモーター(HTPB + N2O)が代表例で、近年は小型ロケットで再注目されています。

3方式の選択は、結局のところ「性能(比推力)vs 制御性 vs 信頼性 vs コスト」のトレードオフです。そのトレードオフを決める最重要因子が、これから見ていく燃焼室の熱力学です。

化学推進の3分類とそれぞれの特徴

液体推進剤エンジン

液体推進剤は、燃料と酸化剤を別タンクに液体状態で貯蔵し、燃焼室で混合・燃焼させます。主な組み合わせは以下のとおりです。

組み合わせ $I_{sp}$(真空、s) 燃焼温度 $T_c$(K) 用途・特徴
LH2 / LOX(液体水素/液体酸素) 450 前後 約 3,400 高比推力、極低温(20 K / 90 K)、密度が低い
RP-1 / LOX(ケロシン/液体酸素) 340 前後 約 3,600 高密度、扱いやすい、Falcon 9 や Saturn V
CH4 / LOX(メタン/液体酸素) 360 前後 約 3,500 再使用に有利(コーキングが少ない)、Raptor
MMH / N2O4(モノメチルヒドラジン/四酸化二窒素) 330 前後 約 3,200 接触で自己着火(hypergolic)、長期保存可、Apollo月着陸船

液体推進剤の最大の利点は、スロットリング・再着火・高比推力です。比推力 $I_{sp}$ は推進剤1 kgあたりに発生する推力の時間積分を重力加速度で割った量で、エンジンの「燃費」を表します。

LH2/LOXが最高の $I_{sp}$ を達成するのは、分子量の小さい水素を燃焼ガスの主成分にできるからです。次節の熱力学で見るように、$I_{sp}$ は排気ガスの $\sqrt{T_c / M_w}$ にほぼ比例するため、分子量 $M_w$ が小さいほど有利になります。

固体推進剤エンジン

固体推進剤は、燃料と酸化剤の粉末を結合剤(バインダ)で固めた一塊の固体です。最も普及しているのは APCP(Ammonium Perchlorate Composite Propellant) で、過塩素酸アンモニウム(酸化剤)+ アルミニウム粉(燃料)+ HTPB(結合剤兼燃料)からなります。Space Shuttleの固体ブースター、SLSのブースター、JAXAのM-V、H-IIA/H3の SRB-A/3 などはすべてAPCPです。

固体推進剤の燃焼室は単純で、内部に「グレイン」と呼ばれる成形された推進剤の塊が入っているだけです。グレインの内表面に点火すると、表面から燃焼ガスが発生し、ノズルから噴射されます。燃焼面積の時間変化 = 推力プロファイル であり、グレインの断面形状(星型、円柱、ドッグボーン)で推力曲線を設計します。

固体は シンプルで信頼性が高く、即応性に優れる反面、$I_{sp}$ は液体より低く(典型値 240〜280 s)、一度点火したら止められず、推力もほぼ固定です。

ハイブリッド推進剤エンジン

ハイブリッドは固体燃料 + 液体酸化剤の組み合わせです。燃料グレイン(HTPB、PMMA、パラフィン蝋など)が燃焼室の壁を構成し、その内側に液体酸化剤(LOX、N2O、H2O2 など)を噴射します。酸化剤バルブで流量を制御するため、固体より遥かに高い制御性を持ちながら、液体ほど複雑にならない中間解です。

実用例は限られますが、Virgin GalacticのSpaceShipTwo(HTPB/N2O)、近年の小型サウンディングロケットなどで採用されています。$I_{sp}$ は 250〜300 s 程度で固体と液体の中間です。

3方式を整理すると、性能($I_{sp}$)と複雑さの関係はおおよそ「液体 > ハイブリッド > 固体」、信頼性とコスト効率は「固体 > ハイブリッド > 液体」となります。この差を決めるのが燃焼室の中で起きる物理——次節で詳しく見ていきましょう。

燃焼室の熱力学($T_c$, $P_c$, 混合比 O/F)

比推力と排気速度の関係

化学推進エンジンの性能は、最終的にノズル出口の排気速度 $V_e$ で決まります。詳細はラバルノズルを参照してください。ノズル入口(燃焼室)で速度がほぼゼロ、出口で完全に膨張すると仮定すると、エネルギー保存則(断熱定常流のエネルギー方程式)から

$$ \frac{1}{2}V_e^2 = h_c – h_e = c_p (T_c – T_e) $$

が得られます。ここで $h$ はエンタルピー、$c_p$ は定圧比熱です。ノズル内が等エントロピー膨張ならば

$$ \frac{T_e}{T_c} = \left(\frac{P_e}{P_c}\right)^{(\gamma-1)/\gamma} $$

なので、これを代入して整理すると、有名な理想ロケットの排気速度の式が得られます。

$$ V_e = \sqrt{\frac{2\gamma}{\gamma-1}\frac{R_u T_c}{M_w}\left[1 – \left(\frac{P_e}{P_c}\right)^{(\gamma-1)/\gamma}\right]} $$

ここで $R_u$ は普遍気体定数、$M_w$ は燃焼ガスの平均分子量、$\gamma$ は比熱比です。比推力は $I_{sp} = V_e / g_0$($g_0 = 9.80665$ m/s²)で定義されます。

この式から、化学推進エンジンの設計指針が見えてきます。

  1. 燃焼室温度 $T_c$ を高くする — $V_e \propto \sqrt{T_c}$ なので直接効く
  2. 平均分子量 $M_w$ を小さくする — $V_e \propto 1/\sqrt{M_w}$ なので、軽い分子を多く含む推進剤が有利
  3. 圧力比 $P_c / P_e$ を大きくする — 燃焼室圧を高め、ノズルでよく膨張させる
  4. 比熱比 $\gamma$ を適切に — 通常 $\gamma \approx 1.2$ 程度の値で実用化される

LH2/LOX が高比推力を実現するのは、燃焼ガス中に大量の水蒸気と未燃の水素が含まれて分子量が低い(典型 $M_w \approx 10$ g/mol 程度)からです。一方、RP-1/LOX は炭素・二酸化炭素を多く含み $M_w \approx 22$ g/mol になります。

混合比 $O/F$ と最適点

混合比 $O/F$ は、燃焼室に入る酸化剤の質量流量 $\dot m_{ox}$ と燃料の質量流量 $\dot m_f$ の比です。

$$ O/F = \frac{\dot m_{ox}}{\dot m_f} $$

化学量論比(stoichiometric ratio)は、完全燃焼に必要な理論的な比です。たとえば LH2/LOX では

$$ 2H_2 + O_2 \to 2H_2O $$

から、化学量論比は $O/F = 32 / 4 = 8$ です。ところが、実際のロケットエンジンは化学量論比では運転しません。LH2/LOXのSSMEは $O/F \approx 6$、つまり燃料リッチで運転します。

なぜ燃料リッチが有利なのでしょうか。前節の排気速度の式に立ち返ると、$V_e \propto \sqrt{T_c / M_w}$ でした。化学量論比では $T_c$ は最大になりますが、すべての水素が水($M_w = 18$)になり、$M_w$ が大きくなります。燃料リッチで運転すると、$T_c$ は少し下がりますが、余った水素($M_w = 2$)が排気ガスを軽くするため、結果として $T_c / M_w$(とその平方根)は上昇するのです。

このトレードオフのため、$I_{sp}$ は $O/F$ の関数として一意のピークを持ちます。LH2/LOXでは $O/F \approx 4-5$ 付近にピークがありますが、密度比推力(タンク体積を含めた性能)を考慮すると $O/F \approx 6$ で運転するのが実用上の最適解になります。次節の Python 実装でこのピークを実際に計算してみます。

化学平衡と解離損失

燃焼温度 $T_c$ を素朴に「反応熱÷比熱」で見積もると、LH2/LOX なら 5,000 K 近い値が出ます。ところが実際の $T_c$ は 3,400 K 程度です。差し引き 1,600 K もの「損失」はどこに行ったのでしょうか。

答えは解離(dissociation) です。3,000 K を超える高温では、水 $H_2O$ は熱的に不安定で、$H_2 + \frac{1}{2}O_2$ や、さらには $OH$, $H$, $O$, $H^+$, $e^-$ などのラジカル・イオンに分解します。これらの解離反応は吸熱反応なので、燃焼で得たエネルギーの一部を「分子をバラバラにする」のに消費します。

NASA CEA(Chemical Equilibrium with Applications)のような化学平衡ソルバは、ギブズ自由エネルギー $G = \sum_i n_i (\mu_i^\circ + RT \ln(P_i / P^\circ))$ を最小化する各化学種のモル数 $n_i$ を解くことで、$T_c$, $M_w$, $\gamma$ を厳密に計算します。本記事の Python 実装では、簡略化された平衡ソルバを構築して、典型推進剤系の性能を概算します。

ここまでで、燃焼室の中で何が起きるかが見えました。では、その熱と高圧をどうやって作り出すか——次節の液体エンジンサイクルが、その「動力供給」の方法を決めています。

液体エンジンサイクル比較

液体推進剤を高圧の燃焼室に送り込むには、強力なターボポンプが必要です。SSMEの高圧水素ポンプは、シャワーヘッド程度の大きさで自動車エンジン100台分以上の出力(約 50 MW)を生み出します。このポンプを駆動するエネルギーをどこから取るか——その違いが「エンジンサイクル」です。

ガスジェネレータサイクル(GG cycle)

燃焼室から少量(全流量の数%)の推進剤を分流し、別の小さな燃焼器(ガスジェネレータ)で燃やしてタービンを回します。タービン排気は燃焼室を通らず、低圧で大気へ捨てられます。

  • 代表例: Saturn V F-1, SpaceX Merlin, JAXA LE-7A 後段
  • 長所: シンプル、開発容易、信頼性高
  • 短所: タービン排気が捨てられるため、性能(Isp)損失が 1-3% ある

排気が燃焼室を通らないため、上流のターボポンプ吐出圧力が燃焼室圧 $P_c$ より高ければ動作します。「開放サイクル(open cycle)」とも呼ばれます。

段燃焼サイクル(staged combustion)

ガスジェネレータの排気を燃焼室にも送り込むことで、性能損失をなくしたサイクルです。燃焼室の上流に「予燃焼器(preburner)」を置き、そこで非化学量論比(燃料リッチまたは酸化剤リッチ)の高温ガスを生成してタービンを駆動、その後そのガスを燃焼室に送って残りの推進剤と完全燃焼させます。

  • 代表例: Space Shuttle SSME, SpaceX Raptor(フルフロー段燃焼 FFSC), ロシア RD-180
  • 長所: 高効率(GG比でIsp +5〜10 s)、$P_c$ を非常に高く取れる(SSMEで 20 MPa、Raptorで 30 MPa)
  • 短所: 設計が複雑、予燃焼器の高温・高圧運転で素材技術が極めて高難度

特にRaptorが採用するフルフロー段燃焼(FFSC)は、燃料リッチと酸化剤リッチの2つの予燃焼器を持ち、全推進剤がタービンを通過します。これにより冷却が改善され、再使用に有利な低タービン入口温度を実現しています。

エキスパンダーサイクル(expander cycle)

燃焼室・ノズル壁の再生冷却で温められた燃料(通常は液体水素)の熱膨張でタービンを駆動するサイクルです。燃焼器を別に持たないので、極めてクリーンで信頼性が高くなります。

  • 代表例: RL10(Centaur/Vulcan上段), ESA Vinci, JAXA LE-5B
  • 長所: 信頼性最高クラス、燃焼室を持たないシンプルさ
  • 短所: タービン駆動エネルギーが冷却で吸収する熱に制限されるため、高推力化が難しい(実機で 100 kN クラスが限界)

エキスパンダーには「クローズドサイクル」(タービン排気を燃焼室に戻す)と「エキスパンダーブリードサイクル(expander bleed)」(タービン排気をノズル外に捨てる)があり、JAXAのLE-9は後者を採用してH3ロケットで運用中です。

エレクトリックポンプサイクル

近年登場した方式で、ターボポンプをバッテリ駆動の電動ポンプに置き換えます。タービンサイクルそのものが不要になり、設計が劇的に単純化されます。

  • 代表例: Rocket Lab Rutherford(Electronロケット)
  • 長所: 設計超シンプル、3Dプリント主体、小推力向けで開発期間が短い
  • 短所: バッテリ重量がペナルティになる、現状は小型ロケット限定

サイクルを比較すると、推力と $I_{sp}$ のトレードオフが鮮明です。「最高性能ならフルフロー段燃焼(Raptor)、信頼性ならエキスパンダー(RL10)、低コストならガスジェネレータ(Merlin)またはエレクトリックポンプ(Rutherford)」——この選択がロケット全体のアーキテクチャを支配します。

液体エンジンの「動的な調整可能性」を見ましたが、対極にあるのが固体ロケットの「燃え方が推進剤そのものに刻まれている」世界です。次節で固体推進剤の燃焼速度則を見ていきます。

固体推進剤の燃焼速度則とグレイン設計

燃焼速度則(Vieille / Saint Robert の式)

固体推進剤は表面から内側に向かって燃え進みます。燃焼面の前進速度 $r$(linear burn rate、m/s)は、燃焼室圧 $P_c$ にべき乗で依存することが実験的に知られています。

$$ \boxed{\; r = a P_c^n \;} $$

これをVieille則またはSaint Robert則と呼びます。係数 $a$ と圧力指数 $n$ は推進剤の組成・温度に依存し、典型値は APCP で $n \approx 0.3$、ダブルベース推進剤で $n \approx 0.7$ 程度です。

この式の意味は深いです。燃焼室の質量流量 $\dot m$ は

$$ \dot m = \rho_p A_b r = \rho_p A_b \cdot a P_c^n $$

ここで $\rho_p$ は推進剤密度、$A_b$ は燃焼面積です。一方、ノズルからの質量流量はチョーク条件(ラバルノズル参照)で

$$ \dot m = \frac{P_c A_t}{c^*} $$

ここで $A_t$ はノズルスロート面積、$c^*$ は特性排気速度です。定常では両者が等しいので、$P_c$ について解くと

$$ P_c = \left(\frac{\rho_p a c^* A_b}{A_t}\right)^{1/(1-n)} $$

が得られます。この式から重要な安定性条件が見えます——$n < 1$ でなければ燃焼室は安定動作しないのです。$n \geq 1$ だと、わずかな圧力変動が指数関数的に増幅して暴走(爆発)します。だから現実のロケット用固体推進剤はすべて $n < 1$ に調合されています。

グレイン形状と推力プロファイル

燃焼面積 $A_b$ は時間とともに変化します。グレインの内部形状によって、推力プロファイルを設計できます。

  • 円筒孔(end-burning, BATES): 単純な穴。燃焼が進むと $A_b$ が増えるため、プログレッシブ(推力が時間とともに増加)
  • 星型(star grain): 切れ込みのある星型。形状次第で $A_b$ をほぼ一定に保てる——ニュートラル(推力一定)
  • ドッグボーン / フィノクル / ワゴンホイール: 初期 $A_b$ を大きく、後で減らす——リグレッシブ(推力が時間とともに減少。空気抵抗が大きい打ち上げ初期に大推力が欲しい場合に有効)

Space Shuttle SRBやSLSブースターは、上部に11点の星型、下部に円筒に近い形状を持つ複合グレインで、打ち上げ最初の60秒程度を高推力、その後マックス Q(最大動圧)回避のため一時減推力、その後再上昇というプロファイルを実現していました。

固体ロケットは「燃え方を推進剤の形状そのものに焼き込む」工学です。液体のように動的にバルブで制御するのではなく、事前に物理形状で時間波形をプログラムする——この発想の違いを押さえると、固体と液体の本質的な違いが見えてきます。

ここまでで化学推進エンジンの3分類と物理を見てきました。理論はここまでにして、Python で実際に燃焼室と性能を計算してみましょう。

Python実装 — 燃焼室と性能の計算

NASA CEA風の簡易化学平衡ソルバ

NASA CEA は何百もの化学種を扱う本格的なソルバですが、ここでは LH2/LOX 系を主要4化学種($H_2O$, $H_2$, $O_2$, $OH$)に絞った簡易モデルで、燃焼温度 $T_c$ と平均分子量 $M_w$ を計算します。

import numpy as np
from scipy.optimize import brentq, minimize_scalar

# 物理定数
R_U = 8.314462618       # J/(mol·K) 普遍気体定数
G0 = 9.80665             # m/s² 重力加速度

# 化学種の物性(標準生成エンタルピー [J/mol]、分子量 [g/mol])
SPECIES = {
    'H2O': {'Hf': -241_826.0, 'M':  18.015},   # 気相
    'H2':  {'Hf':        0.0, 'M':   2.016},
    'O2':  {'Hf':        0.0, 'M':  31.998},
    'OH':  {'Hf':   39_300.0, 'M':  17.007},
    'H':   {'Hf':  217_998.0, 'M':   1.008},
    'O':   {'Hf':  249_180.0, 'M':  15.999},
}

# 簡易 Cp(T) モデル: a + b*T + c*T^2 形式の最小二乗フィット係数
# JANAF からの大まかなフィット (300-4000 K)
CP_COEFF = {
    'H2O': (28.0, 0.012, -1.0e-6),
    'H2':  (27.0, 0.005,  1.0e-7),
    'O2':  (28.0, 0.006, -1.0e-6),
    'OH':  (28.0, 0.004,  0.0),
    'H':   (20.8, 0.0,    0.0),
    'O':   (20.8, 0.0,    0.0),
}

def cp_species(species, T):
    """化学種の定圧モル比熱 Cp(T) [J/(mol·K)]"""
    a, b, c = CP_COEFF[species]
    return a + b*T + c*T*T

def enthalpy(species, T, T_ref=298.15):
    """生成エンタルピー基準のエンタルピー [J/mol] H(T) = Hf + ∫Cp dT"""
    a, b, c = CP_COEFF[species]
    Hf = SPECIES[species]['Hf']
    # ∫(a + bT + cT²)dT = aT + bT²/2 + cT³/3
    integral = (a*(T - T_ref) + 0.5*b*(T*T - T_ref*T_ref)
                + (c/3.0)*(T**3 - T_ref**3))
    return Hf + integral

ここまでで、化学種の比熱とエンタルピーを温度の関数として用意しました。次に、燃料($H_2$)と酸化剤($O_2$)の供給流量から、断熱燃焼後のモル組成と燃焼温度 $T_c$ を解くソルバを書きます。

def solve_adiabatic_flame_temperature_h2_o2(OF, T_in=298.15, tol=1e-6):
    """
    H2/O2 系の断熱火炎温度を解く(簡易モデル: 解離なしの完全燃焼を仮定)
    O/F = m_O2 / m_H2
    返り値: (T_c [K], モル組成 dict, 平均分子量 M_w [g/mol])
    """
    # 単位質量燃料あたりの O2 質量
    m_H2 = 1.0
    m_O2 = OF * m_H2
    n_H2_in = m_H2 / SPECIES['H2']['M']    # mol
    n_O2_in = m_O2 / SPECIES['O2']['M']    # mol

    # 化学量論: 2 H2 + O2 -> 2 H2O
    if n_H2_in >= 2.0 * n_O2_in:
        # 燃料リッチ: O2 が全て消費される
        n_H2O = 2.0 * n_O2_in              # 生成水
        n_H2  = n_H2_in - 2.0 * n_O2_in    # 残った H2
        n_O2  = 0.0
    else:
        # 酸化剤リッチ: H2 が全て消費される
        n_H2O = n_H2_in
        n_H2  = 0.0
        n_O2  = n_O2_in - 0.5 * n_H2_in

    moles = {'H2O': n_H2O, 'H2': n_H2, 'O2': n_O2}

    # 反応物の T_in におけるエンタルピー
    H_reactants = (n_H2_in * enthalpy('H2', T_in)
                   + n_O2_in * enthalpy('O2', T_in))

    # 断熱条件: H_products(T_c) = H_reactants(T_in)
    def residual(T):
        H_p = sum(moles[s] * enthalpy(s, T) for s in moles)
        return H_p - H_reactants

    # 二分法で T_c を求める
    T_lo, T_hi = 500.0, 6000.0
    if residual(T_lo) * residual(T_hi) > 0:
        T_c = T_lo if abs(residual(T_lo)) < abs(residual(T_hi)) else T_hi
    else:
        T_c = brentq(residual, T_lo, T_hi, xtol=tol)

    # 平均分子量
    total_mass = sum(moles[s] * SPECIES[s]['M'] for s in moles)
    total_mol  = sum(moles[s] for s in moles)
    M_w = total_mass / total_mol if total_mol > 0 else 0.0

    return T_c, moles, M_w

このソルバは「解離なしの完全燃焼」を仮定した素朴なモデルですが、これだけでも $O/F$ に対する $T_c$ と $M_w$ の振る舞いを把握するには十分です。本格的な計算では、上で述べた解離($H_2O \to OH + \frac{1}{2}H_2$ など)を含めて連立平衡を解く必要があり、結果として $T_c$ は数百 K 下がります。

比推力 $I_{sp}$ の計算

燃焼室の $T_c$, $M_w$ が決まったら、ノズルでの理想的な等エントロピー膨張から $I_{sp}$ を計算します。

def specific_impulse(T_c, M_w_g_per_mol, gamma=1.20,
                     P_c=10e6, P_e=0.1e6):
    """
    理想ロケットの比推力 [s] を計算
    T_c [K], M_w [g/mol], gamma 比熱比
    P_c 燃焼室圧 [Pa], P_e ノズル出口圧 [Pa]
    """
    M_w = M_w_g_per_mol * 1e-3   # kg/mol
    R   = R_U / M_w               # 比ガス定数 [J/(kg·K)]

    # 排気速度 V_e
    pressure_ratio = P_e / P_c
    inner = 1.0 - pressure_ratio ** ((gamma - 1.0) / gamma)
    V_e = np.sqrt(2.0 * gamma / (gamma - 1.0) * R * T_c * inner)

    Isp = V_e / G0
    return Isp, V_e

# テスト: SSMEに近い条件 (LH2/LOX, O/F=6, Pc=20 MPa, 真空相当 Pe=1 kPa)
T_c, moles, M_w = solve_adiabatic_flame_temperature_h2_o2(OF=6.0)
Isp, V_e = specific_impulse(T_c, M_w, gamma=1.20, P_c=20e6, P_e=1e3)
print(f"O/F=6.0 で T_c={T_c:.0f} K, M_w={M_w:.2f} g/mol")
print(f" -> V_e={V_e:.0f} m/s, Isp={Isp:.1f} s (真空相当)")

実行すると、おおよそ T_c ≈ 3,500-4,000 K、M_w ≈ 10-14 g/mol、Isp ≈ 450-470 s(真空、解離無視のため過大評価)が得られます。実機のSSMEは真空 $I_{sp}$ が 452 s ですので、解離損失と凍結流仮定のずれを考えるとオーダーは合っています。

$O/F$ 最適化

混合比 $O/F$ をスイープして、$I_{sp}$ の最大点を探します。

import matplotlib.pyplot as plt

OF_range = np.linspace(2.0, 10.0, 81)
T_c_list, M_w_list, Isp_list = [], [], []

for OF in OF_range:
    T_c, moles, M_w = solve_adiabatic_flame_temperature_h2_o2(OF=OF)
    Isp, _ = specific_impulse(T_c, M_w, gamma=1.20, P_c=20e6, P_e=1e3)
    T_c_list.append(T_c)
    M_w_list.append(M_w)
    Isp_list.append(Isp)

T_c_arr  = np.array(T_c_list)
M_w_arr  = np.array(M_w_list)
Isp_arr  = np.array(Isp_list)
OF_opt   = OF_range[np.argmax(Isp_arr)]

fig, axes = plt.subplots(3, 1, figsize=(8, 9), sharex=True)
axes[0].plot(OF_range, T_c_arr, 'r-', lw=2)
axes[0].axvline(8.0, color='gray', ls='--', alpha=0.5, label='stoichiometric O/F=8')
axes[0].set_ylabel('Chamber temperature $T_c$ [K]')
axes[0].legend(); axes[0].grid(alpha=0.3)

axes[1].plot(OF_range, M_w_arr, 'b-', lw=2)
axes[1].set_ylabel('Mean mol. weight $M_w$ [g/mol]')
axes[1].grid(alpha=0.3)

axes[2].plot(OF_range, Isp_arr, 'g-', lw=2)
axes[2].axvline(OF_opt, color='red', ls='--', alpha=0.7,
                label=f'optimal O/F={OF_opt:.2f}')
axes[2].set_xlabel('Mixture ratio O/F')
axes[2].set_ylabel('Vacuum $I_{sp}$ [s]')
axes[2].legend(); axes[2].grid(alpha=0.3)

plt.suptitle('LH2/LOX: chamber properties vs mixture ratio')
plt.tight_layout()
plt.savefig('of_optimization.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"最適混合比 O/F = {OF_opt:.2f} で Isp = {max(Isp_arr):.1f} s")
print(f"化学量論比 O/F = 8 では Isp = {Isp_arr[np.argmin(np.abs(OF_range - 8.0))]:.1f} s")

3つのグラフから、混合比に対する燃焼室の挙動が読み取れます。$T_c$ は化学量論比($O/F = 8$)付近でピークを取り、燃料リッチ・酸化剤リッチの両側で下がります。$M_w$ は燃料リッチ側で急速に下がる——余った水素($M_w = 2$)が分子量を引き下げるためです。そして$I_{sp}$ のピークは化学量論比よりずっと燃料リッチ側($O/F \approx 4-5$)にあります。これは $I_{sp} \propto \sqrt{T_c / M_w}$ の式における $T_c$ の若干の低下を、$M_w$ の大幅な減少が補って余りある領域だからです。実機の運転 $O/F \approx 6$ は、密度比推力(タンク体積)も考慮した妥協点です。

推進剤系の比較

LH2/LOX、CH4/LOX、RP-1/LOX、MMH/N2O4、APCP の5系統を、文献値ベースで比較します。素朴ソルバではこれらを統一的に扱えないので、実機相当の数値を直接与えます。

# 文献値ベースの代表的推進剤の燃焼室特性 (真空 Pc=10MPa, 完全膨張時)
PROPELLANTS = {
    'LH2/LOX':   {'T_c': 3400, 'M_w': 10.0, 'gamma': 1.22, 'rho_bulk':  360, 'OF_design': 6.0},
    'CH4/LOX':   {'T_c': 3550, 'M_w': 22.5, 'gamma': 1.16, 'rho_bulk':  830, 'OF_design': 3.6},
    'RP-1/LOX':  {'T_c': 3670, 'M_w': 23.4, 'gamma': 1.21, 'rho_bulk': 1030, 'OF_design': 2.3},
    'MMH/N2O4':  {'T_c': 3200, 'M_w': 21.5, 'gamma': 1.25, 'rho_bulk': 1190, 'OF_design': 2.1},
    'APCP':      {'T_c': 3000, 'M_w': 28.0, 'gamma': 1.18, 'rho_bulk': 1750, 'OF_design': None},
}

# 真空 Isp の計算
results = {}
for name, p in PROPELLANTS.items():
    Isp, V_e = specific_impulse(p['T_c'], p['M_w'], gamma=p['gamma'],
                                 P_c=10e6, P_e=1e3)
    # 密度比推力 = Isp × bulk密度 (タンク体積効率の指標)
    rho_Isp = Isp * p['rho_bulk']
    results[name] = {'Isp': Isp, 'V_e': V_e, 'rho_Isp': rho_Isp,
                     'rho_bulk': p['rho_bulk']}

# プロット: Isp と 密度Isp の比較
names = list(results.keys())
Isps  = [results[n]['Isp'] for n in names]
rhoIs = [results[n]['rho_Isp'] for n in names]

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
colors = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple']
axes[0].bar(names, Isps, color=colors)
axes[0].set_ylabel('Vacuum $I_{sp}$ [s]')
axes[0].set_title('Specific impulse (mass)')
axes[0].grid(axis='y', alpha=0.3)
axes[0].tick_params(axis='x', rotation=20)

axes[1].bar(names, rhoIs, color=colors)
axes[1].set_ylabel(r'Density $I_{sp}$ [s·kg/m³]')
axes[1].set_title('Density Isp (volumetric)')
axes[1].grid(axis='y', alpha=0.3)
axes[1].tick_params(axis='x', rotation=20)

plt.tight_layout()
plt.savefig('propellant_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

for n in names:
    r = results[n]
    print(f"{n:10s}: Isp={r['Isp']:6.1f} s, V_e={r['V_e']:5.0f} m/s, "
          f"rho_bulk={r['rho_bulk']:4d} kg/m^3, rho*Isp={r['rho_Isp']/1000:5.0f} (x10^3)")

この比較から、推進剤選定の本質的なトレードオフが見えてきます。LH2/LOX は $I_{sp}$ で圧勝しますが、$\rho \cdot I_{sp}$(密度比推力)では最下位です。これは液体水素のバルク密度がわずか 360 kg/m³ と非常に低いため、巨大なタンクが必要になることを意味します。Saturn V の第1段が RP-1/LOX、第2・3段が LH2/LOX という選択は、大気中の打ち上げで大きな構造重量を許容できない第1段は密度比推力を、真空中で構造比に余裕のある上段は $I_{sp}$ を優先したという多段設計の原理そのものです。

ノズル膨張と真空 $I_{sp}$

最後に、ノズル出口圧 $P_e$(膨張比 $\epsilon = A_e / A_t$ に対応)を変えたときの $I_{sp}$ を計算します。膨張比が大きい($P_e$ が小さい)ほど排気が完全に膨張して $I_{sp}$ が上がりますが、ノズルが巨大化します。

# ノズル出口圧 P_e をスイープ(膨張比に対応)
P_c = 10e6   # 燃焼室圧 10 MPa
P_e_range = np.logspace(2, 5, 50)   # 100 Pa (高高度) 〜 100 kPa (海面)

fig, ax = plt.subplots(figsize=(9, 6))
for name, p in PROPELLANTS.items():
    Isps = []
    for P_e in P_e_range:
        Isp, _ = specific_impulse(p['T_c'], p['M_w'], gamma=p['gamma'],
                                   P_c=P_c, P_e=P_e)
        Isps.append(Isp)
    ax.semilogx(P_e_range / 1000, Isps, lw=2, label=name)

ax.set_xlabel('Nozzle exit pressure $P_e$ [kPa]')
ax.set_ylabel('Specific impulse $I_{sp}$ [s]')
ax.set_title(f'$I_{{sp}}$ vs nozzle exit pressure (Pc = {P_c/1e6:.0f} MPa)')
ax.axvline(101.325, color='gray', ls='--', alpha=0.6, label='Sea-level')
ax.axvline(1.0, color='gray', ls=':', alpha=0.6, label='High altitude')
ax.legend(loc='best')
ax.grid(True, which='both', alpha=0.3)
plt.tight_layout()
plt.savefig('isp_vs_expansion.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、ノズル設計の指針が読み取れます。$P_e$ を下げるほど(膨張比 $\epsilon$ を大きくするほど)$I_{sp}$ は上昇しますが、その伸びは対数的で、海面(101 kPa)から高高度(1 kPa)で 50〜70 s 程度の改善です。SSMEのように真空向きの上段エンジンは膨張比 $\epsilon \approx 77$ という巨大ノズルを使う一方、第1段の海面用エンジン(Merlinなど)は $\epsilon \approx 16$ 程度に留めます——大気圧より低い $P_e$ にすると剥離(flow separation)が起きて性能が逆に悪化するからです。理論で導いた $V_e$ の式に登場する $[1 – (P_e/P_c)^{(\gamma-1)/\gamma}]$ の項が、まさにこの飽和曲線を作り出しています。

固体ロケットの内部弾道シミュレーション

最後に、Vieille則 $r = a P_c^n$ に基づく固体ロケットの内部弾道を簡易シミュレーションします。

def solid_motor_simulation(a, n, rho_p, A_t, c_star,
                            grain_initial_web, grain_burn_area_func,
                            t_max=120.0, dt=0.01):
    """
    固体ロケット内部弾道の簡易シミュレーション
    grain_burn_area_func(web): web距離(燃焼で削れた厚み)に対する燃焼面積を返す関数
    """
    web = 0.0
    t = 0.0
    times, P_c_list, Ab_list, thrust_list = [], [], [], []

    # 推力係数 Cf (一定とする簡略化)
    Cf = 1.6

    while t < t_max and web < grain_initial_web:
        A_b = grain_burn_area_func(web)
        if A_b <= 0:
            break
        # 定常 P_c (代数式から直接)
        P_c = (rho_p * a * c_star * A_b / A_t) ** (1.0 / (1.0 - n))
        # 燃焼速度
        r = a * P_c ** n
        # 推力
        thrust = Cf * P_c * A_t

        times.append(t)
        P_c_list.append(P_c)
        Ab_list.append(A_b)
        thrust_list.append(thrust)

        web += r * dt
        t += dt

    return (np.array(times), np.array(P_c_list),
            np.array(Ab_list), np.array(thrust_list))

# APCP の典型パラメータ
a       = 5.0e-5        # m/s/(Pa^n)
n       = 0.35          # 圧力指数
rho_p   = 1750.0        # kg/m^3
A_t     = 0.05          # m^2 (スロート面積)
c_star  = 1550.0        # m/s
L_grain = 5.0           # m (グレイン長)
R_outer = 0.5           # m (外径)
R_inner_0 = 0.1         # m (初期内径)
web_total = R_outer - R_inner_0

# 3種類のグレイン形状: 円筒孔 (プログレッシブ), 星型近似 (ニュートラル), 急減形状 (リグレッシブ)
def grain_cylindrical(web):
    R_inner = R_inner_0 + web
    if R_inner >= R_outer:
        return 0.0
    return 2 * np.pi * R_inner * L_grain   # 内壁の側面積

def grain_neutral(web):
    # 星型は内壁面積をほぼ一定に保つよう設計される(簡略化: ほぼ定数)
    return 2 * np.pi * (R_inner_0 + 0.05) * L_grain * 1.2

def grain_regressive(web):
    R_inner = R_inner_0 + web
    if R_inner >= R_outer:
        return 0.0
    # 初期に大きく、後で急減する形状(簡略化: 平方根で線形に近い減少)
    return 2 * np.pi * R_outer * L_grain * (1.0 - web / web_total) ** 0.5 * 2.0

fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
for label, fn in [('Progressive (cyl)', grain_cylindrical),
                  ('Neutral (star)',    grain_neutral),
                  ('Regressive',         grain_regressive)]:
    t, Pc, Ab, F = solid_motor_simulation(a, n, rho_p, A_t, c_star,
                                           web_total, fn)
    axes[0].plot(t, Pc/1e6, lw=2, label=label)
    axes[1].plot(t, F/1e3,  lw=2, label=label)

axes[0].set_ylabel('Chamber pressure $P_c$ [MPa]')
axes[0].legend(); axes[0].grid(alpha=0.3)
axes[0].set_title('Solid motor internal ballistics')
axes[1].set_xlabel('Time [s]')
axes[1].set_ylabel('Thrust [kN]')
axes[1].legend(); axes[1].grid(alpha=0.3)
plt.tight_layout()
plt.savefig('solid_motor_profiles.png', dpi=150, bbox_inches='tight')
plt.show()

3つの推力プロファイルから、グレイン設計の効果がはっきり読み取れます。円筒孔(プログレッシブ)は時間とともに内径が拡大し、燃焼面積が増えるため推力が単調増加します。星型(ニュートラル)は意図的に燃焼面積を一定に保つ形状で、ほぼ平坦な推力曲線を実現します。リグレッシブは初期に大推力、後半で減少し、空気抵抗の大きい打ち上げ初期に高推力を出して構造負荷の高い領域では推力を絞る——Space Shuttle SRBの「マックスQ回避ノッチ」と同じ思想です。Vieille則 $r = a P_c^n$ と燃焼面積関数 $A_b(t)$ だけで、これだけ多様な推力波形を事前にプログラムできるのが固体ロケットの本質です。

実機への応用

ここまで導いてきた理論が、実際のロケットエンジンでどう体現されているかを見てみましょう。

  • Saturn V F-1(RP-1/LOX, ガスジェネレータ): アポロ月着陸計画の象徴。海面推力 6,770 kN、$I_{sp}$ は海面 263 s、真空 304 s。$P_c$ は約 7 MPa とそれほど高くない(製造性重視)。RP-1の高密度(820 kg/m³)と LOX で密度比推力に優れ、第1段に適合。
  • Space Shuttle SSME(LH2/LOX, 段燃焼): $P_c$ が 20.6 MPa という当時最高クラスの高圧、真空 $I_{sp}$ 452 s。再使用前提のため、ターボポンプを取り外して整備するアーキテクチャ。段燃焼サイクルにより GG サイクル比で約 +30 s の $I_{sp}$ 改善を達成。
  • SpaceX Merlin(RP-1/LOX, ガスジェネレータ): 製造コスト最優先で GG サイクルを選択。Falcon 9 第1段に 9 基クラスター。海面 $I_{sp}$ 282 s、真空 348 s。$P_c$ は 9.7 MPa 程度。9基あることで1基故障時の冗長性も確保。
  • SpaceX Raptor(CH4/LOX, フルフロー段燃焼): メタン採用は再使用時のコーキング(炭素析出)を避けるため。FFSC により燃料/酸化剤両方のターボポンプを最適化、$P_c$ が約 30 MPa という史上最高クラスを達成。Starship に搭載。
  • Rocket Lab Rutherford(RP-1/LOX, エレクトリックポンプ): 推力 24 kN の小型エンジンを Electron 第1段に 9 基。3Dプリント主体、ターボポンプ無しという徹底した単純化で、小型ロケット市場を切り開いた。
  • JAXA LE-9(LH2/LOX, エキスパンダーブリード): H3ロケット第1段用。$P_c$ 約 10 MPa、真空 $I_{sp}$ 425 s。エキスパンダーブリードは段燃焼ほど高性能ではないが、燃焼器を持たないシンプルさで信頼性とコストを両立。
  • M-V / H3 SRB-3(APCP, 固体): 純粋な固体推進剤。M-V は世界最大級の3段全段固体で惑星探査機を打ち上げ、SRB-3 は H3 のブースターとして液体エンジンを補助。$I_{sp}$ は 280 s 程度だが、構造重量比に優れる。

これらの選択は、ロケット全体の用途(打ち上げ規模、再使用の有無、ペイロード、コスト)と、本記事で見てきた燃焼室の物理($T_c$、$M_w$、サイクル、グレイン)の交差点で決まっています。同じ「化学推進」という枠の中で、これほど多様な解が存在するのは、トレードオフ空間の広さとミッション要求の多様さの帰結なのです。

まとめ

本記事では、化学推進エンジンの3分類と燃焼室の熱力学について、原理から実装まで解説しました。

  • 3分類: 液体(高比推力・高制御性・高複雑性)、固体(高信頼性・即応性・低制御性)、ハイブリッド(中間解)。選択は性能・制御性・信頼性・コストのトレードオフ
  • 燃焼室の熱力学: 排気速度 $V_e \propto \sqrt{T_c / M_w}$ から、燃焼温度 $T_c$ を上げ、平均分子量 $M_w$ を下げることが性能向上の本質。混合比 $O/F$ には $I_{sp}$ を最大化する最適点があり、化学量論比よりも燃料リッチ側にある(LH2/LOX で $O/F \approx 4-5$)
  • 解離損失: 3,000 K 以上では $H_2O$ などが解離して $T_c$ が下がるため、本格的な性能予測には化学平衡ソルバが必要
  • 液体エンジンサイクル: ガスジェネレータ(シンプル・F-1、Merlin)、段燃焼(高性能・SSME、Raptor)、エキスパンダー(高信頼性・RL10、LE-9)、エレクトリックポンプ(超単純・Rutherford)の4種が主流
  • 固体推進剤の燃焼速度則: $r = a P_c^n$。$n < 1$ で安定動作。グレイン形状で推力プロファイル(プログレッシブ・ニュートラル・リグレッシブ)を事前にプログラムする
  • ノズル膨張比: $P_e$ を下げる(膨張比を大きくする)ほど $I_{sp}$ は対数的に上昇。海面用は剥離回避のため $\epsilon \approx 16$、上段用は $\epsilon \approx 77$ といった使い分け

化学推進エンジンは、熱力学・化学・流体力学・構造・材料が交差する総合工学の結晶です。本記事で見た理論を出発点にして、より詳細な NASA CEA や RPA(Rocket Propulsion Analysis)のような専用ツールに進めば、実機設計に近い性能予測ができるようになります。

次のステップとして、以下の記事も参考にしてください。