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 (Wintersemester 2026/27)¶

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

Frankfurt am Main 26.07.2026¶

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 (ART) 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.

Mittlerweile gibt es in Python mehrere leistungsstarke Bibliotheken/Module, die Berechnungen der ART durchführen können. In vergangenen Vorlesungen verwendeten wir das Python-Modul Gravipy (siehe Vorlesung im Sommersemester 2020) bzw. das Python-Modul EinsteinPy (siehe Vorlesung im Sommersemester 2023). Beide Module basieren auf dem Modul SymPy welches symbolische Berechnungen mit Python vereinfacht. In der aktuellen Vorlesung werden wir zusätzlich zu EinsteinPy das Python-Modul OGRePy: An Object-Oriented General Relativity Package for Python verwenden, welches ebenfalls auf der Bibliothek SymPy basiert.

In diesem Jupyter Notebook stellen wir die Verwendung des Moduls "EinsteinPy" dar, wohingegen das Modul "OGRePy" in dem Jupyter Notebook Allgemeinen Relativitätstheorie mit Python und OGRePy vorgestellt wird (Download Notebook OGRePy.ipynb).

Allgemeinen Relativitätstheorie mit Python und 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]:
import sympy as sp
sp.init_printing()
import einsteinpy.symbolic as ep

Koordinatensystem und Metrik¶

Um symbolische Rechnungen in einer flachen oder gekrümmten Raumzeit machen zu können, müssen wir zunächst das verwendete Koordinatensystem und die Metrik der Raumzeit definieren.

Wir verwenden im Folgenden sphärische Raumzeitkoordinaten $(t,r,\theta,\phi)$ und beschreiben Ereignisse in der Raumzeit mit dem Vierer-Ortsvektor $x^\mu=(t,r,\theta,\phi)$ (Lichtgeschwindigkeit $c=1$). Des Weiteren nehmen wir eine allgemeine statische und isotrope Metrik an:

\begin{equation} 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) \end{equation}

Bei der Definition des sphärischen Koordinatensystems verwenden wir die SymPy-Variablen $t, r, \phi$ und $\theta$, wobei wir die Koordinate $r$ als positives SymPy-Symbol definieren. Die Funktionen $A(r)$ und $B(r)$ werden als SymPy-Funktionen. Den metrischen Tensor definieren wir schließlich als ein EinsteinPy-Objekt.

In [2]:
t, theta, phi = sp.symbols('t, theta, phi')
r = sp.symbols('r', nonnegative=True)
A = sp.Function('A')(r)
B = sp.Function('B')(r)
Metric = sp.diag(A, -B, -r**2, -r**2*sp.sin(theta)**2).tolist()
g = ep.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 = sp.tensorproduct(gInv.tensor(),g.tensor(),g.tensor())
sp.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 = sp.tensorproduct(g.tensor(),gInv.tensor())
sp.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]$

Die Christoffel Symbole¶

Die Christoffel 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)$$

In [10]:
chr = ep.ChristoffelSymbols.from_metric(g)
chr_llu = chr.change_config('llu')
print(chr_llu.config)
chr_llu.tensor()
llu
Out[10]:
$\displaystyle \left[\begin{matrix}\left[\begin{matrix}0 & - \frac{\frac{d}{d r} A{\left(r \right)}}{2 B{\left(r \right)}} & 0 & 0\\\frac{\frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)}} & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right] & \left[\begin{matrix}- \frac{\frac{d}{d r} A{\left(r \right)}}{2 A{\left(r \right)}} & 0 & 0 & 0\\0 & \frac{\frac{d}{d r} B{\left(r \right)}}{2 B{\left(r \right)}} & 0 & 0\\0 & 0 & - \frac{1}{r} & 0\\0 & 0 & 0 & - \frac{1}{r}\end{matrix}\right] & \left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & \frac{1}{r} & 0\\0 & \frac{r}{B{\left(r \right)}} & 0 & 0\\0 & 0 & 0 & - \frac{1}{\tan{\left(\theta \right)}}\end{matrix}\right] & \left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & 0 & \frac{1}{r}\\0 & 0 & 0 & \frac{1}{\tan{\left(\theta \right)}}\\0 & \frac{r \sin^{2}{\left(\theta \right)}}{B{\left(r \right)}} & \frac{\sin{\left(2 \theta \right)}}{2} & 0\end{matrix}\right]\end{matrix}\right]$

Speziell die $\Gamma^{1}_{1 1} = \Gamma^{r}_{r r}$ Komponente:

In [11]:
chr_llu.tensor()[1,1,1]
Out[11]:
$\displaystyle \frac{\frac{d}{d r} B{\left(r \right)}}{2 B{\left(r \right)}}$

Die Christoffel 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)$$

In [12]:
chr_lll = chr.change_config('lll') 
print(chr_lll.config)
chr_lll.tensor()
lll
Out[12]:
$\displaystyle \left[\begin{matrix}\left[\begin{matrix}0 & \frac{\frac{d}{d r} A{\left(r \right)}}{2} & 0 & 0\\\frac{\frac{d}{d r} A{\left(r \right)}}{2} & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right] & \left[\begin{matrix}- \frac{\frac{d}{d r} A{\left(r \right)}}{2} & 0 & 0 & 0\\0 & - \frac{\frac{d}{d r} B{\left(r \right)}}{2} & 0 & 0\\0 & 0 & r & 0\\0 & 0 & 0 & r \sin^{2}{\left(\theta \right)}\end{matrix}\right] & \left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & - r & 0\\0 & - r & 0 & 0\\0 & 0 & 0 & \frac{r^{2} \sin{\left(2 \theta \right)}}{2}\end{matrix}\right] & \left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & 0 & - r \sin^{2}{\left(\theta \right)}\\0 & 0 & 0 & - \frac{r^{2} \sin{\left(2 \theta \right)}}{2}\\0 & - r \sin^{2}{\left(\theta \right)} & - \frac{r^{2} \sin{\left(2 \theta \right)}}{2} & 0\end{matrix}\right]\end{matrix}\right]$

Speziell die $ \Gamma_{1 1 1} = \Gamma_{r r r}$ Komponente:

In [13]:
chr_lll.tensor()[1,1,1]
Out[13]:
$\displaystyle - \frac{\frac{d}{d r} B{\left(r \right)}}{2}$

Der Riemann und Ricci Tensor¶

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 = ep.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 = ep.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]:
sp.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 = ep.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')
sp.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¶

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

In [20]:
einst = ep.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 allgemeine 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.