Allgemeine Relativitätstheorie mit dem Computer¶

General Theory of Relativity on the Computer¶

Vorlesung gehalten an der J.W.Goethe-Universität in Frankfurt am Main (Sommersemester 2023)¶

von Dr.phil.nat. Dr.rer.pol. Matthias Hanauske¶

Frankfurt am Main 01.04.2023¶

Eine kleine Einführung in Jupyter Notebooks¶

In diesem Python Jupyter Notebook werden die grundlegenden Größen der allgemeinen Relativitätstheorie (z.B. die Metrik der Raumzeit, Christoffel Symbole, Ricci- und Einstein-Tensor) am Beispiel einer allgemeinen statischen und isotropen Raumzeit in Python berechnet. Die oft komplizierten und zeitaufwendigen Berechnungen der tensoriellen Gleichungen der allgemeinen Relativitätstheorie können mithilfe von Computeralgebra-Systemen erleichtert werden. Diverse Anwendungen der Einstein- und Geodätengleichung sind in schon vordefinierten Python Modulen implementiert, und analytische Berechnungen können durchgeführt und entsprechende Lösungen berechnet und visualisiert werden.

Zur Berechnung verwenden wir das Python Modul EinsteinPy. Das Modul basiert auf dem Modul SymPy welches symbolische Berechnungen mit Python vereinfacht.

Grundlegende Größen der Allgemeinen Relativitätstheorie mit EinsteinPy¶

Im Folgenden werden einige grundlegende Größen der allgemeinen Relativitätstheorie mit dem Python Modul "EinsteinPy" berechnet. Wieder erläutern wir dies am Beispiel der allgemeinen statischen, isotropen Metrik. Zunächst wird das Python Modul "EinsteinPy" eingebunden, welches auf dem Modul SymPy basiert und symbolische Berechnungen in der Allgemeinen Relativitätstheorie relativ einfach möglich macht. EinsteinPy kann einfach mit "pip install einsteinpy" in einem Terminal installiert werden und stellt zusammen mit dem Modul SymPy ein wichtiges Tool der Computer Algebra Systeme im Bereich der allgemeinen Relativitätstheorie dar. Weiteres über das Modul finden Sie unter EinsteinPy - Making Einstein possible in Python.

In [1]:
from sympy import *
init_printing()
from einsteinpy.symbolic import *

Definition der Koordinaten und der kovarianten Raumzeit-Metrik einer allgemeinen statischen, isotropen Metrik:

$$x^\mu=(t,r,\theta,\phi)\quad, \qquad g_{\mu\nu}=\left( \begin{array}{ccc} A(r) & 0 & 0 & 0\\ 0& -B(r)& 0&0 \\ 0& 0& -r^2& 0\\ 0& 0& 0& -r^2 \hbox{sin}^2(\theta)\\ \end{array} \right)$$ , bzw. auskommentiert, Schwarzschildmetrik: $$ g_{\mu\nu}=\left( \begin{array}{ccc} 1-\frac{2\,M}{r} & 0 & 0 & 0\\ 0& -\frac{1}{1-\frac{2\,M}{r}}& 0&0 \\ 0& 0& -r^2& 0\\ 0& 0& 0& -r^2 \hbox{sin}^2(\theta)\\ \end{array} \right)$$

In [2]:
t, r, theta, phi = symbols('t, r, theta, phi')
A = Function('A')(r)
B = Function('B')(r)
Metric = diag(A, -B, -r**2, -r**2*sin(theta)**2).tolist()
#M = symbols('M')
#Metric = diag((1-2*M/r), -1/(1-2*M/r), -r**2, -r**2*sin(theta)**2).tolist()
g = MetricTensor(Metric, [t, r, theta, phi])
In [3]:
g.tensor()
Out[3]:
$\displaystyle \left[\begin{matrix}A{\left(r \right)} & 0 & 0 & 0\\0 & - B{\left(r \right)} & 0 & 0\\0 & 0 & - r^{2} & 0\\0 & 0 & 0 & - r^{2} \sin^{2}{\left(\theta \right)}\end{matrix}\right]$

Durch den Befehl ".config" kann man herausfinden ob der Tensor kovariante (l) oder kontravariante (u) Index-Komponenten hat.

In [4]:
g.config
Out[4]:
'll'

