Path: blob/main/latex-templates/templates/astrophysics/gravitational_waves.tex
51 views
unlisted
% Gravitational Wave Physics1\documentclass[11pt,a4paper]{article}2\usepackage[utf8]{inputenc}3\usepackage[T1]{fontenc}4\usepackage{amsmath,amssymb}5\usepackage{graphicx}6\usepackage{booktabs}7\usepackage{siunitx}8\usepackage{geometry}9\geometry{margin=1in}10\usepackage{pythontex}11\usepackage{hyperref}12\usepackage{float}1314\title{Gravitational Wave Physics\\Strain, Detection, and Binary Systems}15\author{Gravitational Wave Astronomy Group}16\date{\today}1718\begin{document}19\maketitle2021\begin{abstract}22Analysis of gravitational wave generation, propagation, and detection including chirp mass calculations and LIGO sensitivity.23\end{abstract}2425\section{Introduction}2627Gravitational waves are ripples in spacetime caused by accelerating masses.2829\begin{pycode}30import numpy as np31import matplotlib.pyplot as plt32plt.rcParams['text.usetex'] = True33plt.rcParams['font.family'] = 'serif'3435G = 6.674e-1136c = 2.998e837M_sun = 1.989e3038pc = 3.086e16 # parsec in meters39\end{pycode}4041\section{Chirp Mass}4243$\mathcal{M} = \frac{(m_1 m_2)^{3/5}}{(m_1 + m_2)^{1/5}}$4445\begin{pycode}46m1_range = np.linspace(1, 50, 50)47m2 = 30 # Fixed second mass4849M_chirp = (m1_range * m2)**(3/5) / (m1_range + m2)**(1/5)5051fig, ax = plt.subplots(figsize=(10, 6))52for m2_val in [10, 20, 30, 40]:53M_c = (m1_range * m2_val)**(3/5) / (m1_range + m2_val)**(1/5)54ax.plot(m1_range, M_c, linewidth=1.5, label=f'$m_2$ = {m2_val} $M_\\odot$')55ax.set_xlabel('$m_1$ ($M_\\odot$)')56ax.set_ylabel('Chirp Mass ($M_\\odot$)')57ax.set_title('Chirp Mass for Binary Systems')58ax.legend()59ax.grid(True, alpha=0.3)60plt.tight_layout()61plt.savefig('chirp_mass.pdf', dpi=150, bbox_inches='tight')62plt.close()63\end{pycode}6465\begin{figure}[H]66\centering67\includegraphics[width=0.9\textwidth]{chirp_mass.pdf}68\caption{Chirp mass for different binary configurations.}69\end{figure}7071\section{Gravitational Wave Frequency}7273\begin{pycode}74# Orbital frequency to GW frequency75M_total = 60 * M_sun # Total mass76r_sep = np.logspace(6, 8, 100) * 1000 # Separation in meters7778f_orb = np.sqrt(G * M_total / r_sep**3) / (2 * np.pi)79f_gw = 2 * f_orb # GW frequency is twice orbital8081fig, ax = plt.subplots(figsize=(10, 6))82ax.loglog(r_sep / 1000, f_gw, 'b-', linewidth=2)83ax.set_xlabel('Separation (km)')84ax.set_ylabel('GW Frequency (Hz)')85ax.set_title('Gravitational Wave Frequency vs Separation')86ax.grid(True, alpha=0.3, which='both')87plt.tight_layout()88plt.savefig('gw_frequency.pdf', dpi=150, bbox_inches='tight')89plt.close()90\end{pycode}9192\begin{figure}[H]93\centering94\includegraphics[width=0.9\textwidth]{gw_frequency.pdf}95\caption{GW frequency dependence on binary separation.}96\end{figure}9798\section{Strain Amplitude}99100$h = \frac{4}{D}\left(\frac{G\mathcal{M}}{c^2}\right)^{5/3}\left(\frac{\pi f}{c}\right)^{2/3}$101102\begin{pycode}103D = 400 * 1e6 * pc # Distance (400 Mpc)104M_c = 30 * M_sun # Chirp mass105f_range = np.logspace(0, 3, 100)106107h = (4 / D) * (G * M_c / c**2)**(5/3) * (np.pi * f_range / c)**(2/3)108109fig, ax = plt.subplots(figsize=(10, 6))110ax.loglog(f_range, h, 'b-', linewidth=2)111ax.set_xlabel('Frequency (Hz)')112ax.set_ylabel('Strain $h$')113ax.set_title(f'GW Strain at D = 400 Mpc')114ax.grid(True, alpha=0.3, which='both')115plt.tight_layout()116plt.savefig('gw_strain.pdf', dpi=150, bbox_inches='tight')117plt.close()118\end{pycode}119120\begin{figure}[H]121\centering122\includegraphics[width=0.9\textwidth]{gw_strain.pdf}123\caption{Gravitational wave strain amplitude.}124\end{figure}125126\section{Inspiral Waveform}127128\begin{pycode}129# Simple inspiral model130M_c_kg = 30 * M_sun131t_merge = 1.0 # Time to merger132t = np.linspace(0, t_merge - 0.01, 10000)133tau = t_merge - t # Time to coalescence134135# Frequency evolution136f_t = (1 / np.pi) * (5 / (256 * tau))**(3/8) * (G * M_c_kg / c**3)**(-5/8)137f_t = np.clip(f_t, 10, 1000)138139# Phase140phi_t = -2 * (tau / (5 * G * M_c_kg / c**3))**(5/8)141h_t = np.sin(phi_t)142143fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)144ax1.plot(t, f_t, 'b-', linewidth=1)145ax1.set_ylabel('Frequency (Hz)')146ax1.set_title('Inspiral Waveform')147ax1.set_yscale('log')148ax1.grid(True, alpha=0.3)149150ax2.plot(t, h_t, 'b-', linewidth=0.5)151ax2.set_xlabel('Time (s)')152ax2.set_ylabel('Strain (arb. units)')153ax2.set_xlim([0.8, 1])154ax2.grid(True, alpha=0.3)155plt.tight_layout()156plt.savefig('inspiral_waveform.pdf', dpi=150, bbox_inches='tight')157plt.close()158\end{pycode}159160\begin{figure}[H]161\centering162\includegraphics[width=0.9\textwidth]{inspiral_waveform.pdf}163\caption{Binary inspiral frequency and waveform evolution.}164\end{figure}165166\section{LIGO Sensitivity}167168\begin{pycode}169# Simplified LIGO noise curve170f_ligo = np.logspace(0.5, 4, 500)171S_n = 1e-47 * ((f_ligo / 100)**(-4) + 2 * (1 + (f_ligo / 100)**2))172h_n = np.sqrt(S_n * f_ligo)173174fig, ax = plt.subplots(figsize=(10, 6))175ax.loglog(f_ligo, np.sqrt(S_n), 'b-', linewidth=2, label='LIGO Sensitivity')176ax.set_xlabel('Frequency (Hz)')177ax.set_ylabel('Strain Noise ($1/\\sqrt{\\mathrm{Hz}}$)')178ax.set_title('LIGO Sensitivity Curve')179ax.legend()180ax.grid(True, alpha=0.3, which='both')181ax.set_xlim([10, 3000])182plt.tight_layout()183plt.savefig('ligo_sensitivity.pdf', dpi=150, bbox_inches='tight')184plt.close()185\end{pycode}186187\begin{figure}[H]188\centering189\includegraphics[width=0.9\textwidth]{ligo_sensitivity.pdf}190\caption{LIGO detector sensitivity curve.}191\end{figure}192193\section{Energy Radiated}194195\begin{pycode}196# Energy in GWs197eta = 0.25 # Symmetric mass ratio198M_total_energy = 60 * M_sun199E_rad = eta * M_total_energy * c**2 * 0.1 # ~10% radiated200201distances = np.logspace(7, 10, 100) * pc202L_gw = E_rad / 0.1 # Peak luminosity over 0.1 s203204fig, ax = plt.subplots(figsize=(10, 6))205ax.loglog(distances / (1e6 * pc), np.sqrt(L_gw * G / (c**3 * distances**2)), 'b-', linewidth=2)206ax.set_xlabel('Distance (Mpc)')207ax.set_ylabel('Strain')208ax.set_title('Detectable Strain vs Distance')209ax.grid(True, alpha=0.3, which='both')210plt.tight_layout()211plt.savefig('strain_distance.pdf', dpi=150, bbox_inches='tight')212plt.close()213\end{pycode}214215\begin{figure}[H]216\centering217\includegraphics[width=0.9\textwidth]{strain_distance.pdf}218\caption{GW strain as function of source distance.}219\end{figure}220221\section{Merger Rate}222223\begin{pycode}224# Merger rate density225z = np.linspace(0, 2, 100)226R_0 = 100 # Local rate per Gpc^3 per year227R_z = R_0 * (1 + z)**1.5 # Simple evolution228229fig, ax = plt.subplots(figsize=(10, 6))230ax.plot(z, R_z, 'b-', linewidth=2)231ax.set_xlabel('Redshift $z$')232ax.set_ylabel('Merger Rate (Gpc$^{-3}$ yr$^{-1}$)')233ax.set_title('Binary Black Hole Merger Rate')234ax.grid(True, alpha=0.3)235plt.tight_layout()236plt.savefig('merger_rate.pdf', dpi=150, bbox_inches='tight')237plt.close()238\end{pycode}239240\begin{figure}[H]241\centering242\includegraphics[width=0.9\textwidth]{merger_rate.pdf}243\caption{Merger rate evolution with redshift.}244\end{figure}245246\section{Results}247248\begin{pycode}249M_c_example = (30 * 30)**(3/5) / (60)**(1/5)250print(r'\begin{table}[H]')251print(r'\centering')252print(r'\caption{GW150914-like Parameters}')253print(r'\begin{tabular}{@{}lc@{}}')254print(r'\toprule')255print(r'Parameter & Value \\')256print(r'\midrule')257print(f'Chirp mass & {M_c_example:.1f} $M_\\odot$ \\\\')258print(f'Energy radiated & {E_rad/M_sun/c**2:.1f} $M_\\odot c^2$ \\\\')259print(f'Peak frequency & $\\sim$250 Hz \\\\')260print(f'Peak strain & $\\sim 10^{{-21}}$ \\\\')261print(r'\bottomrule')262print(r'\end{tabular}')263print(r'\end{table}')264\end{pycode}265266\section{Conclusions}267268Gravitational wave astronomy provides unique insights into compact binary systems and strong-field gravity.269270\end{document}271272273