Path: blob/main/latex-templates/templates/aerospace/rocket_propulsion.tex
51 views
unlisted
\documentclass[a4paper, 11pt]{article}1\usepackage[utf8]{inputenc}2\usepackage[T1]{fontenc}3\usepackage{amsmath, amssymb}4\usepackage{graphicx}5\usepackage{siunitx}6\usepackage{booktabs}7\usepackage{algorithm2e}8\usepackage{subcaption}9\usepackage[makestderr]{pythontex}1011% Theorem environments for lab report style12\newtheorem{definition}{Definition}13\newtheorem{theorem}{Theorem}14\newtheorem{remark}{Remark}1516\title{Rocket Propulsion Analysis: Thrust Curves, Specific Impulse, and Staging Optimization\\17\large A Comprehensive Study of Chemical Rocket Performance}18\author{Propulsion Systems Division\\Computational Science Templates}19\date{\today}2021\begin{document}22\maketitle2324\begin{abstract}25This 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.26\end{abstract}2728\section{Objectives}29\begin{enumerate}30\item Analyze thrust and specific impulse for various propellant combinations31\item Compare single-stage and multi-stage rocket performance32\item Optimize staging ratios for maximum payload fraction33\item Evaluate thrust-to-weight ratios for different mission profiles34\end{enumerate}3536\section{Theoretical Background}3738\begin{definition}[Specific Impulse]39Specific impulse is the total impulse per unit weight of propellant:40\begin{equation}41I_{sp} = \frac{F}{\dot{m} g_0} = \frac{v_e}{g_0}42\end{equation}43where $F$ is thrust, $\dot{m}$ is mass flow rate, and $v_e$ is effective exhaust velocity.44\end{definition}4546\subsection{Tsiolkovsky Rocket Equation}47The ideal velocity change achievable by a rocket:48\begin{equation}49\Delta v = v_e \ln\left(\frac{m_0}{m_f}\right) = I_{sp} g_0 \ln(MR)50\end{equation}51where $MR = m_0/m_f$ is the mass ratio.5253\subsection{Thrust Equation}54\begin{theorem}[Rocket Thrust]55The thrust generated by a rocket engine:56\begin{equation}57F = \dot{m} v_e + (p_e - p_a) A_e58\end{equation}59where $p_e$ is exit pressure, $p_a$ is ambient pressure, and $A_e$ is exit area.60\end{theorem}6162\subsection{Staging Analysis}63For an $n$-stage rocket with equal structural coefficients:64\begin{equation}65\lambda_{payload} = \left[\frac{1 - \epsilon \cdot MR_{stage}}{MR_{stage}}\right]^n66\end{equation}67where $\epsilon$ is the structural coefficient (typically 0.05-0.15).6869\section{Computational Analysis}7071\begin{pycode}72import numpy as np73import matplotlib.pyplot as plt74from scipy.optimize import minimize_scalar75plt.rc('text', usetex=True)76plt.rc('font', family='serif')7778np.random.seed(42)7980g0 = 9.81 # m/s^28182# Propellant data: Isp (s), density (kg/m^3), cost index83propellants = {84'Solid (APCP)': {'Isp': 265, 'density': 1800, 'T_chamber': 3400},85'RP-1/LOX': {'Isp': 353, 'density': 1030, 'T_chamber': 3670},86'LH2/LOX': {'Isp': 455, 'density': 360, 'T_chamber': 3250},87'MMH/N2O4': {'Isp': 340, 'density': 1200, 'T_chamber': 3000},88'CH4/LOX': {'Isp': 380, 'density': 830, 'T_chamber': 3550}89}9091# Mission delta-v requirements (m/s)92missions = {93'LEO': 9400,94'GTO': 13500,95'TLI': 15500,96'Mars Transfer': 1800097}9899# Single-stage payload fraction100def single_stage_payload(dv, Isp, epsilon=0.10):101ve = Isp * g0102MR = np.exp(dv / ve)103if MR <= 1:104return 0105payload_frac = (1 - epsilon * MR) / MR106return max(0, payload_frac)107108# Multi-stage payload fraction109def multi_stage_payload(dv, Isp, n_stages, epsilon=0.08):110ve = Isp * g0111dv_per_stage = dv / n_stages112MR_stage = np.exp(dv_per_stage / ve)113114if MR_stage <= 1:115return 0116117stage_payload = (1 - epsilon * MR_stage) / MR_stage118if stage_payload <= 0:119return 0120121return stage_payload ** n_stages122123# Thrust curve profiles124def thrust_curve(t, F_max, t_burn, profile='constant'):125thrust = np.zeros_like(t)126burning = t <= t_burn127128if profile == 'constant':129thrust[burning] = F_max130elif profile == 'regressive':131thrust[burning] = F_max * (1 - 0.3 * t[burning]/t_burn)132elif profile == 'progressive':133thrust[burning] = F_max * (0.7 + 0.3 * t[burning]/t_burn)134elif profile == 'boost-sustain':135boost = t <= t_burn * 0.3136sustain = (t > t_burn * 0.3) & (t <= t_burn)137thrust[boost] = F_max138thrust[sustain] = F_max * 0.5139140return thrust141142# Time array143t = np.linspace(0, 150, 1000)144F_max = 2e6 # 2 MN145t_burn = 120 # s146147# Generate thrust curves148profiles = ['constant', 'regressive', 'progressive', 'boost-sustain']149thrust_curves = {p: thrust_curve(t, F_max, t_burn, p) for p in profiles}150151# Calculate total impulse for each profile152total_impulse = {p: np.trapz(thrust_curves[p], t) for p in profiles}153154# Staging analysis155n_stages_range = range(1, 6)156staging_results = {}157for mission, dv in missions.items():158staging_results[mission] = []159for n in n_stages_range:160pf = multi_stage_payload(dv, 455, n, 0.08) # LH2/LOX161staging_results[mission].append(pf * 100)162163# Optimal staging ratio164def optimal_stage_ratio(dv_total, Isp, n_stages, epsilon):165"""Find optimal mass ratio per stage."""166ve = Isp * g0167168def neg_payload(MR):169if MR <= 1 or MR > 20:170return 1e10171dv_achieved = n_stages * ve * np.log(MR)172if dv_achieved < dv_total:173return 1e10174stage_pf = (1 - epsilon * MR) / MR175if stage_pf <= 0:176return 1e10177return -stage_pf ** n_stages178179result = minimize_scalar(neg_payload, bounds=(1.5, 15), method='bounded')180return result.x, -result.fun181182# Create comprehensive visualization183fig = plt.figure(figsize=(14, 12))184185# Plot 1: Thrust curves186ax1 = fig.add_subplot(2, 3, 1)187colors = ['blue', 'red', 'green', 'purple']188for prof, color in zip(profiles, colors):189ax1.plot(t, thrust_curves[prof]/1e6, color=color, linewidth=2,190label=prof.replace('-', ' ').title())191ax1.set_xlabel('Time (s)')192ax1.set_ylabel('Thrust (MN)')193ax1.set_title('Thrust Curve Profiles')194ax1.legend(fontsize=8)195ax1.grid(True, alpha=0.3)196197# Plot 2: Propellant comparison198ax2 = fig.add_subplot(2, 3, 2)199names = list(propellants.keys())200isps = [propellants[n]['Isp'] for n in names]201densities = [propellants[n]['density'] for n in names]202203x = np.arange(len(names))204width = 0.35205bars1 = ax2.bar(x - width/2, isps, width, label='$I_{sp}$ (s)', color='steelblue')206ax2_twin = ax2.twinx()207bars2 = ax2_twin.bar(x + width/2, densities, width, label='$\\rho$ (kg/m$^3$)', color='coral')208ax2.set_xlabel('Propellant')209ax2.set_ylabel('$I_{sp}$ (s)', color='steelblue')210ax2_twin.set_ylabel('Density (kg/m$^3$)', color='coral')211ax2.set_xticks(x)212ax2.set_xticklabels([n.split()[0] for n in names], rotation=45, ha='right')213ax2.set_title('Propellant Performance')214ax2.legend(loc='upper left', fontsize=7)215ax2_twin.legend(loc='upper right', fontsize=7)216217# Plot 3: Single-stage performance218ax3 = fig.add_subplot(2, 3, 3)219dv_range = np.linspace(1000, 12000, 100)220for name in ['RP-1/LOX', 'LH2/LOX', 'CH4/LOX']:221pf = [single_stage_payload(dv, propellants[name]['Isp']) * 100 for dv in dv_range]222ax3.plot(dv_range/1000, pf, linewidth=2, label=name)223ax3.axvline(x=9.4, color='gray', linestyle='--', alpha=0.7)224ax3.text(9.5, 12, 'LEO', fontsize=8)225ax3.set_xlabel(r'$\Delta v$ (km/s)')226ax3.set_ylabel('Payload Fraction (\\%)')227ax3.set_title('Single-Stage Performance')228ax3.legend(fontsize=8)229ax3.grid(True, alpha=0.3)230ax3.set_ylim([0, 25])231232# Plot 4: Staging benefits233ax4 = fig.add_subplot(2, 3, 4)234markers = ['o', 's', '^', 'd']235for (mission, results), marker in zip(staging_results.items(), markers):236if mission in ['LEO', 'GTO', 'Mars Transfer']:237ax4.plot(list(n_stages_range), results, marker=marker,238linewidth=2, markersize=6, label=mission)239ax4.set_xlabel('Number of Stages')240ax4.set_ylabel('Payload Fraction (\\%)')241ax4.set_title('Staging Optimization (LH2/LOX)')242ax4.legend(fontsize=8)243ax4.grid(True, alpha=0.3)244ax4.set_xticks(list(n_stages_range))245246# Plot 5: Mass ratio requirements247ax5 = fig.add_subplot(2, 3, 5)248Isp_range = np.linspace(250, 500, 100)249for mission in ['LEO', 'GTO', 'TLI']:250MR = np.exp(missions[mission] / (Isp_range * g0))251ax5.plot(Isp_range, MR, linewidth=2, label=mission)252ax5.set_xlabel('$I_{sp}$ (s)')253ax5.set_ylabel('Required Mass Ratio')254ax5.set_title('Mass Ratio vs Specific Impulse')255ax5.legend(fontsize=8)256ax5.grid(True, alpha=0.3)257ax5.set_ylim([0, 100])258259# Plot 6: Delta-v budget breakdown260ax6 = fig.add_subplot(2, 3, 6)261mission_names = list(missions.keys())262dvs = [missions[m]/1000 for m in mission_names]263colors = plt.cm.viridis(np.linspace(0.2, 0.8, len(missions)))264bars = ax6.bar(mission_names, dvs, color=colors)265ax6.set_xlabel('Mission')266ax6.set_ylabel(r'$\Delta v$ (km/s)')267ax6.set_title('Mission Requirements')268for bar, dv in zip(bars, dvs):269ax6.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3,270f'{dv:.1f}', ha='center', va='bottom', fontsize=9)271ax6.grid(True, alpha=0.3, axis='y')272273plt.tight_layout()274plt.savefig('rocket_propulsion_plot.pdf', bbox_inches='tight', dpi=150)275print(r'\begin{center}')276print(r'\includegraphics[width=\textwidth]{rocket_propulsion_plot.pdf}')277print(r'\end{center}')278plt.close()279280# Key results281best_2stage = staging_results['LEO'][1]282best_3stage = staging_results['LEO'][2]283opt_MR, opt_pf = optimal_stage_ratio(9400, 455, 2, 0.08)284\end{pycode}285286\section{Algorithm}287288\begin{algorithm}[H]289\SetAlgoLined290\KwIn{Mission $\Delta v$, propellant $I_{sp}$, number of stages $n$, structural coefficient $\epsilon$}291\KwOut{Payload fraction $\lambda$}292$v_e \leftarrow I_{sp} \cdot g_0$\;293$\Delta v_{stage} \leftarrow \Delta v / n$\;294$MR_{stage} \leftarrow \exp(\Delta v_{stage} / v_e)$\;295$\lambda_{stage} \leftarrow (1 - \epsilon \cdot MR_{stage}) / MR_{stage}$\;296$\lambda \leftarrow \lambda_{stage}^n$\;297\Return{$\lambda$}298\caption{Multi-Stage Payload Fraction Calculation}299\end{algorithm}300301\section{Results and Discussion}302303\subsection{Propellant Performance}304305\begin{pycode}306print(r'\begin{table}[h]')307print(r'\centering')308print(r'\caption{Propellant Performance Comparison}')309print(r'\begin{tabular}{lccc}')310print(r'\toprule')311print(r'Propellant & $I_{sp}$ (s) & Density (kg/m$^3$) & $\rho \cdot I_{sp}$ \\')312print(r'\midrule')313for name, data in propellants.items():314density_isp = data['Isp'] * data['density'] / 1000315print(f"{name} & {data['Isp']} & {data['density']} & {density_isp:.0f} \\\\")316print(r'\bottomrule')317print(r'\end{tabular}')318print(r'\end{table}')319\end{pycode}320321\begin{remark}[Propellant Selection Trade-offs]322LH2/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.323\end{remark}324325\subsection{Staging Benefits}326327For LEO insertion ($\Delta v = 9.4$ km/s) with LH2/LOX propellant:328\begin{itemize}329\item Single stage: \py{f"{staging_results['LEO'][0]:.2f}"}\% payload fraction330\item Two stages: \py{f"{best_2stage:.2f}"}\% payload fraction331\item Three stages: \py{f"{best_3stage:.2f}"}\% payload fraction332\end{itemize}333334Optimal mass ratio for 2-stage LEO: $MR = $ \py{f"{opt_MR:.2f}"} yielding \py{f"{opt_pf*100:.2f}"}\% payload.335336\subsection{Thrust Profile Analysis}337338\begin{pycode}339print(r'\begin{table}[h]')340print(r'\centering')341print(r'\caption{Thrust Profile Total Impulse Comparison}')342print(r'\begin{tabular}{lc}')343print(r'\toprule')344print(r'Profile & Total Impulse (MN$\cdot$s) \\')345print(r'\midrule')346for prof in profiles:347I_total = total_impulse[prof] / 1e6348print(f"{prof.replace('-', ' ').title()} & {I_total:.1f} \\\\")349print(r'\bottomrule')350print(r'\end{tabular}')351print(r'\end{table}')352\end{pycode}353354\begin{remark}[Thrust Profile Selection]355Regressive 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.356\end{remark}357358\section{Limitations and Extensions}359360\subsection{Model Limitations}361\begin{enumerate}362\item \textbf{Ideal rocket}: Neglects nozzle losses, incomplete combustion363\item \textbf{Constant $I_{sp}$}: Real engines vary with altitude364\item \textbf{Gravity/drag losses}: Not included in $\Delta v$ budget365\item \textbf{Fixed structural coefficient}: Varies with stage size366\end{enumerate}367368\subsection{Possible Extensions}369\begin{itemize}370\item Trajectory optimization with gravity and drag371\item Parallel staging (boosters) analysis372\item Reusability impact on payload fraction373\item Electric propulsion for upper stages374\end{itemize}375376\section{Conclusions}377\begin{itemize}378\item LH2/LOX provides best $I_{sp}$ (455 s) for upper stages379\item Staging dramatically improves payload fraction (factor of 2-3)380\item Optimal number of stages is 2-3 for most Earth-orbit missions381\item Propellant density matters for first stages (tank mass)382\item Modern trends favor CH4/LOX for reusability and ISRU383\end{itemize}384385\section*{References}386\begin{itemize}387\item Sutton, G. P., \& Biblarz, O. (2016). \textit{Rocket Propulsion Elements}. Wiley.388\item Turner, M. J. L. (2008). \textit{Rocket and Spacecraft Propulsion}. Springer.389\item Humble, R. W., Henry, G. N., \& Larson, W. J. (1995). \textit{Space Propulsion Analysis and Design}. McGraw-Hill.390\end{itemize}391392\end{document}393394395