Kontravariante Form der Metrik:

$$ g^{\mu\nu}=\left( \begin{array}{ccc} \frac{1}{A(r)} & 0 & 0 & 0\\ 0& -\frac{1}{B(r)}& 0&0 \\ 0& 0& -\frac{1}{r^2}& 0\\ 0& 0& 0& -\frac{1}{r^2 \hbox{sin}^2(\theta)}\\ \end{array} \right)$$

In [5]:
gInv=g.inv()
gInv.tensor()
Out[5]:
$\displaystyle \left[\begin{matrix}\frac{1}{A{\left(r \right)}} & 0 & 0 & 0\\0 & - \frac{1}{B{\left(r \right)}} & 0 & 0\\0 & 0 & - \frac{1}{r^{2}} & 0\\0 & 0 & 0 & - \frac{1}{r^{2} \sin^{2}{\left(\theta \right)}}\end{matrix}\right]$

Wir überprüfen dies, indem wir diese kontravariante Form der Metrik zweifach mit der ursprünglichen Metrik kontrahieren:$$g^{\alpha\beta} \, g_{\alpha\mu} \, g_{\beta\nu} = g_{\mu\nu}$$

In [6]:
tens1=tensorproduct(gInv.tensor(),g.tensor(),g.tensor())
tensorcontraction(tens1, (0, 2),(1,4))
Out[6]:
$\displaystyle \left[\begin{matrix}A{\left(r \right)} & 0 & 0 & 0\\0 & - B{\left(r \right)} & 0 & 0\\0 & 0 & - r^{2} & 0\\0 & 0 & 0 & - r^{2} \sin^{2}{\left(\theta \right)}\end{matrix}\right]$

Man kann die Art der Indices auch einfach mit dem Befehl "change_config" verändern:

In [7]:
gInv.config
Out[7]:
'uu'
In [8]:
gInv.change_config('ll').tensor()
Out[8]:
$\displaystyle \left[\begin{matrix}A{\left(r \right)} & 0 & 0 & 0\\0 & - B{\left(r \right)} & 0 & 0\\0 & 0 & - r^{2} & 0\\0 & 0 & 0 & - r^{2} \sin^{2}{\left(\theta \right)}\end{matrix}\right]$

Das kontrahierte Tensorprodukt der kovarianten Metrik mit der kontravarianten Metrik ergibt die vierdimensionale Einheitsmatrix:

$$g^{\mu\alpha} \, g_{\alpha\nu} = \eta^{\mu}\,_{\!\!\nu} = \delta^{\mu}\,_{\!\!\nu} = \left( \begin{array}{ccc} 1 & 0 & 0 & 0\\ 0& 1& 0&0 \\ 0& 0& 1& 0\\ 0& 0& 0& 1\\ \end{array} \right)$$

In [9]:
eta=tensorproduct(g.tensor(),gInv.tensor())
tensorcontraction(eta, (1, 2))
Out[9]:
$\displaystyle \left[\begin{matrix}1 & 0 & 0 & 0\\0 & 1 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\end{matrix}\right]$

Partielle Ableitung: $$\partial_\mu = \frac{\partial}{\partial x^\mu}$$ Hier speziell $\partial_2 g_{1 1} = \partial_r g_{t t}$, wobei $$ g_{\mu\nu| \alpha} := \partial_\alpha g_{\mu\nu} = \frac{\partial }{\partial x^\alpha}g_{\mu\nu} $$

!!!! Beachte: In EinsteinPy werden die Raumzeit Indices von 0..3 gezählt !!!!

In [10]:
diff(g.tensor(),r)
Out[10]:
$\displaystyle \left[\begin{matrix}\frac{d}{d r} A{\left(r \right)} & 0 & 0 & 0\\0 & - \frac{d}{d r} B{\left(r \right)} & 0 & 0\\0 & 0 & - 2 r & 0\\0 & 0 & 0 & - 2 r \sin^{2}{\left(\theta \right)}\end{matrix}\right]$
In [11]:
diff(g.tensor(),r)[0,0]
Out[11]:
$\displaystyle \frac{d}{d r} A{\left(r \right)}$

Die Chistoffel Symbole (zweiter Art): $$ \Gamma^{\sigma}_{\mu \nu} = \frac{1}{2}g^{\sigma \alpha} \left( g_{\nu \alpha| \mu} + g_{\mu \alpha| \nu} - g_{\mu \nu| \alpha} \right)$$

