Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/astronomy/cosmological_expansion.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{subcaption}
9
\usepackage[makestderr]{pythontex}
10
11
% Theorem environments for textbook style
12
\newtheorem{definition}{Definition}
13
\newtheorem{theorem}{Theorem}
14
\newtheorem{example}{Example}
15
\newtheorem{remark}{Remark}
16
17
\title{Cosmological Expansion: From Hubble's Law to Dark Energy\\
18
\large A Comprehensive Analysis of the $\Lambda$CDM Model}
19
\author{Cosmology Division\\Computational Science Templates}
20
\date{\today}
21
22
\begin{document}
23
\maketitle
24
25
\begin{abstract}
26
This comprehensive analysis explores the expansion history of the universe from observational foundations to theoretical frameworks. We examine Hubble's law and its modern calibrations, derive the Friedmann equations governing cosmic evolution, and analyze different cosmological models including matter-dominated, radiation-dominated, and dark energy-dominated universes. The $\Lambda$CDM concordance model is developed in detail, with computational analysis of the scale factor evolution, distance-redshift relations, and the cosmic age problem. We explore observational evidence from Type Ia supernovae, baryon acoustic oscillations, and cosmic microwave background measurements that constrain cosmological parameters.
27
\end{abstract}
28
29
\section{Introduction}
30
31
The discovery that the universe is expanding stands as one of the most profound achievements of twentieth-century science. Edwin Hubble's 1929 observation of a linear relationship between galaxy distances and their recession velocities transformed our understanding of cosmic structure and evolution.
32
33
\begin{definition}[Hubble's Law]
34
The recession velocity $v$ of a galaxy is proportional to its distance $d$:
35
\begin{equation}
36
v = H_0 d
37
\end{equation}
38
where $H_0$ is the Hubble constant, currently measured at approximately \SI{70}{\km\per\s\per\Mpc}.
39
\end{definition}
40
41
\section{Theoretical Framework}
42
43
\subsection{The Friedmann Equations}
44
45
General relativity applied to a homogeneous, isotropic universe yields the Friedmann equations:
46
47
\begin{theorem}[First Friedmann Equation]
48
The expansion rate of the universe is determined by its energy content:
49
\begin{equation}
50
H^2 = \left(\frac{\dot{a}}{a}\right)^2 = \frac{8\pi G}{3}\rho - \frac{kc^2}{a^2} + \frac{\Lambda c^2}{3}
51
\end{equation}
52
where $a(t)$ is the scale factor, $\rho$ is the total energy density, $k$ is the spatial curvature, and $\Lambda$ is the cosmological constant.
53
\end{theorem}
54
55
\begin{theorem}[Second Friedmann Equation]
56
The acceleration of expansion:
57
\begin{equation}
58
\frac{\ddot{a}}{a} = -\frac{4\pi G}{3}\left(\rho + \frac{3p}{c^2}\right) + \frac{\Lambda c^2}{3}
59
\end{equation}
60
where $p$ is the pressure.
61
\end{theorem}
62
63
\subsection{Density Parameters}
64
65
We define dimensionless density parameters relative to the critical density $\rho_c = 3H_0^2/(8\pi G)$:
66
67
\begin{align}
68
\Omega_m &= \frac{\rho_m}{\rho_c} \quad \text{(matter)} \\
69
\Omega_r &= \frac{\rho_r}{\rho_c} \quad \text{(radiation)} \\
70
\Omega_\Lambda &= \frac{\Lambda c^2}{3H_0^2} \quad \text{(dark energy)} \\
71
\Omega_k &= -\frac{kc^2}{H_0^2 a_0^2} \quad \text{(curvature)}
72
\end{align}
73
74
\begin{remark}[Closure Relation]
75
For a universe with these components:
76
\begin{equation}
77
\Omega_m + \Omega_r + \Omega_\Lambda + \Omega_k = 1
78
\end{equation}
79
\end{remark}
80
81
\subsection{Redshift and Scale Factor}
82
83
The cosmological redshift $z$ relates to the scale factor:
84
\begin{equation}
85
1 + z = \frac{a_0}{a(t)} = \frac{\lambda_{\text{obs}}}{\lambda_{\text{emit}}}
86
\end{equation}
87
88
The Hubble parameter at redshift $z$:
89
\begin{equation}
90
H(z) = H_0\sqrt{\Omega_r(1+z)^4 + \Omega_m(1+z)^3 + \Omega_k(1+z)^2 + \Omega_\Lambda}
91
\end{equation}
92
93
\section{Computational Analysis}
94
95
\begin{pycode}
96
import numpy as np
97
from scipy.integrate import odeint, quad
98
import matplotlib.pyplot as plt
99
plt.rc('text', usetex=True)
100
plt.rc('font', family='serif')
101
102
np.random.seed(42)
103
104
# Physical constants
105
c = 299792.458 # Speed of light (km/s)
106
H0 = 70.0 # Hubble constant (km/s/Mpc)
107
H0_si = H0 * 1000 / (3.086e22) # Convert to 1/s
108
Gyr_to_s = 3.154e16 # Seconds per Gyr
109
110
# Cosmological models
111
models = {
112
r'$\Lambda$CDM': {'Om': 0.3, 'Or': 8.5e-5, 'OL': 0.7, 'Ok': 0.0},
113
'Einstein-de Sitter': {'Om': 1.0, 'Or': 0.0, 'OL': 0.0, 'Ok': 0.0},
114
'Open Universe': {'Om': 0.3, 'Or': 0.0, 'OL': 0.0, 'Ok': 0.7},
115
'Dark Energy Dom.': {'Om': 0.05, 'Or': 0.0, 'OL': 0.95, 'Ok': 0.0}
116
}
117
118
# Hubble parameter as function of redshift
119
def E(z, Om, Or, OL, Ok):
120
"""Dimensionless Hubble parameter E(z) = H(z)/H0"""
121
return np.sqrt(Or*(1+z)**4 + Om*(1+z)**3 + Ok*(1+z)**2 + OL)
122
123
# Comoving distance
124
def comoving_distance(z, Om, Or, OL, Ok):
125
"""Comoving distance in Mpc"""
126
integrand = lambda z_prime: 1.0 / E(z_prime, Om, Or, OL, Ok)
127
result, _ = quad(integrand, 0, z)
128
return (c/H0) * result
129
130
# Luminosity distance
131
def luminosity_distance(z, Om, Or, OL, Ok):
132
"""Luminosity distance in Mpc"""
133
d_c = comoving_distance(z, Om, Or, OL, Ok)
134
return (1+z) * d_c
135
136
# Angular diameter distance
137
def angular_diameter_distance(z, Om, Or, OL, Ok):
138
"""Angular diameter distance in Mpc"""
139
d_c = comoving_distance(z, Om, Or, OL, Ok)
140
return d_c / (1+z)
141
142
# Lookback time
143
def lookback_time(z, Om, Or, OL, Ok):
144
"""Lookback time in Gyr"""
145
integrand = lambda z_prime: 1.0 / ((1+z_prime) * E(z_prime, Om, Or, OL, Ok))
146
result, _ = quad(integrand, 0, z)
147
return (1/H0) * (3.086e19/Gyr_to_s) * result
148
149
# Age of universe
150
def age_of_universe(Om, Or, OL, Ok):
151
"""Age in Gyr"""
152
integrand = lambda a: 1.0 / (a * H0_si * np.sqrt(Om/a**3 + Or/a**4 + Ok/a**2 + OL))
153
result, _ = quad(integrand, 1e-10, 1)
154
return result / Gyr_to_s
155
156
# Deceleration parameter
157
def deceleration_parameter(z, Om, Or, OL):
158
"""q(z) = -1 - d ln H / d ln(1+z)"""
159
E_sq = Or*(1+z)**4 + Om*(1+z)**3 + OL
160
q = (2*Or*(1+z)**4 + 1.5*Om*(1+z)**3) / E_sq - 1
161
return q
162
163
# Scale factor evolution (solve Friedmann equation)
164
def scale_factor_evolution(t_array, Om, Or, OL, Ok):
165
"""Solve for a(t) given initial conditions"""
166
def da_dt(a, t):
167
if a <= 0:
168
return 0
169
return a * H0_si * np.sqrt(Om/a**3 + Or/a**4 + Ok/a**2 + OL)
170
171
a0 = 1e-6 # Start from very early time
172
a = odeint(da_dt, a0, t_array)[:, 0]
173
return a
174
175
# Create comprehensive figure
176
fig = plt.figure(figsize=(14, 16))
177
178
# Plot 1: Hubble parameter vs redshift
179
ax1 = fig.add_subplot(3, 3, 1)
180
z = np.linspace(0, 5, 200)
181
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']
182
for idx, (name, params) in enumerate(models.items()):
183
H_z = H0 * E(z, params['Om'], params['Or'], params['OL'], params['Ok'])
184
ax1.plot(z, H_z, color=colors[idx], linewidth=2, label=name)
185
186
ax1.set_xlabel('Redshift $z$')
187
ax1.set_ylabel('$H(z)$ (km/s/Mpc)')
188
ax1.set_title('Hubble Parameter Evolution')
189
ax1.legend(fontsize=7, loc='upper left')
190
ax1.grid(True, alpha=0.3)
191
ax1.set_xlim(0, 5)
192
193
# Plot 2: Luminosity distance
194
ax2 = fig.add_subplot(3, 3, 2)
195
z_plot = np.linspace(0.01, 3, 100)
196
for idx, (name, params) in enumerate(models.items()):
197
d_L = np.array([luminosity_distance(zi, params['Om'], params['Or'], params['OL'], params['Ok']) for zi in z_plot])
198
ax2.plot(z_plot, d_L/1000, color=colors[idx], linewidth=2, label=name)
199
200
ax2.set_xlabel('Redshift $z$')
201
ax2.set_ylabel('$D_L$ (Gpc)')
202
ax2.set_title('Luminosity Distance')
203
ax2.legend(fontsize=7)
204
ax2.grid(True, alpha=0.3)
205
206
# Plot 3: Angular diameter distance
207
ax3 = fig.add_subplot(3, 3, 3)
208
for idx, (name, params) in enumerate(models.items()):
209
d_A = np.array([angular_diameter_distance(zi, params['Om'], params['Or'], params['OL'], params['Ok']) for zi in z_plot])
210
ax3.plot(z_plot, d_A, color=colors[idx], linewidth=2, label=name)
211
212
ax3.set_xlabel('Redshift $z$')
213
ax3.set_ylabel('$D_A$ (Mpc)')
214
ax3.set_title('Angular Diameter Distance')
215
ax3.legend(fontsize=7)
216
ax3.grid(True, alpha=0.3)
217
218
# Plot 4: Deceleration parameter
219
ax4 = fig.add_subplot(3, 3, 4)
220
z_q = np.linspace(0, 3, 100)
221
for idx, (name, params) in enumerate(models.items()):
222
q_z = deceleration_parameter(z_q, params['Om'], params['Or'], params['OL'])
223
ax4.plot(z_q, q_z, color=colors[idx], linewidth=2, label=name)
224
225
ax4.axhline(y=0, color='black', linestyle='-', alpha=0.5, linewidth=0.5)
226
ax4.set_xlabel('Redshift $z$')
227
ax4.set_ylabel('Deceleration $q(z)$')
228
ax4.set_title('Acceleration History')
229
ax4.legend(fontsize=7)
230
ax4.grid(True, alpha=0.3)
231
232
# Plot 5: Lookback time
233
ax5 = fig.add_subplot(3, 3, 5)
234
z_t = np.linspace(0.01, 5, 50)
235
for idx, (name, params) in enumerate(models.items()):
236
t_look = np.array([lookback_time(zi, params['Om'], params['Or'], params['OL'], params['Ok']) for zi in z_t])
237
ax5.plot(z_t, t_look, color=colors[idx], linewidth=2, label=name)
238
239
ax5.set_xlabel('Redshift $z$')
240
ax5.set_ylabel('Lookback Time (Gyr)')
241
ax5.set_title('Lookback Time')
242
ax5.legend(fontsize=7)
243
ax5.grid(True, alpha=0.3)
244
245
# Plot 6: Density evolution
246
ax6 = fig.add_subplot(3, 3, 6)
247
z_dens = np.linspace(0, 10, 200)
248
# For Lambda-CDM
249
Om, Or, OL = 0.3, 8.5e-5, 0.7
250
E_z = E(z_dens, Om, Or, OL, 0)
251
Omega_m_z = Om * (1+z_dens)**3 / E_z**2
252
Omega_r_z = Or * (1+z_dens)**4 / E_z**2
253
Omega_L_z = OL / E_z**2
254
255
ax6.plot(z_dens, Omega_m_z, 'b-', linewidth=2, label=r'$\Omega_m(z)$')
256
ax6.plot(z_dens, Omega_r_z, 'r-', linewidth=2, label=r'$\Omega_r(z)$')
257
ax6.plot(z_dens, Omega_L_z, 'g-', linewidth=2, label=r'$\Omega_\Lambda(z)$')
258
ax6.axvline(x=0.3, color='gray', linestyle='--', alpha=0.5)
259
ax6.axvline(x=3400, color='gray', linestyle=':', alpha=0.5)
260
261
ax6.set_xlabel('Redshift $z$')
262
ax6.set_ylabel(r'$\Omega_i(z)$')
263
ax6.set_title('Density Parameter Evolution')
264
ax6.legend(fontsize=8)
265
ax6.grid(True, alpha=0.3)
266
ax6.set_xscale('log')
267
ax6.set_xlim(0.1, 10)
268
269
# Plot 7: Scale factor evolution
270
ax7 = fig.add_subplot(3, 3, 7)
271
t_Hubble = 1/H0_si/Gyr_to_s # Hubble time in Gyr
272
t_array = np.linspace(0.001, 30, 500) * Gyr_to_s
273
274
for idx, (name, params) in enumerate(models.items()):
275
a = scale_factor_evolution(t_array, params['Om'], params['Or'], params['OL'], params['Ok'])
276
ax7.plot(t_array/Gyr_to_s, a, color=colors[idx], linewidth=2, label=name)
277
278
ax7.axhline(y=1, color='gray', linestyle='--', alpha=0.5)
279
ax7.axvline(x=13.8, color='gray', linestyle=':', alpha=0.5)
280
ax7.set_xlabel('Time (Gyr)')
281
ax7.set_ylabel('Scale Factor $a(t)$')
282
ax7.set_title('Scale Factor Evolution')
283
ax7.legend(fontsize=7, loc='upper left')
284
ax7.grid(True, alpha=0.3)
285
ax7.set_xlim(0, 30)
286
ax7.set_ylim(0, 5)
287
288
# Plot 8: Distance modulus (Hubble diagram)
289
ax8 = fig.add_subplot(3, 3, 8)
290
z_mu = np.linspace(0.01, 2, 100)
291
for idx, (name, params) in enumerate(models.items()):
292
d_L = np.array([luminosity_distance(zi, params['Om'], params['Or'], params['OL'], params['Ok']) for zi in z_mu])
293
mu = 5 * np.log10(d_L) + 25 # Distance modulus
294
ax8.plot(z_mu, mu, color=colors[idx], linewidth=2, label=name)
295
296
# Add simulated SN Ia data for Lambda-CDM
297
z_sn = np.array([0.1, 0.2, 0.3, 0.5, 0.7, 1.0, 1.4])
298
d_L_true = np.array([luminosity_distance(zi, 0.3, 8.5e-5, 0.7, 0) for zi in z_sn])
299
mu_true = 5 * np.log10(d_L_true) + 25
300
mu_obs = mu_true + np.random.normal(0, 0.15, len(z_sn))
301
ax8.errorbar(z_sn, mu_obs, yerr=0.15, fmt='ko', markersize=5, capsize=3, label='SN Ia')
302
303
ax8.set_xlabel('Redshift $z$')
304
ax8.set_ylabel('Distance Modulus $\mu$')
305
ax8.set_title('Hubble Diagram')
306
ax8.legend(fontsize=7, loc='lower right')
307
ax8.grid(True, alpha=0.3)
308
309
# Plot 9: Equation of state parameter
310
ax9 = fig.add_subplot(3, 3, 9)
311
w_values = np.linspace(-1.5, 0.5, 100)
312
z_test = 1.0
313
effects = []
314
for w in w_values:
315
# For w != -1, dark energy density evolves as (1+z)^(3(1+w))
316
E_w = np.sqrt(0.3*(1+z_test)**3 + 0.7*(1+z_test)**(3*(1+w)))
317
effects.append(E_w)
318
319
ax9.plot(w_values, effects, 'b-', linewidth=2)
320
ax9.axvline(x=-1, color='r', linestyle='--', alpha=0.7, label=r'$w=-1$ ($\Lambda$)')
321
ax9.axvline(x=-1/3, color='g', linestyle=':', alpha=0.7, label=r'$w=-1/3$ (accel. boundary)')
322
ax9.set_xlabel('Equation of State $w$')
323
ax9.set_ylabel('$E(z=1)$')
324
ax9.set_title('Dark Energy Equation of State')
325
ax9.legend(fontsize=8)
326
ax9.grid(True, alpha=0.3)
327
328
plt.tight_layout()
329
plt.savefig('cosmological_expansion_plot.pdf', bbox_inches='tight', dpi=150)
330
print(r'\begin{center}')
331
print(r'\includegraphics[width=\textwidth]{cosmological_expansion_plot.pdf}')
332
print(r'\end{center}')
333
plt.close()
334
335
# Calculate key quantities for Lambda-CDM
336
age_lcdm = age_of_universe(0.3, 8.5e-5, 0.7, 0)
337
q0_lcdm = deceleration_parameter(0, 0.3, 8.5e-5, 0.7)
338
z_transition = ((2*0.7)/0.3)**(1/3) - 1 # Matter-Lambda equality
339
z_accel = (2*0.7/0.3)**(1/3) - 1 # Acceleration onset (q=0)
340
\end{pycode}
341
342
\section{Results and Discussion}
343
344
\subsection{Key Cosmological Parameters}
345
346
\begin{pycode}
347
# Generate results table
348
print(r'\begin{table}[h]')
349
print(r'\centering')
350
print(r'\caption{Cosmological Parameters for Different Models}')
351
print(r'\begin{tabular}{lccccc}')
352
print(r'\toprule')
353
print(r'Model & $\Omega_m$ & $\Omega_\Lambda$ & Age (Gyr) & $q_0$ & Fate \\')
354
print(r'\midrule')
355
for name, params in models.items():
356
age = age_of_universe(params['Om'], params['Or'], params['OL'], params['Ok'])
357
q0 = deceleration_parameter(0, params['Om'], params['Or'], params['OL'])
358
if params['OL'] > 0:
359
fate = 'Accelerating'
360
elif params['Ok'] > 0:
361
fate = 'Expanding'
362
else:
363
fate = 'Recollapse'
364
print(f"{name} & {params['Om']:.2f} & {params['OL']:.2f} & {age:.1f} & {q0:.2f} & {fate} \\\\")
365
print(r'\bottomrule')
366
print(r'\end{tabular}')
367
print(r'\end{table}')
368
\end{pycode}
369
370
\begin{example}[$\Lambda$CDM Universe]
371
For the concordance cosmological model with $\Omega_m = 0.3$ and $\Omega_\Lambda = 0.7$:
372
\begin{itemize}
373
\item Age of the universe: \py{f"{age_lcdm:.2f}"} Gyr
374
\item Current deceleration parameter: $q_0 = $ \py{f"{q0_lcdm:.3f}"}
375
\item Matter-$\Lambda$ equality redshift: $z_{eq} = $ \py{f"{z_transition:.2f}"}
376
\item Hubble time: $1/H_0 = $ \py{f"{1/H0_si/Gyr_to_s:.1f}"} Gyr
377
\end{itemize}
378
\end{example}
379
380
\subsection{Distance Measures}
381
382
\begin{pycode}
383
# Distance table at specific redshifts
384
print(r'\begin{table}[h]')
385
print(r'\centering')
386
print(r'\caption{Distance Measures in $\Lambda$CDM Cosmology}')
387
print(r'\begin{tabular}{ccccc}')
388
print(r'\toprule')
389
print(r'$z$ & $D_C$ (Mpc) & $D_L$ (Mpc) & $D_A$ (Mpc) & Lookback (Gyr) \\')
390
print(r'\midrule')
391
for z_val in [0.1, 0.5, 1.0, 2.0, 3.0]:
392
d_c = comoving_distance(z_val, 0.3, 8.5e-5, 0.7, 0)
393
d_l = luminosity_distance(z_val, 0.3, 8.5e-5, 0.7, 0)
394
d_a = angular_diameter_distance(z_val, 0.3, 8.5e-5, 0.7, 0)
395
t_lb = lookback_time(z_val, 0.3, 8.5e-5, 0.7, 0)
396
print(f"{z_val:.1f} & {d_c:.0f} & {d_l:.0f} & {d_a:.0f} & {t_lb:.2f} \\\\")
397
print(r'\bottomrule')
398
print(r'\end{tabular}')
399
print(r'\end{table}')
400
\end{pycode}
401
402
\subsection{Observational Evidence for Dark Energy}
403
404
The evidence for cosmic acceleration comes from multiple independent probes:
405
406
\begin{enumerate}
407
\item \textbf{Type Ia Supernovae}: Standardizable candles show that distant SNe are fainter than expected in a decelerating universe
408
\item \textbf{Baryon Acoustic Oscillations}: Standard ruler measurements in galaxy surveys constrain $D_A(z)/r_s$
409
\item \textbf{Cosmic Microwave Background}: Angular power spectrum constrains $\Omega_m h^2$ and $\Omega_\Lambda$
410
\item \textbf{Cluster Counts}: Evolution of galaxy cluster abundance sensitive to $\sigma_8$ and $\Omega_m$
411
\end{enumerate}
412
413
\begin{remark}[Cosmic Coincidence Problem]
414
We appear to live at a special epoch when $\Omega_m \approx \Omega_\Lambda$. Given that these densities scale differently with redshift ($\rho_m \propto a^{-3}$ vs. $\rho_\Lambda = $ const), this equality is a remarkable coincidence.
415
\end{remark}
416
417
\section{Dark Energy Models}
418
419
\subsection{Cosmological Constant}
420
The simplest dark energy model is Einstein's cosmological constant $\Lambda$:
421
\begin{itemize}
422
\item Equation of state: $w = p/\rho = -1$ (constant)
423
\item Energy density: constant in time
424
\item Interpretation: vacuum energy
425
\end{itemize}
426
427
\subsection{Quintessence}
428
Dynamical dark energy from a scalar field $\phi$:
429
\begin{equation}
430
\rho_\phi = \frac{1}{2}\dot{\phi}^2 + V(\phi), \quad p_\phi = \frac{1}{2}\dot{\phi}^2 - V(\phi)
431
\end{equation}
432
This gives $-1 < w < 1$ with possible time evolution.
433
434
\section{The Cosmic Age Problem}
435
436
\begin{pycode}
437
# Age comparison
438
print(r'\begin{table}[h]')
439
print(r'\centering')
440
print(r'\caption{Cosmic Age in Different Models vs. Oldest Stars}')
441
print(r'\begin{tabular}{lcc}')
442
print(r'\toprule')
443
print(r'Model & Age (Gyr) & Consistent? \\')
444
print(r'\midrule')
445
oldest_stars = 13.0 # Approximate age of oldest globular clusters
446
for name, params in models.items():
447
age = age_of_universe(params['Om'], params['Or'], params['OL'], params['Ok'])
448
consistent = 'Yes' if age > oldest_stars else 'No'
449
print(f"{name} & {age:.1f} & {consistent} \\\\")
450
print(r'\midrule')
451
print(f"Oldest Stars & $\\sim${oldest_stars:.0f} & --- \\\\")
452
print(r'\bottomrule')
453
print(r'\end{tabular}')
454
print(r'\end{table}')
455
\end{pycode}
456
457
\section{Limitations and Extensions}
458
459
\subsection{Model Limitations}
460
\begin{enumerate}
461
\item \textbf{Perfect homogeneity}: Real universe has structure
462
\item \textbf{Constant $w$}: Dark energy EoS may evolve
463
\item \textbf{Flat geometry}: $\Omega_k$ constrained but not zero
464
\item \textbf{No perturbations}: Linear theory not included
465
\end{enumerate}
466
467
\subsection{Possible Extensions}
468
\begin{itemize}
469
\item Time-varying dark energy: $w(z) = w_0 + w_a \cdot z/(1+z)$
470
\item Modified gravity: $f(R)$ theories
471
\item Interacting dark sector
472
\item Backreaction from inhomogeneities
473
\end{itemize}
474
475
\section{Conclusion}
476
477
This analysis demonstrates the fundamental framework of modern cosmology:
478
\begin{itemize}
479
\item The $\Lambda$CDM model provides an excellent fit to observations
480
\item Dark energy dominates the current epoch ($\Omega_\Lambda \approx 0.7$)
481
\item The universe is accelerating ($q_0 = $ \py{f"{q0_lcdm:.2f}"} $ < 0$)
482
\item Cosmic age of \py{f"{age_lcdm:.1f}"} Gyr is consistent with stellar ages
483
\item Future observations will constrain dark energy properties
484
\end{itemize}
485
486
\section*{Further Reading}
487
\begin{itemize}
488
\item Peebles, P. J. E. (1993). \textit{Principles of Physical Cosmology}. Princeton University Press.
489
\item Weinberg, S. (2008). \textit{Cosmology}. Oxford University Press.
490
\item Planck Collaboration (2020). Planck 2018 results. VI. Cosmological parameters.
491
\end{itemize}
492
493
\end{document}
494
495