Using Geodesics (Back-ends & Plotting)

[12]:
import numpy as np

from einsteinpy.geodesic import Geodesic, Timelike, Nulllike
from einsteinpy.plotting import GeodesicPlotter, StaticGeodesicPlotter, InteractiveGeodesicPlotter

Example 1: Exploring Schwarzschild Time-like Spiral Capture, using Python Backend and GeodesicPlotter

Defining initial conditions

[13]:
# Initial Conditions
position = [4., np.pi / 3, 0.]
momentum = [0., 0., -1.5]
a = 0. # Schwarzschild Black Hole

Calculating Geodesic

[14]:
geod = Timelike(
    metric = "Schwarzschild",
    metric_params = (a,),
    position=position,
    momentum=momentum,
    steps=15543, # As close as we can get before the integration becomes highly unstable
    delta=0.0005,
    return_cartesian=True,
    omega=0.01, # Small omega values lead to more stable integration
    suppress_warnings=True, # Uncomment to view the tolerance warning
)

geod
[14]:
Geodesic Object:(
            Type : (Time-like),
            Metric : (Schwarzschild),
            Metric Parameters : ((0.0,)),
            Initial 4-Position : ([0.         4.         1.04719755 0.        ]),
            Initial 4-Momentum : ([-0.77055175  0.          0.         -1.5       ]),
            Trajectory = (
                (array([    0,     1,     2, ..., 15540, 15541, 15542]), array([[ 7.70551750e-04,  3.46410160e+00, -2.16506351e-04, ...,
        -5.07812502e-05,  5.41265877e-05, -1.50000000e+00],
       [ 1.54110350e-03,  3.46410157e+00, -4.33012700e-04, ...,
        -1.01562501e-04,  1.08253176e-04, -1.50000000e+00],
       [ 2.31165526e-03,  3.46410152e+00, -6.49519046e-04, ...,
        -1.52343754e-04,  1.62379763e-04, -1.50000000e+00],
       ...,
       [ 2.10892615e+01,  5.06915642e-01, -1.93331152e+00, ...,
        -7.67875285e+01,  8.37708122e-01, -1.50000000e+00],
       [ 2.11285953e+01,  5.06465005e-01, -1.93307239e+00, ...,
        -7.82825155e+01,  8.37749353e-01, -1.50000000e+00],
       [ 2.11686915e+01,  5.06014321e-01, -1.93283308e+00, ...,
        -7.98370238e+01,  8.37790569e-01, -1.50000000e+00]]))
            ),
            Output Position Coordinate System = (Cartesian)
        ))

Plotting using GeodesicPlotter

Note that GeodesicPlotter automatically switches between “Static” and “Interactive” plots. Since we are in a Jupyter Notebook or Interactive Environment, it uses the “Interactive” backend.

[15]:
gpl = GeodesicPlotter()
[16]:
gpl.plot(geod, color="green", title="Geodesic Plot", aspect="auto")
gpl.show()

Data type cannot be displayed: application/vnd.plotly.v1+json

[17]:
gpl.clear() # In Interactive mode, `clear()` must be called before drawing another plot, to avoid overlap
gpl.plot2D(geod, coordinates=(1, 2), color="green", title="Top/Bottom View") # "top" / "bottom" view
gpl.show()

Data type cannot be displayed: application/vnd.plotly.v1+json

[18]:
gpl.clear()
gpl.plot2D(geod, coordinates=(1, 3), color="green", title="Face-On View") # "face-on" view
gpl.show()

Data type cannot be displayed: application/vnd.plotly.v1+json

Each interactive plot instance (gpl) has a fig attribute that is a plotly.graph_objs._figure.Figure object. So, one can easily make modifications to the plots as they would to any plotly figure. For instance, we can update the title to clarify that the plot above is showing a face-on view.

[19]:
gpl.fig.layout.title = {
    'text': 'Face-On View', 'x': 0.46, 'xanchor': 'center', 'y': 0.9, 'yanchor': 'top'
}
gpl.show()

Data type cannot be displayed: application/vnd.plotly.v1+json

[20]:
gpl.clear()
gpl.parametric_plot(geod, colors=("red", "green", "blue"))
gpl.show()

Data type cannot be displayed: application/vnd.plotly.v1+json