Hier speziell $$ \Gamma^{1}_{1 1} = \Gamma^{r}_{r r}$$

In [12]:
chr = ChristoffelSymbols.from_metric(g)
print(chr.config)
chr.tensor()[1,1,1]
ull
Out[12]:
$\displaystyle \frac{\frac{d}{d r} B{\left(r \right)}}{2 B{\left(r \right)}}$

Die Chistoffel Symbole in kovarianter Form (erster Art): $$ \Gamma_{\mu \nu \sigma} = \Gamma^{\rho}_{\mu \nu} g_{\rho \sigma} = \frac{1}{2} \left( g_{\nu \sigma| \mu} + g_{\mu \sigma| \nu} - g_{\mu \nu| \sigma} \right)$$

Hier speziell $$ \Gamma_{2 2 2} = \Gamma_{r r r}$$

In [13]:
chr_lll = chr.change_config('lll') 
print(chr_lll.config)
chr_lll.tensor()[1,1,1]
lll
Out[13]:
$\displaystyle - \frac{\frac{d}{d r} B{\left(r \right)}}{2}$

Der Riemann Tensor: $$ R^{\mu}{}\!_{\nu \rho \sigma} = \frac{\partial \Gamma^{\mu}_{\nu \sigma}}{\partial x^{\rho}} - \frac{\partial \Gamma^{\mu}_{\nu \rho}}{\partial x^{\sigma}} + \Gamma^{\alpha}_{\nu \sigma}\Gamma^{\mu}_{\rho \alpha} - \Gamma^{\alpha}_{\nu \rho}\Gamma^{\mu}_{\sigma \alpha} $$

Hier speziell $$ R^{0}{}\!_{2 0 2} = R^{t}{}\!_{\theta t \theta} $$

In [14]:
rm = RiemannCurvatureTensor.from_christoffels(chr)
print(rm.config)
rm[0,2,0,2]
ulll
Out[14]:
$\displaystyle - \frac{r \frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)} B{\left(r \right)}}$

Der Riemann Tensor (kovariante Form): $$ R_{\mu \nu \rho \sigma} = \frac{\partial \Gamma_{\mu \nu \sigma}}{\partial x^{\rho}} - \frac{\partial \Gamma_{\mu \nu \rho}}{\partial x^{\sigma}} + \Gamma^{\alpha}_{\ \nu \sigma}\Gamma_{\mu \rho \alpha} - \Gamma^{\alpha}_{\ \nu \rho}\Gamma_{\mu \sigma \alpha} - \frac{\partial g_{\mu \alpha}}{\partial x^{\rho}}\Gamma^{\alpha}_{\ \nu \sigma} + \frac{\partial g_{\mu \alpha}}{\partial x^{\sigma}}\Gamma^{\alpha}_{\ \nu \rho} $$

Hier speziell $$ R_{1 3 1 3} = R_{t \theta t \theta} $$

In [15]:
rm_llll = rm.change_config('llll')
rm_llll[0,2,0,2]
Out[15]:
$\displaystyle - \frac{r \frac{d}{d r} A{\left(r \right)}}{2 B{\left(r \right)}}$

Der Ricci Tensor:

$$ R_{\mu \nu} = R^{\sigma}{}\!_{\mu \sigma \nu} = \frac{\partial \Gamma^{\sigma}_{\mu \nu}}{\partial x^{\sigma}} - \frac{\partial \Gamma^{\sigma}_{\mu \sigma}}{\partial x^{\nu}} + \Gamma^{\rho}_{\mu \nu}\Gamma^{\sigma}_{\rho \sigma} - \Gamma^{\sigma}_{\mu \rho}\Gamma^{\rho}_{\nu \sigma} $$

