Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/aerospace/rocket_propulsion.tex
51 views
unlisted
1
\documentclass[a4paper, 11pt]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath, amssymb}
5
\usepackage{graphicx}
6
\usepackage{siunitx}
7
\usepackage{booktabs}
8
\usepackage{algorithm2e}
9
\usepackage{subcaption}
10
\usepackage[makestderr]{pythontex}
11
12
% Theorem environments for lab report style
13
\newtheorem{definition}{Definition}
14
\newtheorem{theorem}{Theorem}
15
\newtheorem{remark}{Remark}
16
17
\title{Rocket Propulsion Analysis: Thrust Curves, Specific Impulse, and Staging Optimization\\
18
\large A Comprehensive Study of Chemical Rocket Performance}
19
\author{Propulsion Systems Division\\Computational Science Templates}
20
\date{\today}
21
22
\begin{document}
23
\maketitle
24
25
\begin{abstract}
26
This laboratory report presents a comprehensive analysis of rocket propulsion systems. We examine thrust curves for different propellant combinations, compare specific impulse values, and optimize multi-stage rocket configurations using the Tsiolkovsky equation. The analysis includes propellant mass flow rates, chamber pressure effects, and payload fraction optimization for orbital insertion missions.
27
\end{abstract}
28
29
\section{Objectives}
30
\begin{enumerate}
31
\item Analyze thrust and specific impulse for various propellant combinations
32
\item Compare single-stage and multi-stage rocket performance
33
\item Optimize staging ratios for maximum payload fraction
34
\item Evaluate thrust-to-weight ratios for different mission profiles
35
\end{enumerate}
36
37
\section{Theoretical Background}
38
39
\begin{definition}[Specific Impulse]
40
Specific impulse is the total impulse per unit weight of propellant:
41
\begin{equation}
42
I_{sp} = \frac{F}{\dot{m} g_0} = \frac{v_e}{g_0}
43
\end{equation}
44
where $F$ is thrust, $\dot{m}$ is mass flow rate, and $v_e$ is effective exhaust velocity.
45
\end{definition}
46
47
\subsection{Tsiolkovsky Rocket Equation}
48
The ideal velocity change achievable by a rocket:
49
\begin{equation}
50
\Delta v = v_e \ln\left(\frac{m_0}{m_f}\right) = I_{sp} g_0 \ln(MR)
51
\end{equation}
52
where $MR = m_0/m_f$ is the mass ratio.
53
54
\subsection{Thrust Equation}
55
\begin{theorem}[Rocket Thrust]
56
The thrust generated by a rocket engine:
57
\begin{equation}
58
F = \dot{m} v_e + (p_e - p_a) A_e
59
\end{equation}
60
where $p_e$ is exit pressure, $p_a$ is ambient pressure, and $A_e$ is exit area.
61
\end{theorem}
62
63
\subsection{Staging Analysis}
64
For an $n$-stage rocket with equal structural coefficients:
65
\begin{equation}
66
\lambda_{payload} = \left[\frac{1 - \epsilon \cdot MR_{stage}}{MR_{stage}}\right]^n
67
\end{equation}
68
where $\epsilon$ is the structural coefficient (typically 0.05-0.15).
69
70
\section{Computational Analysis}
71
72
\begin{pycode}
73
import numpy as np
74
import matplotlib.pyplot as plt
75
from scipy.optimize import minimize_scalar
76
plt.rc('text', usetex=True)
77
plt.rc('font', family='serif')
78
79
np.random.seed(42)
80
81
g0 = 9.81 # m/s^2
82
83
# Propellant data: Isp (s), density (kg/m^3), cost index
84
propellants = {
85
'Solid (APCP)': {'Isp': 265, 'density': 1800, 'T_chamber': 3400},
86
'RP-1/LOX': {'Isp': 353, 'density': 1030, 'T_chamber': 3670},
87
'LH2/LOX': {'Isp': 455, 'density': 360, 'T_chamber': 3250},
88
'MMH/N2O4': {'Isp': 340, 'density': 1200, 'T_chamber': 3000},
89
'CH4/LOX': {'Isp': 380, 'density': 830, 'T_chamber': 3550}
90
}
91
92
# Mission delta-v requirements (m/s)
93
missions = {
94
'LEO': 9400,
95
'GTO': 13500,
96
'TLI': 15500,
97
'Mars Transfer': 18000
98
}
99
100
# Single-stage payload fraction
101
def single_stage_payload(dv, Isp, epsilon=0.10):
102
ve = Isp * g0
103
MR = np.exp(dv / ve)
104
if MR <= 1:
105
return 0
106
payload_frac = (1 - epsilon * MR) / MR
107
return max(0, payload_frac)
108
109
# Multi-stage payload fraction
110
def multi_stage_payload(dv, Isp, n_stages, epsilon=0.08):
111
ve = Isp * g0
112
dv_per_stage = dv / n_stages
113
MR_stage = np.exp(dv_per_stage / ve)
114
115
if MR_stage <= 1:
116
return 0
117
118
stage_payload = (1 - epsilon * MR_stage) / MR_stage
119
if stage_payload <= 0:
120
return 0
121
122
return stage_payload ** n_stages
123
124
# Thrust curve profiles
125
def thrust_curve(t, F_max, t_burn, profile='constant'):
126
thrust = np.zeros_like(t)
127
burning = t <= t_burn
128
129
if profile == 'constant':
130
thrust[burning] = F_max
131
elif profile == 'regressive':
132
thrust[burning] = F_max * (1 - 0.3 * t[burning]/t_burn)
133
elif profile == 'progressive':
134
thrust[burning] = F_max * (0.7 + 0.3 * t[burning]/t_burn)
135
elif profile == 'boost-sustain':
136
boost = t <= t_burn * 0.3
137
sustain = (t > t_burn * 0.3) & (t <= t_burn)
138
thrust[boost] = F_max
139
thrust[sustain] = F_max * 0.5
140
141
return thrust
142
143
# Time array
144
t = np.linspace(0, 150, 1000)
145
F_max = 2e6 # 2 MN
146
t_burn = 120 # s
147
148
# Generate thrust curves
149
profiles = ['constant', 'regressive', 'progressive', 'boost-sustain']
150
thrust_curves = {p: thrust_curve(t, F_max, t_burn, p) for p in profiles}
151
152
# Calculate total impulse for each profile
153
total_impulse = {p: np.trapz(thrust_curves[p], t) for p in profiles}
154
155
# Staging analysis
156
n_stages_range = range(1, 6)
157
staging_results = {}
158
for mission, dv in missions.items():
159
staging_results[mission] = []
160
for n in n_stages_range:
161
pf = multi_stage_payload(dv, 455, n, 0.08) # LH2/LOX
162
staging_results[mission].append(pf * 100)
163
164
# Optimal staging ratio
165
def optimal_stage_ratio(dv_total, Isp, n_stages, epsilon):
166
"""Find optimal mass ratio per stage."""
167
ve = Isp * g0
168
169
def neg_payload(MR):
170
if MR <= 1 or MR > 20:
171
return 1e10
172
dv_achieved = n_stages * ve * np.log(MR)
173
if dv_achieved < dv_total:
174
return 1e10
175
stage_pf = (1 - epsilon * MR) / MR
176
if stage_pf <= 0:
177
return 1e10
178
return -stage_pf ** n_stages
179
180
result = minimize_scalar(neg_payload, bounds=(1.5, 15), method='bounded')
181
return result.x, -result.fun
182
183
# Create comprehensive visualization
184
fig = plt.figure(figsize=(14, 12))
185
186
# Plot 1: Thrust curves
187
ax1 = fig.add_subplot(2, 3, 1)
188
colors = ['blue', 'red', 'green', 'purple']
189
for prof, color in zip(profiles, colors):
190
ax1.plot(t, thrust_curves[prof]/1e6, color=color, linewidth=2,
191
label=prof.replace('-', ' ').title())
192
ax1.set_xlabel('Time (s)')
193
ax1.set_ylabel('Thrust (MN)')
194
ax1.set_title('Thrust Curve Profiles')
195
ax1.legend(fontsize=8)
196
ax1.grid(True, alpha=0.3)
197
198
# Plot 2: Propellant comparison
199
ax2 = fig.add_subplot(2, 3, 2)
200
names = list(propellants.keys())
201
isps = [propellants[n]['Isp'] for n in names]
202
densities = [propellants[n]['density'] for n in names]
203
204
x = np.arange(len(names))
205
width = 0.35
206
bars1 = ax2.bar(x - width/2, isps, width, label='$I_{sp}$ (s)', color='steelblue')
207
ax2_twin = ax2.twinx()
208
bars2 = ax2_twin.bar(x + width/2, densities, width, label='$\\rho$ (kg/m$^3$)', color='coral')
209
ax2.set_xlabel('Propellant')
210
ax2.set_ylabel('$I_{sp}$ (s)', color='steelblue')
211
ax2_twin.set_ylabel('Density (kg/m$^3$)', color='coral')
212
ax2.set_xticks(x)
213
ax2.set_xticklabels([n.split()[0] for n in names], rotation=45, ha='right')
214
ax2.set_title('Propellant Performance')
215
ax2.legend(loc='upper left', fontsize=7)
216
ax2_twin.legend(loc='upper right', fontsize=7)
217
218
# Plot 3: Single-stage performance
219
ax3 = fig.add_subplot(2, 3, 3)
220
dv_range = np.linspace(1000, 12000, 100)
221
for name in ['RP-1/LOX', 'LH2/LOX', 'CH4/LOX']:
222
pf = [single_stage_payload(dv, propellants[name]['Isp']) * 100 for dv in dv_range]
223
ax3.plot(dv_range/1000, pf, linewidth=2, label=name)
224
ax3.axvline(x=9.4, color='gray', linestyle='--', alpha=0.7)
225
ax3.text(9.5, 12, 'LEO', fontsize=8)
226
ax3.set_xlabel(r'$\Delta v$ (km/s)')
227
ax3.set_ylabel('Payload Fraction (\\%)')
228
ax3.set_title('Single-Stage Performance')
229
ax3.legend(fontsize=8)
230
ax3.grid(True, alpha=0.3)
231
ax3.set_ylim([0, 25])
232
233
# Plot 4: Staging benefits
234
ax4 = fig.add_subplot(2, 3, 4)
235
markers = ['o', 's', '^', 'd']
236
for (mission, results), marker in zip(staging_results.items(), markers):
237
if mission in ['LEO', 'GTO', 'Mars Transfer']:
238
ax4.plot(list(n_stages_range), results, marker=marker,
239
linewidth=2, markersize=6, label=mission)
240
ax4.set_xlabel('Number of Stages')
241
ax4.set_ylabel('Payload Fraction (\\%)')
242
ax4.set_title('Staging Optimization (LH2/LOX)')
243
ax4.legend(fontsize=8)
244
ax4.grid(True, alpha=0.3)
245
ax4.set_xticks(list(n_stages_range))
246
247
# Plot 5: Mass ratio requirements
248
ax5 = fig.add_subplot(2, 3, 5)
249
Isp_range = np.linspace(250, 500, 100)
250
for mission in ['LEO', 'GTO', 'TLI']:
251
MR = np.exp(missions[mission] / (Isp_range * g0))
252
ax5.plot(Isp_range, MR, linewidth=2, label=mission)
253
ax5.set_xlabel('$I_{sp}$ (s)')
254
ax5.set_ylabel('Required Mass Ratio')
255
ax5.set_title('Mass Ratio vs Specific Impulse')
256
ax5.legend(fontsize=8)
257
ax5.grid(True, alpha=0.3)
258
ax5.set_ylim([0, 100])
259
260
# Plot 6: Delta-v budget breakdown
261
ax6 = fig.add_subplot(2, 3, 6)
262
mission_names = list(missions.keys())
263
dvs = [missions[m]/1000 for m in mission_names]
264
colors = plt.cm.viridis(np.linspace(0.2, 0.8, len(missions)))
265
bars = ax6.bar(mission_names, dvs, color=colors)
266
ax6.set_xlabel('Mission')
267
ax6.set_ylabel(r'$\Delta v$ (km/s)')
268
ax6.set_title('Mission Requirements')
269
for bar, dv in zip(bars, dvs):
270
ax6.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3,
271
f'{dv:.1f}', ha='center', va='bottom', fontsize=9)
272
ax6.grid(True, alpha=0.3, axis='y')
273
274
plt.tight_layout()
275
plt.savefig('rocket_propulsion_plot.pdf', bbox_inches='tight', dpi=150)
276
print(r'\begin{center}')
277
print(r'\includegraphics[width=\textwidth]{rocket_propulsion_plot.pdf}')
278
print(r'\end{center}')
279
plt.close()
280
281
# Key results
282
best_2stage = staging_results['LEO'][1]
283
best_3stage = staging_results['LEO'][2]
284
opt_MR, opt_pf = optimal_stage_ratio(9400, 455, 2, 0.08)
285
\end{pycode}
286
287
\section{Algorithm}
288
289
\begin{algorithm}[H]
290
\SetAlgoLined
291
\KwIn{Mission $\Delta v$, propellant $I_{sp}$, number of stages $n$, structural coefficient $\epsilon$}
292
\KwOut{Payload fraction $\lambda$}
293
$v_e \leftarrow I_{sp} \cdot g_0$\;
294
$\Delta v_{stage} \leftarrow \Delta v / n$\;
295
$MR_{stage} \leftarrow \exp(\Delta v_{stage} / v_e)$\;
296
$\lambda_{stage} \leftarrow (1 - \epsilon \cdot MR_{stage}) / MR_{stage}$\;
297
$\lambda \leftarrow \lambda_{stage}^n$\;
298
\Return{$\lambda$}
299
\caption{Multi-Stage Payload Fraction Calculation}
300
\end{algorithm}
301
302
\section{Results and Discussion}
303
304
\subsection{Propellant Performance}
305
306
\begin{pycode}
307
print(r'\begin{table}[h]')
308
print(r'\centering')
309
print(r'\caption{Propellant Performance Comparison}')
310
print(r'\begin{tabular}{lccc}')
311
print(r'\toprule')
312
print(r'Propellant & $I_{sp}$ (s) & Density (kg/m$^3$) & $\rho \cdot I_{sp}$ \\')
313
print(r'\midrule')
314
for name, data in propellants.items():
315
density_isp = data['Isp'] * data['density'] / 1000
316
print(f"{name} & {data['Isp']} & {data['density']} & {density_isp:.0f} \\\\")
317
print(r'\bottomrule')
318
print(r'\end{tabular}')
319
print(r'\end{table}')
320
\end{pycode}
321
322
\begin{remark}[Propellant Selection Trade-offs]
323
LH2/LOX provides the highest $I_{sp}$ (455 s) but lowest density, requiring larger tanks. RP-1/LOX offers good performance with higher density, making it preferred for first stages. CH4/LOX (Methalox) is gaining popularity for its balance of performance, storability, and potential for in-situ resource utilization on Mars.
324
\end{remark}
325
326
\subsection{Staging Benefits}
327
328
For LEO insertion ($\Delta v = 9.4$ km/s) with LH2/LOX propellant:
329
\begin{itemize}
330
\item Single stage: \py{f"{staging_results['LEO'][0]:.2f}"}\% payload fraction
331
\item Two stages: \py{f"{best_2stage:.2f}"}\% payload fraction
332
\item Three stages: \py{f"{best_3stage:.2f}"}\% payload fraction
333
\end{itemize}
334
335
Optimal mass ratio for 2-stage LEO: $MR = $ \py{f"{opt_MR:.2f}"} yielding \py{f"{opt_pf*100:.2f}"}\% payload.
336
337
\subsection{Thrust Profile Analysis}
338
339
\begin{pycode}
340
print(r'\begin{table}[h]')
341
print(r'\centering')
342
print(r'\caption{Thrust Profile Total Impulse Comparison}')
343
print(r'\begin{tabular}{lc}')
344
print(r'\toprule')
345
print(r'Profile & Total Impulse (MN$\cdot$s) \\')
346
print(r'\midrule')
347
for prof in profiles:
348
I_total = total_impulse[prof] / 1e6
349
print(f"{prof.replace('-', ' ').title()} & {I_total:.1f} \\\\")
350
print(r'\bottomrule')
351
print(r'\end{tabular}')
352
print(r'\end{table}')
353
\end{pycode}
354
355
\begin{remark}[Thrust Profile Selection]
356
Regressive profiles (common in solid rockets) provide higher initial thrust for liftoff, while boost-sustain profiles optimize gravity losses. Progressive profiles are rare but can reduce initial structural loads.
357
\end{remark}
358
359
\section{Limitations and Extensions}
360
361
\subsection{Model Limitations}
362
\begin{enumerate}
363
\item \textbf{Ideal rocket}: Neglects nozzle losses, incomplete combustion
364
\item \textbf{Constant $I_{sp}$}: Real engines vary with altitude
365
\item \textbf{Gravity/drag losses}: Not included in $\Delta v$ budget
366
\item \textbf{Fixed structural coefficient}: Varies with stage size
367
\end{enumerate}
368
369
\subsection{Possible Extensions}
370
\begin{itemize}
371
\item Trajectory optimization with gravity and drag
372
\item Parallel staging (boosters) analysis
373
\item Reusability impact on payload fraction
374
\item Electric propulsion for upper stages
375
\end{itemize}
376
377
\section{Conclusions}
378
\begin{itemize}
379
\item LH2/LOX provides best $I_{sp}$ (455 s) for upper stages
380
\item Staging dramatically improves payload fraction (factor of 2-3)
381
\item Optimal number of stages is 2-3 for most Earth-orbit missions
382
\item Propellant density matters for first stages (tank mass)
383
\item Modern trends favor CH4/LOX for reusability and ISRU
384
\end{itemize}
385
386
\section*{References}
387
\begin{itemize}
388
\item Sutton, G. P., \& Biblarz, O. (2016). \textit{Rocket Propulsion Elements}. Wiley.
389
\item Turner, M. J. L. (2008). \textit{Rocket and Spacecraft Propulsion}. Springer.
390
\item Humble, R. W., Henry, G. N., \& Larson, W. J. (1995). \textit{Space Propulsion Analysis and Design}. McGraw-Hill.
391
\end{itemize}
392
393
\end{document}
394
395