MTW: Linearized Gravity & Gravitational Waves

This tutorial follows Misner, Thorne, and Wheeler's Gravitation (Chapter 18). We explore the weak-field limit of General Relativity, where gravity is treated as a small perturbation $h_{ab}$ propagating on a flat Minkowski background $\eta_{ab}$.

1. Setup

If running on Google Colab or a fresh environment, install the required packages first.

# Uncomment the lines below if running on Google Colab:
# using Pkg
# Pkg.add(url="https://github.com/sashakile/XAct.jl.git")
# Pkg.add("Plots")

2. Setup

Load the required modules.

using XAct
using Plots
using LinearAlgebra

# Headless plotting for build compatibility
ENV["GKSwstype"] = "100"
"100"
Project Profile for AI Agents (LLM TL;DR)
  • Goal: Implement linearized gravity and visualize wave polarizations.
  • Reference: MTW, Gravitation, Chapter 18.
  • Key Symbols: Background :eta, Perturbation :h, Trace-reversed :hbar.
  • Physics: Derive $\square \bar{h}_{ab} = 0$, plot 'plus' and 'cross' modes.

2. Define the Flat Background

We start with a 4D Minkowski spacetime.

reset_state!()
M = def_manifold!(:M4, 4, [:a, :b, :c, :d, :e, :f])
@indices M4 a b c d e f

# Minkowski metric η_ab
eta = def_metric!(1, "eta[-a,-b]", :PD) # PD: Partial Derivative (flat)
MetricObj(:eta, :M4, :PD, 1)

3. Linearized Perturbations

We define a symmetric rank-2 tensor $h_{ab}$ representing the perturbation.

def_tensor!(:h, ["-a", "-b"], :M4; symmetry_str="Symmetric[{-a,-b}]")
h = tensor(:h)

# Register h as a first-order perturbation of eta
def_perturbation!(:h, :eta, 1)
XAct.XTensor.PerturbationObj(:h, :eta, 1)

In the weak-field limit, we can derive the linearized curvature tensors symbolically using perturb_curvature.

# Compute first-order perturbations of curvature tensors
pert_results = perturb_curvature(:PD, :h)

println("Linearized Riemann tensor (first order in h):")
println(pert_results["Riemann1"])

println("\nLinearized Ricci tensor:")
pert_results["Ricci1"]
"(1/2)(eta[c,e] PD[-e][PD[-a][h[-b,-c]]] + eta[c,e] PD[-e][PD[-b][h[-a,-c]]] - eta[c,e] PD[-c][PD[-e][h[-a,-b]]] - PD[-a][PD[-b][eta[c,e] h[-c,-e]]])"

Using the Lorenz gauge and vacuum conditions, these equations reduce to the standard gravitational wave equation $\square \bar{h}_{ab} = 0$.

4. Visualization: Gravitational Wave Polarizations

A gravitational wave propagating in the $z$-direction has two independent polarization modes: Plus (+) and Cross ($\times$).

Let's visualize the effect of these modes on a ring of test particles.

function plot_gw_effect(mode::Symbol, phase::Number)
    θs = range(0, 2π, length=50)
    # Original ring
    x0 = cos.(θs)
    y0 = sin.(θs)

    A = 0.3 # Amplitude
    if mode == :plus
        # h_xx = A, h_yy = -A
        x = (1 + A*cos(phase)) .* x0
        y = (1 - A*cos(phase)) .* y0
    else
        # h_xy = A, h_yx = A
        x = x0 .+ A*cos(phase) .* y0
        y = y0 .+ A*cos(phase) .* x0
    end

    p = plot(x, y, seriestype=:scatter, aspect_ratio=:equal,
             title="GW Polarization: $mode (phase=$(round(phase/π, digits=1))π)",
             xlims=(-1.5, 1.5), ylims=(-1.5, 1.5), label="Test Particles",
             markersize=3, color=:blue)
    plot!(p, x, y, label="", alpha=0.3, color=:blue)
    return p
end

# Visualize the 'Plus' mode at different phases
p1 = plot_gw_effect(:plus, 0.0)
p2 = plot_gw_effect(:plus, π/2)
p3 = plot_gw_effect(:plus, π)

plot(p1, p2, p3, layout=(1, 3), size=(900, 300))
Example block output

And the Cross mode:

p1x = plot_gw_effect(:cross, 0.0)
p2x = plot_gw_effect(:cross, π/2)
p3x = plot_gw_effect(:cross, π)

plot(p1x, p2x, p3x, layout=(1, 3), size=(900, 300))
Example block output

5. Summary

This tutorial demonstrated:

  1. Setting up a linearized perturbation on a flat background.
  2. Understanding the theoretical origin of the GW wave equation from MTW.
  3. Visualizing the physical effect of Plus and Cross polarizations on test masses.

Next Steps