In [16]:
ric = RicciTensor.from_metric(g)
print(ric.config)
ric.tensor()
ll
Out[16]:
$\displaystyle \left[\begin{matrix}\frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{2 B{\left(r \right)}} - \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{4 B^{2}{\left(r \right)}} - \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{4 A{\left(r \right)} B{\left(r \right)}} + \frac{\frac{d}{d r} A{\left(r \right)}}{r B{\left(r \right)}} & 0 & 0 & 0\\0 & - \frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{2 A{\left(r \right)}} + \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{4 A{\left(r \right)} B{\left(r \right)}} + \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{4 A^{2}{\left(r \right)}} + \frac{\frac{d}{d r} B{\left(r \right)}}{r B{\left(r \right)}} & 0 & 0\\0 & 0 & \frac{r \frac{d}{d r} B{\left(r \right)}}{2 B^{2}{\left(r \right)}} - \frac{r \frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)} B{\left(r \right)}} + 1 - \frac{1}{B{\left(r \right)}} & 0\\0 & 0 & 0 & \frac{\left(r A{\left(r \right)} \frac{d}{d r} B{\left(r \right)} - r B{\left(r \right)} \frac{d}{d r} A{\left(r \right)} + 2 \left(B{\left(r \right)} - 1\right) A{\left(r \right)} B{\left(r \right)}\right) \sin^{2}{\left(\theta \right)}}{2 A{\left(r \right)} B^{2}{\left(r \right)}}\end{matrix}\right]$

Überprüfung durch Kontraktion des Riemann Tensors:

In [17]:
tensorcontraction(rm.tensor(), (0, 2))
Out[17]:
$\displaystyle \left[\begin{matrix}\frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{2 B{\left(r \right)}} - \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{4 B^{2}{\left(r \right)}} - \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{4 A{\left(r \right)} B{\left(r \right)}} + \frac{\frac{d}{d r} A{\left(r \right)}}{r B{\left(r \right)}} & 0 & 0 & 0\\0 & - \frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{2 A{\left(r \right)}} + \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{4 A{\left(r \right)} B{\left(r \right)}} + \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{4 A^{2}{\left(r \right)}} + \frac{\frac{d}{d r} B{\left(r \right)}}{r B{\left(r \right)}} & 0 & 0\\0 & 0 & \frac{r \frac{d}{d r} B{\left(r \right)}}{2 B^{2}{\left(r \right)}} - \frac{r \frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)} B{\left(r \right)}} + 1 - \frac{1}{B{\left(r \right)}} & 0\\0 & 0 & 0 & \frac{r \sin^{2}{\left(\theta \right)} \frac{d}{d r} B{\left(r \right)}}{2 B^{2}{\left(r \right)}} - \frac{r \sin^{2}{\left(\theta \right)} \frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)} B{\left(r \right)}} + \frac{\left(B{\left(r \right)} - 1\right) \sin^{2}{\left(\theta \right)}}{B{\left(r \right)}}\end{matrix}\right]$

Der Ricci Skalar ergibt sich aus der Kontraktion des Ricci Tensors: $R = R^{\mu}{}_{\!\mu} = g^{\mu \nu}R_{\nu \mu}$

In [18]:
R = RicciScalar.from_riccitensor(ric)
R.tensor()
Out[18]:
$\displaystyle \frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{A{\left(r \right)} B{\left(r \right)}} - \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{2 A{\left(r \right)} B^{2}{\left(r \right)}} - \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{2 A^{2}{\left(r \right)} B{\left(r \right)}} - \frac{2 \frac{d}{d r} B{\left(r \right)}}{r B^{2}{\left(r \right)}} + \frac{2 \frac{d}{d r} A{\left(r \right)}}{r A{\left(r \right)} B{\left(r \right)}} - \frac{2}{r^{2}} + \frac{2}{r^{2} B{\left(r \right)}}$

Überprüfung durch Kontraktion des Ricci Tensors:

In [19]:
ric_ul = ric.change_config('ul')
tensorcontraction(ric_ul.tensor(), (0, 1))
Out[19]:
$\displaystyle \frac{\frac{d^{2}}{d r^{2}} A{\left(r \right)}}{A{\left(r \right)} B{\left(r \right)}} - \frac{\frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)}}{2 A{\left(r \right)} B^{2}{\left(r \right)}} - \frac{\left(\frac{d}{d r} A{\left(r \right)}\right)^{2}}{2 A^{2}{\left(r \right)} B{\left(r \right)}} - \frac{2 \frac{d}{d r} B{\left(r \right)}}{r B^{2}{\left(r \right)}} + \frac{2 \frac{d}{d r} A{\left(r \right)}}{r A{\left(r \right)} B{\left(r \right)}} - \frac{2}{r^{2}} + \frac{2}{r^{2} B{\left(r \right)}}$

