Im Folgenden betrachten wir die Bewegung eines massiven Probekörpers um ein rotierendes schwarzes Loch und lösen die Geodätengleichung in vorgegebener Kerr-Raumzeit (in Boyer-Lindquist Koordinaten). Die kovarianten Kerr Raumzeit-Metrik eines rotierenden schwarzen Lochs der Masse M und Rotation a ($ a \in [-1,1]$ ist ein spezifischer Drehimpuls $a=J/M$ und wird als der sogenannte Kerr-Rotationsparameter bezeichnet) besitzt in Boyer-Lindquist Koordinaten folgendes Aussehen: $$ \begin{eqnarray} &g_{\mu\nu}=\left( \begin{array}{ccc} g_{tt}(r,\theta) & 0 & 0 & g_{t\phi}(r,\theta)\\ 0& g_{rr}(r,\theta)& 0&0 \\ 0& 0& g_{\theta\theta}(r,\theta)& 0\\ g_{\phi t}(r,\theta)& 0& 0& g_{\phi\phi}(r,\theta)\\ \end{array} \right)& \\ & g_{tt}(r,\theta)=\left( \frac{1-2\,M\,r}{\rho^2} \right)\,\,, \, g_{t\phi}(r,\theta)=\frac{2aMr\hbox{sin}^2(\theta)}{\rho^2} &\\ &g_{rr}(r,\theta)=-\frac{\rho^2}{\Delta}\,\,, \quad g_{\theta\theta}(r,\theta)=-\rho^2\,\,, \, & \\ &g_{\phi\phi}(r,\theta)=-\left( \frac{r^2+a^2+2 M r a^2 \hbox{sin}^2(\theta)}{\rho^2} \right)\hbox{sin}^2(\theta)\,\,,&\\ &\rho^2=r^2+a^2 \hbox{cos}^2(\theta) \,\,, \quad \Delta=r^2-2Mr+a^2& \end{eqnarray} $$
Wir definieren zunächst die kovarianten Raumzeit-Metrik eines rotierenden schwarzen Lochs der Masse M und Rotation a in Boyer-Lindquist Koordinaten (a ist der spezifische Drehimpuls ($a=J/M$) und wird als der sogenannte Kerr-Rotationsparameter bezeichnet):
from sympy import *
init_printing()
from einsteinpy.symbolic import *
t, r, theta, phi, M, a = symbols('t, r, theta, phi, M, a')
rho2=r**2+(a*cos(theta))**2
Delta=r**2-2*M*r+a**2
Metric = Matrix([[(1-2*M*r/rho2), 0, 0, (2*a*M*r*(sin(theta))**2)/rho2], [0, -rho2/Delta, 0, 0], [0, 0, -rho2, 0], [(2*a*M*r*(sin(theta))**2)/rho2, 0, 0, -(r**2+a**2+(2*M*r*a**2*(sin(theta))**2)/rho2)*(sin(theta))**2]]).tolist()
g = MetricTensor(Metric, [t, r, theta, phi])
g.tensor()
Rotierende schwarze Löcher besitzen, im Gegensatz zu nicht-rotierenden schwarzen Löchern, eine Ringsingularität und eine kompliziertere Struktur der Ereignishorizonte.
Ereignishorizonte ereignen sich formal an den Raumzeitpunkten, bei denen die radiale Komponente der zugrunde liegenden Metrik singulär wird ($g_{rr}\rightarrow\infty$ (bzw. $g^{rr}=0$).
EqHorizonte=Eq(g.inv()[1,1],0)
EqHorizonte
Für $a \neq 0$ erhält man zwei Lösungen, die man gewöhnlich mit den Symbolen $r_{+}$ und $r_{-}$ bezeichnet
$$ r_{+}= M + \sqrt{M^2 - a^2}\,, \quad r_{-}= M - \sqrt{M^2 - a^2}\quad, $$und die für $a = 0$ in den Schwarzschild-Limes des Ereignishorizontes eines nicht-rotierenden schwarzen Lochs übergehen ($a=0 \rightarrow r_{+}=r_{-}=2\,M$).
LoesEqHorizonte=solve(EqHorizonte,r)
LoesEqHorizonte
Zusätzlich existieren die Flächen der stationären Grenze (stationary limit surfaces) und die der unendlichen Rotverschiebung; sie sind durch $g_{tt}=0$ bestimmt und werden gewöhnlich mit den Symbolen $r_{S^+}$ und $r_{S^-}$ bezeichnet: $$ r_{S^+}= M + \sqrt{M^2 - a^2{{\rm cos}^2(\theta)}}\,, \,\, r_{S^-}= M - \sqrt{M^2 - a^2{{\rm cos}^2(\theta)}} $$
EqUnRot=Eq(g.tensor()[0,0],0)
EqUnRot
LoesEqUnRot=solve(EqUnRot,r)
LoesEqUnRot
Die Horizontstruktur und die Flächen der stationären Grenze (unendliche Rotverschiebung) eines rotierenden schwarzen Lochs veranschaulichen wir in den folgenden Bildern (Kerr-Rotationparameter $a \in [0.5, \,0.95, \,0.99]$).
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.gridspec as gridspec
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
params = {
'figure.figsize' : [16,5],
# 'text.usetex' : True,
'axes.titlesize' : 14,
'axes.labelsize' : 16,
'xtick.labelsize' : 14 ,
'ytick.labelsize' : 14
}
matplotlib.rcParams.update(params)
PlotHplus=lambdify((a), LoesEqHorizonte[1].subs({(M,1)}))
PlotHminus=lambdify((a), LoesEqHorizonte[0].subs({(M,1)}))
PlotUnRotplus=lambdify((a,theta), LoesEqUnRot[1].subs({(M,1)}))
PlotUnRotminus=lambdify((a,theta), LoesEqUnRot[0].subs({(M,1)}))
ntheta, nphi = np.linspace(0, 1.5 * np.pi, 400), np.linspace(0, np.pi, 400)
THETA, PHI = np.meshgrid(ntheta, nphi)
xylim=2.0
fig = plt.figure(figsize=(16,4.5))
gs = gridspec.GridSpec(1, 3, width_ratios=[1,1,1], wspace=0.25)
ax1 = plt.subplot(gs[0],projection='3d')
ax2 = plt.subplot(gs[1],projection='3d')
ax3 = plt.subplot(gs[2],projection='3d')
seta=0.7
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax1.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax1.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax1.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax1.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
seta=0.95
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax2.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax2.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax2.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax2.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
seta=0.999
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax3.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax3.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax3.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax3.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
ax1.set_title(r"$\rm a=0.7$")
ax1.set_ylabel(r"$\rm x$")
ax1.set_xlabel(r"$\rm y$")
ax1.set_zlabel(r"$\rm z$")
ax1.set_xlim(-xylim, xylim)
ax1.set_ylim(-xylim, xylim)
ax1.set_zlim(-xylim, xylim)
ax1.xaxis.pane.fill = False
ax1.yaxis.pane.fill = False
ax1.zaxis.pane.fill = False
ax1.xaxis.pane.set_edgecolor('white')
ax1.yaxis.pane.set_edgecolor('white')
ax1.zaxis.pane.set_edgecolor('white')
ax1.view_init(azim=-55, elev=20)
ax2.set_title(r"$\rm a=0.95$")
ax2.set_ylabel(r"$\rm x$")
ax2.set_xlabel(r"$\rm y$")
ax2.set_zlabel(r"$\rm z$")
ax2.set_xlim(-xylim, xylim)
ax2.set_ylim(-xylim, xylim)
ax2.set_zlim(-xylim, xylim)
ax2.xaxis.pane.fill = False
ax2.yaxis.pane.fill = False
ax2.zaxis.pane.fill = False
ax2.xaxis.pane.set_edgecolor('white')
ax2.yaxis.pane.set_edgecolor('white')
ax2.zaxis.pane.set_edgecolor('white')
ax2.view_init(azim=-55, elev=20)
ax3.set_title(r"$\rm a=0.99$")
ax3.set_ylabel(r"$\rm x$")
ax3.set_xlabel(r"$\rm y$")
ax3.set_zlabel(r"$\rm z$")
ax3.set_xlim(-xylim, xylim)
ax3.set_ylim(-xylim, xylim)
ax3.set_zlim(-xylim, xylim)
ax3.xaxis.pane.fill = False
ax3.yaxis.pane.fill = False
ax3.zaxis.pane.fill = False
ax3.xaxis.pane.set_edgecolor('white')
ax3.yaxis.pane.set_edgecolor('white')
ax3.zaxis.pane.set_edgecolor('white')
ax3.view_init(azim=-55, elev=20)
#ax1.grid(False)
Rotierende schwarze Löcher besitzen eine kompliziertere Struktur ihrer Ereignishorizonte und die Flächen unendlicher Rotverschiebung und die Grenzflächen stationärer Bewegungen sind im Allgemeinen nicht identisch mit den Horizonten. Die oberen Abbildungen zeigen dies für drei unterschiedlich schnell rotierende schwarze Löcher (links $a=0.7$, Mitte $a=0.95$ und rechts $a=0.99$). Bei nichtverschwindender Rotation existieren zwei Ereignishorizonte (siehe obere Abbildung, r+: graue Fläche und r-: grüne Fläche) und ebenso existieren zwei Flächen unendlicher Rotverschiebung (rs+</sub>: äußere rote Fläche und rs-</sub>: blaue Fläche). Der Bereich zwischen der äußeren roten Fläche unendlicher Rotverschiebung und dem äußeren grauen Ereignishorizont bei r+ nennt man Ergosphäre; hier können Testteilchen nicht mehr entgegengesetzt der Rotationsrichtung des schwarzen Lochs rotieren, stationäre Bewegungen sind somit nicht mehr möglich. Die unteren Abbildungen zeigen die gleichen Bilder bei einem anderen Viewpoint.
xylim=2.0
fig = plt.figure(figsize=(16,4.5))
gs = gridspec.GridSpec(1, 3, width_ratios=[1,1,1], wspace=0.25)
ax1 = plt.subplot(gs[0],projection='3d')
ax2 = plt.subplot(gs[1],projection='3d')
ax3 = plt.subplot(gs[2],projection='3d')
seta=0.7
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax1.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax1.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax1.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax1.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
seta=0.95
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax2.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax2.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax2.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax2.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
seta=0.999
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax3.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax3.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax3.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax3.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
ax1.set_title(r"$\rm a=0.7$")
ax1.set_ylabel(r"$\rm x$")
ax1.set_xlabel(r"$\rm y$")
ax1.set_zlabel(r"$\rm z$")
ax1.set_xlim(-xylim, xylim)
ax1.set_ylim(-xylim, xylim)
ax1.set_zlim(-xylim, xylim)
ax1.xaxis.pane.fill = False
ax1.yaxis.pane.fill = False
ax1.zaxis.pane.fill = False
ax1.xaxis.pane.set_edgecolor('white')
ax1.yaxis.pane.set_edgecolor('white')
ax1.zaxis.pane.set_edgecolor('white')
ax1.view_init(azim=90, elev=0)
ax2.set_title(r"$\rm a=0.95$")
ax2.set_ylabel(r"$\rm x$")
ax2.set_xlabel(r"$\rm y$")
ax2.set_zlabel(r"$\rm z$")
ax2.set_xlim(-xylim, xylim)
ax2.set_ylim(-xylim, xylim)
ax2.set_zlim(-xylim, xylim)
ax2.xaxis.pane.fill = False
ax2.yaxis.pane.fill = False
ax2.zaxis.pane.fill = False
ax2.xaxis.pane.set_edgecolor('white')
ax2.yaxis.pane.set_edgecolor('white')
ax2.zaxis.pane.set_edgecolor('white')
ax2.view_init(azim=90, elev=0)
ax3.set_title(r"$\rm a=0.99$")
ax3.set_ylabel(r"$\rm x$")
ax3.set_xlabel(r"$\rm y$")
ax3.set_zlabel(r"$\rm z$")
ax3.set_xlim(-xylim, xylim)
ax3.set_ylim(-xylim, xylim)
ax3.set_zlim(-xylim, xylim)
ax3.xaxis.pane.fill = False
ax3.yaxis.pane.fill = False
ax3.zaxis.pane.fill = False
ax3.xaxis.pane.set_edgecolor('white')
ax3.yaxis.pane.set_edgecolor('white')
ax3.zaxis.pane.set_edgecolor('white')
ax3.view_init(azim=90, elev=0)
#ax1.grid(False)
Wir stellen diese Abbildungen in einer Animation dar:
import matplotlib.gridspec as gridspec
import matplotlib.animation as animation
from IPython.display import HTML
params = {
'figure.figsize' : [8,8],
# 'text.usetex' : True,
'axes.titlesize' : 14,
'axes.labelsize' : 16,
'xtick.labelsize' : 14 ,
'ytick.labelsize' : 14
}
matplotlib.rcParams.update(params)
anzframes=13
xylim=2.0
fig = plt.figure(figsize=(15,7))
gs = gridspec.GridSpec(1, 2, width_ratios=[1,1], wspace=0.21)
ax1 = plt.subplot(gs[0],projection='3d')
ax2 = plt.subplot(gs[1],projection='3d')
Lseta=[0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.98,0.99,0.999,0.9999]
def init():
seta=Lseta[0]
settitle='a='+str(round(seta, 3))
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax1.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax1.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax1.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax1.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
ax2.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax2.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax2.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax2.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
ax1.set_title(settitle)
ax1.set_ylabel(r"$\rm x$")
ax1.set_xlabel(r"$\rm y$")
ax1.set_zlabel(r"$\rm z$")
ax1.set_xlim(-xylim, xylim)
ax1.set_ylim(-xylim, xylim)
ax1.set_zlim(-xylim, xylim)
ax1.set_xticks([-2,-1,0,1,2])
ax1.set_yticks([-2,-1,0,1,2])
ax1.set_zticks([-2,-1,0,1,2])
ax1.xaxis.pane.fill = False
ax1.yaxis.pane.fill = False
ax1.zaxis.pane.fill = False
ax1.xaxis.pane.set_edgecolor('white')
ax1.yaxis.pane.set_edgecolor('white')
ax1.zaxis.pane.set_edgecolor('white')
ax2.set_title(settitle)
ax2.set_ylabel(r"$\rm x$")
ax2.set_xlabel(r"$\rm y$")
ax2.set_zlabel(r"$\rm z$")
ax2.set_xlim(-xylim, xylim)
ax2.set_ylim(-xylim, xylim)
ax2.set_zlim(-xylim, xylim)
ax2.set_xticks([-2,-1,0,1,2])
ax2.set_yticks([-2,-1,0,1,2])
ax2.set_zticks([-2,-1,0,1,2])
ax2.xaxis.pane.fill = False
ax2.yaxis.pane.fill = False
ax2.zaxis.pane.fill = False
ax2.xaxis.pane.set_edgecolor('white')
ax2.yaxis.pane.set_edgecolor('white')
ax2.zaxis.pane.set_edgecolor('white')
ax1.view_init(azim=-55, elev=20)
ax2.view_init(azim=90, elev=0)
return fig,
def animate(i):
ax1.cla()
ax2.cla()
seta=Lseta[i]
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
ax1.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax1.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax1.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax1.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
ax2.plot_surface(HminusX, HminusY, HminusZ, color="green", linewidth=0, alpha=0.5)
ax2.plot_surface(HplusX, HplusY, HplusZ, color="grey", linewidth=0, alpha=0.5)
ax2.plot_wireframe(UnRotplusX, UnRotplusY, UnRotplusZ, rstride=10, cstride=10, linewidth=0.5,antialiased=True,color="red", alpha=0.5)
ax2.plot_wireframe(UnRotminusX, UnRotminusY, UnRotminusZ, rstride=10, cstride=10, linewidth=1,antialiased=True,color="blue", alpha=0.5)
settitle='a='+str(round(seta, 3))
ax1.set_title(settitle)
ax1.set_ylabel(r"$\rm x$")
ax1.set_xlabel(r"$\rm y$")
ax1.set_zlabel(r"$\rm z$")
ax1.set_xlim(-xylim, xylim)
ax1.set_ylim(-xylim, xylim)
ax1.set_zlim(-xylim, xylim)
ax1.set_xticks([-2,-1,0,1,2])
ax1.set_yticks([-2,-1,0,1,2])
ax1.set_zticks([-2,-1,0,1,2])
ax1.xaxis.pane.fill = False
ax1.yaxis.pane.fill = False
ax1.zaxis.pane.fill = False
ax1.xaxis.pane.set_edgecolor('white')
ax1.yaxis.pane.set_edgecolor('white')
ax1.zaxis.pane.set_edgecolor('white')
ax2.set_title(settitle)
ax2.set_ylabel(r"$\rm x$")
ax2.set_xlabel(r"$\rm y$")
ax2.set_zlabel(r"$\rm z$")
ax2.set_xlim(-xylim, xylim)
ax2.set_ylim(-xylim, xylim)
ax2.set_zlim(-xylim, xylim)
ax2.set_xticks([-2,-1,0,1,2])
ax2.set_yticks([-2,-1,0,1,2])
ax2.set_zticks([-2,-1,0,1,2])
ax2.xaxis.pane.fill = False
ax2.yaxis.pane.fill = False
ax2.zaxis.pane.fill = False
ax2.xaxis.pane.set_edgecolor('white')
ax2.yaxis.pane.set_edgecolor('white')
ax2.zaxis.pane.set_edgecolor('white')
ax1.view_init(azim=-55, elev=20)
ax2.view_init(azim=90, elev=0)
return fig,
ani = animation.FuncAnimation(fig,animate,init_func=init,frames=anzframes,interval=600)
plt.close(ani._fig)
HTML(ani.to_html5_video())
Die Visualisierung kann man auch wieder mittels der "Plotly Python Open Source Graphing Library" erstellen ( siehe https://plotly.com/python/ ).
import plotly.graph_objects as go
seta=0.98
R = PlotHplus(seta)
HplusX = R * np.sin(THETA) * np.cos(PHI)
HplusY = R * np.sin(THETA) * np.sin(PHI)
HplusZ = R * np.cos(THETA)
R = PlotHminus(seta)
HminusX = R * np.sin(THETA) * np.cos(PHI)
HminusY = R * np.sin(THETA) * np.sin(PHI)
HminusZ = R * np.cos(THETA)
R = PlotUnRotplus(seta,THETA)
UnRotplusX = R * np.sin(THETA) * np.cos(PHI)
UnRotplusY = R * np.sin(THETA) * np.sin(PHI)
UnRotplusZ = R * np.cos(THETA)
R = PlotUnRotminus(seta,THETA)
UnRotminusX = R * np.sin(THETA) * np.cos(PHI)
UnRotminusY = R * np.sin(THETA) * np.sin(PHI)
UnRotminusZ = R * np.cos(THETA)
PHminus = go.Surface(x=HminusX, y=HminusY, z=HminusZ, colorscale="greens", showscale=False)
PHplus = go.Surface(x=HplusX, y=HplusY, z=HplusZ, colorscale="greys", showscale=False)
PUnRotplus = go.Surface(x=UnRotplusX, y=UnRotplusY, z=UnRotplusZ, colorscale="reds", showscale=False)
PUnRotminus = go.Surface(x=UnRotminusX, y=UnRotminusY, z=UnRotminusZ, colorscale="blues", showscale=False)
layout = go.Layout(autosize=True,
width=700, height=700,
margin=dict(l=15, r=50, b=65, t=90),
scene_aspectmode='cube',
scene = dict(
xaxis_showbackground=False,
yaxis_showbackground=False,
zaxis_showbackground=False,
xaxis_gridcolor="lightgrey",
yaxis_gridcolor="lightgrey",
zaxis_gridcolor="lightgrey",
xaxis_range=[-2,2],
yaxis_range=[-2,2],
zaxis_range=[-2,2],
xaxis_title='x',
yaxis_title='y',
zaxis_title='z')
)
data=[PHminus,PHplus,PUnRotplus,PUnRotminus]
fig=go.Figure(data=data, layout=layout)
camera = dict(eye=dict(x=1, y=-1.8, z=1.8))
fig.update_layout(scene_camera=camera)
fig.show()