Der Einstein Tensor:$$ G_{\mu \nu} = R_{\mu \nu} - \frac{1}{2}g_{\mu \nu}R $$

In [20]:
einst = EinsteinTensor.from_metric(g)
print(einst.config)
einst.simplify()
ll
Out[20]:
$\displaystyle \left[\begin{matrix}\frac{1.0 \left(r \frac{d}{d r} B{\left(r \right)} + B^{2}{\left(r \right)} - B{\left(r \right)}\right) A{\left(r \right)}}{r^{2} B^{2}{\left(r \right)}} & 0 & 0 & 0\\0 & \frac{1.0 \frac{d}{d r} A{\left(r \right)}}{r A{\left(r \right)}} - \frac{1.0 B{\left(r \right)}}{r^{2}} + \frac{1.0}{r^{2}} & 0 & 0\\0 & 0 & \frac{0.5 r \left(1.0 r A{\left(r \right)} B{\left(r \right)} \frac{d^{2}}{d r^{2}} A{\left(r \right)} - 0.5 r A{\left(r \right)} \frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)} - 0.5 r B{\left(r \right)} \left(\frac{d}{d r} A{\left(r \right)}\right)^{2} - 1.0 A^{2}{\left(r \right)} \frac{d}{d r} B{\left(r \right)} + 1.0 A{\left(r \right)} B{\left(r \right)} \frac{d}{d r} A{\left(r \right)}\right)}{A^{2}{\left(r \right)} B^{2}{\left(r \right)}} & 0\\0 & 0 & 0 & \frac{0.5 r \left(1.0 r A{\left(r \right)} B{\left(r \right)} \frac{d^{2}}{d r^{2}} A{\left(r \right)} - 0.5 r A{\left(r \right)} \frac{d}{d r} A{\left(r \right)} \frac{d}{d r} B{\left(r \right)} - 0.5 r B{\left(r \right)} \left(\frac{d}{d r} A{\left(r \right)}\right)^{2} - 1.0 A^{2}{\left(r \right)} \frac{d}{d r} B{\left(r \right)} + 1.0 A{\left(r \right)} B{\left(r \right)} \frac{d}{d r} A{\left(r \right)}\right) \sin^{2}{\left(\theta \right)}}{A^{2}{\left(r \right)} B^{2}{\left(r \right)}}\end{matrix}\right]$

Der Einsteintensor $G_{\mu \nu}$ ist der entscheidende Tensor der allgemeinen Relativitätstheorie. Die Einsteingleichung (in natürlichen Einheiten c=G=1) lautet

$$ R_{\mu\nu} - \frac{1}{2} g_{\mu\nu} R ~=~ -8 \pi \, T_{\mu\nu} \quad, $$ wobei $T_{\mu\nu}$ der Energie-Impuls-Tensor der Materie ist. A. Einstein stellte im Jahre 1915 seine revolutionäre allgemeinen Relativitätstheorie der wissenschaftlichen Öffentlichkeit vor (siehe Einstein, A. 1915, Preuss. Akad.Wiss. Berlin, Sitzungsber., 778-786. und Einstein, A. 1915, Preuss. Akad.Wiss. Berlin, Sitzungsber., 844-847.). Seine Feldgleichungen leitete er mittels eines allgemeinen Kovarianzprinzips her und über seine neue Theorie schrieb er selbst "Dem Zauber der Theorie wird sich kaum jemand entziehen können, der sie wirklich erfasst hat;...".

Die Schönheit der Einstein Gleichung liegt neben ihrem zugrunde liegenden Kovarianzprinzip in der Einfachheit ihrer fundamentalen Aussage. Nach Einstein verbiegt jede Energieansammlung (Energie-Impuls-Tensor, rechte Seite der Gleichung) die Struktur der Raumzeit (Einstein Tensor, linke Seite der Gleichung) und diese gekrümmte Raumzeit ist der ursächliche Grund der Gravitation. Nach Einstein fällt der Apfel vom Baum zu Boden, da der große Energiegehalt der Erde die raumzeitliche Struktur so stark verbiegt, dass der Apfel sich in dieser gekrümmten Raumzeit nach geodätischen Gesetzen zu Boden bewegen muss.