Jorge Martinez

Aerospace Engineer and Senior Software Developer


Exoplanetas y Astrobiología - Actividad Guiada I

Jorge Martínez Garrido

June 14, 2023

astronomy astrophysics exoplanets


El presente informe recoge el estudio y resultados propuestos por la actividad I de la asignatura Exoplanetas y Astrobiología.

En este informe se presenta un resumen del estudio realizado sobre exoplanetas, centrándose en la familiarización con la terminología propia de este campo y el análisis de datos reales para la caracterización de un planeta en particular. Se analizó la curva de luz durante el tránsito del planeta, que proporcionó información sobre la interacción entre el planeta y su estrella madre. Además, se examinó la curva de velocidad radial para comprender los efectos gravitacionales del planeta en la estrella. Mediante estos análisis, se calcularon parámetros físicos clave del planeta, como su masa, tamaño y período orbital. Posteriormente, se discutieron las propiedades del planeta, incluyendo su posición dentro o fuera de la zona de habitabilidad, con el objetivo de evaluar su potencial para albergar vida. Este estudio contribuye al conocimiento de la diversidad de exoplanetas y a la búsqueda de posibles entornos habitables en el universo.

Método del tránsito

El método de detección por tránsito es una técnica utilizada para descubrir exoplanetas al observar cambios en el brillo de una estrella cuando un planeta pasa frente a ella desde nuestra perspectiva en la Tierra. Este método se basa en la detección de la disminución en la intensidad de la luz estelar cuando el planeta bloquea parte de la luz al transitar por delante de la estrella.

Para llevar a cabo este método, los astrónomos monitorean el brillo de una estrella de forma continua y precisa a lo largo del tiempo. Si un planeta orbita alrededor de esa estrella, cuando pasa entre la estrella y nosotros, su tamaño y posición relativa causan una disminución en la intensidad de la luz que llega a nuestros detectores.

Soluciones a los ejercicios propuestos

Esta sección recoge los resultados y soluciones a los ejercicios propuestos por la actividad.

Para resolver los ejercicios se ha utilizado el lenguaje de programacion Python. Todo el codigo generado se incluye en cada apartado del ejercicio.

Datos conocidos

Los siguientes datos han sido proporcionados para resolver los diferentes ejercicios propuestos. Dado que muchos de los datos se ofrecen con respecto al Sol, se incluyen tambien los datos de nuestra estrella:

import numpy as np
from astropy.constants import M_sun, M_earth, R_sun, R_jup, G, M_jup


print(f"Constante de gravitacion universal {G.value:e} {G.unit}")
print(f"Masa del Sol {M_sun.value:e} {M_sun.unit}")
print(f"Radio del Sol {R_sun.value:e} {R_sun.unit}")
print(f"Masa de Júpiter {M_jup.value:e} {M_jup.unit}")
Constante de gravitacion universal 6.674300e-11 m3 / (kg s2)
Masa del Sol 1.988410e+30 kg
Radio del Sol 6.957000e+08 m
Masa de Júpiter 1.898125e+27 kg

El resto de datos incluyen:

import astropy.units as u

M_star, R_star = 0.45 * M_sun, 0.46 * R_sun
T_star = 3350 * u.K
P_planet = 2.643 * u.day
ecc_planet = 0.16 * u.one

Tambien se incluyen archivos de datos para cantidad de flujo luminoso y velocidad radial en funcion del tiempo:

from astropy.io import ascii

# Read the radial velocity data file an extract the desired information
rv_data = ascii.read("data/rv_hires.txt")
transit_data = ascii.read("data/transito_spitzer.txt")

Ejercicio 1 - Solución

Representa gráficamente la curva de luz de la estrella, y argumenta por qué se intuye la presencia de un planeta.

Comenzamos extrayendo los datos deseados de tiempo y flujo luminoso:

hjd = transit_data['HJD']
flux = transit_data['Flux']
error = transit_data['Noise']

Graficamos la curva de luz en función del tiempo de observación:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# Create the plot
ax.errorbar(hjd, flux, yerr=error, fmt='o', markersize=1, label="Error de observacion")
ax.plot(hjd, flux, "r-", label="Valores observados")
ax.fill_between(hjd, flux, color='lightyellow')


# Decorate the plot
ax.set_xlabel('HJD')
ax.set_ylabel('Flujo')
ax.set_title('Flujo luminoso en función del tiempo')
ax.grid(True)
ax.legend(shadow=True)

# Set limits
ax.set_ylim([0.99, 1.00])

# Display the plot
plt.show()

La gráfica anterior muestra una disminucion del flujo de casi 1% para las fechas entre 0.76+2.4542e6 y 0.80+2.4542e6. Este valor es suficiente para justificar la existencia de un cuerpo que orbita a la estrella siempre. Para estar más seguros, sería conveniente observar el patrón durante más tiempo, lo que también permitiría obtener el período del planeta.

Ejercicio 2 - Solución

Obtén la profundidad del tránsito, y a partir de ésta, calcula el radio del planeta. No olvides indicar las unidades en las que expresas todos tus resultados. Tampoco olvides explicar cómo los obtienes.

Para calcular la profundidad del tránsito es posible aplicar la relación:

$$ TD = \frac{A_{\text{planet}}}{A_{\text{star}}} = \left ( \frac{R_{\text{planet}}}{R_{\text{star}}} \right )^{2} = \frac{C_1 - C_2}{C_1} $$

En la relación anterior, los valores presentados son:

Por otro lado, el valor $C_1$ hace referencia al valor medio del flujo durante la ausencia del tránsito y el valor $C_2$ hace referencia al valor medio del flujo durante el tránsito. Ambos valores se han estimado en:

C_1 = 1.000
C_2 = 0.993

Por ello, es posible obtener el valor de la profundidad del tránsito:

transit_depth = (C_1 - C_2) / C_1
print(f"Profundidad del tránsito: {transit_depth:.3f}")
Profundidad del tránsito: 0.007

Finalmente, obtenemos el radio del planeta utilizando el valor anterior:

R_planet = transit_depth ** 0.5 * R_star
print(f"El radio del planeta es {R_planet.to(u.km):.2f}")
El radio del planeta es 26774.96 km

Ejercicio 3 - Solución

Calcula la distancia del planeta a la estrella que orbita. Comenta el valor obtenido.

Podemos calcular la distancia del planeta a la estrella que orbita a partir de la tercera ley de Kepler:

$$ a_{\text{planet}}^{3} = G \cdot \frac{T_{\text{planet}}^2 M_{star}}{4 \pi^2} $$

Despejando $a_{\text{planet}}$, es posible obtener el valor:

a_planet = ((G * P_planet ** 2 * M_star) / (4 * np.pi ** 2)) ** (1 / 3)
print(f"El semi-eje mayor de la orbita del planeta es {a_planet.to(u.au):.3f}")
El semi-eje mayor de la orbita del planeta es 0.029 AU

El dato anterior indica que el planeta se encuentra muy cercano a su estrella. Mucho más que Mercurio al Sol.

Ejercicio 4 y 5 - Solución

Representa gráficamente la curva de velocidad radial de la estrella, explica qué indica cada eje, y qué se observa en la gráfica. Obtén K, la semi-amplitud de la velocidad radial. Para ello representa la curva de velocidad radial en función de la fase, y estima el valor de la amplitud de la modulación.

Extraemos los datos del archivo rv_hires.txt:

time = rv_data["Time_(days)"]
delta_time = time - time[0]
rv = rv_data["RV_(m/s)"]
error = rv_data["Error"]
phase = rv_data["Phase"]

Declaramos una funcion para extraer una relacion sinusoidal a partir de los datos:

from scipy.optimize import curve_fit


def sinusoidal_function(phase, amplitude, frequency, phase_offset, rv_offset):
    return amplitude * np.sin(2 * np.pi * frequency * phase + phase_offset) + rv_offset


params, _ = curve_fit(sinusoidal_function, delta_time, rv)
delta_time_fit = np.linspace(min(delta_time), max(delta_time), 300)
rv_fit_delta_time = sinusoidal_function(delta_time_fit, *params)


params, _ = curve_fit(sinusoidal_function, phase, rv)
phase_fit = np.linspace(min(phase), max(phase), 1000)
rv_fit_phase = sinusoidal_function(phase_fit, *params)

Resolvemos la semi-amplitud de la velocidad radial con los datos anteriores:

K = abs(max(rv_fit_phase) - min(rv_fit_phase)) / 2 * u.m / u.s
print(f"El valor de la semi-amplitud K = {K:.2f}")
El valor de la semi-amplitud K = 18.44 m / s

Representamos la velocidad radial de la estrella:

# Crear la figura y los subplots
fig, axs = plt.subplots(2, 1, figsize=(8, 8))

# Graficar la evolución de la velocidad radial a lo largo del tiempo
axs[0].plot(delta_time / 356, rv, 'o', color='b', label="Observaciones")
axs[0].plot(delta_time_fit / 365, rv_fit_delta_time, 'k-', label="Evolución")

axs[0].set_xlabel("Tiempo [años]")
axs[0].set_ylabel('Velocidad radial [m/s]')
axs[0].set_title('Evolución de la velocidad radial a lo largo del tiempo')
axs[0].set_xlim([min(delta_time / 365), max(delta_time / 365)])
axs[0].set_ylim([1.1 * min(rv), 1.1 * max(rv)])
axs[0].legend(shadow=True)


# Graficar la evolución de la velocidad radial en función de la fase
axs[1].plot(phase, rv, 'o', color='red', label="Observaciones")
axs[1].plot(phase_fit, rv_fit_phase, 'k-', label="Evolución")
axs[1].set_xlabel('Fase')
axs[1].set_ylabel('Velocidad radial [m/s]')
axs[1].set_title('Evolución de la velocidad radial en función de la fase')
axs[1].set_xlim([0, 1])
axs[1].set_ylim([1.1 * min(rv), 1.1 * max(rv)])
axs[1].legend(shadow=True)

# Ajustar los espacios entre subplots
plt.tight_layout()

En la primera gráfica se observa la evolución de la velocidad radial en metros por segundo en función del tiempo. Este tiempo se indica en años transcurridos desde el comienzo de las observaciones. Los datos de esta gráfica son escasos considerando la cantidad de tiempo que ha sido necesaria para su obtención. Resulta difícil extraer una relación periódica. No obstante se ofrece una que se ajusta a los pocos datos proporcionados.

Por otro lado, en la segunda gráfica se muestra la evolución de la velocidad radial en metros por segundo en función de la fase. Se observa una relación sinusoidal para los datos, lo que indica que la velocidad de la estrella a lo largo de la dirección radial se ve afectada. Esta perturbación puede ser consecuencia de un cuerpo que orbite la estrella, en este caso, un exoplaneta.

Ejercicio 6 - Solución

Calcula la masa mínima del planeta. Comenta el valor obtenido. Calcula la masa real del planeta, y explica cómo puedes conocerla.

Es posible calcular la masa del planeta a partir de la relación:

$$ M_p \cdot \sin(i) = 4.92 \times 10^{-3} \cdot \sqrt{1 - e^2} \cdot K \cdot P^{\frac{1}{3}} \cdot M_{s}^{\frac{2}{3}} $$

Donde:

El valor para la inclinación no se conoce. Este valor está incluido dentro de una función seno, por lo que establece dos límites en la masa del planeta, uno mínimo y otro máximo. El máximo valor se localiza en el infinito debido a la singularidad matemática que existe a medida que la inclinación se aproxima a cero.

Aplicando la fórmula anterior se obtienen los siguientes valores para diferentes inclinaciones:

from astropy.constants import M_earth


def solve_planetary_mass(ecc_planet, semi_amplitude, period, M_star, inclination):
    return (4.92e-3 * np.sqrt(1 - ecc_planet**2) * K.to(u.m / u.s).value * P_planet.to(u.day).value**(1/3) * (M_star / M_sun)**(2/3)) / np.sin(inclination)

def solve_minimum_planetary_mass(ecc_planet, semi_amplitude, period, M_star):
    return solve_planetary_mass(ecc_planet, semi_amplitude, period, M_star, np.pi / 2)

M_planet = solve_minimum_planetary_mass(ecc_planet, K, P_planet, M_star)
print(f"The minimum planetary mass is {M_planet:.5f} Jupiter mass, around 7.3% of the mass of this planet.")
The minimum planetary mass is 0.07272 Jupiter mass, around 7.3% of the mass of this planet.

Ejercicio 7 - Solución

Si el valor de Ms se conoce con incertidumbre del 10%, cómo influye esto en la determinación de la masa del planeta?

Podemos calcular los nuevos valores considerando una variación de +10% y -10% en la masa de la estrella:

M_planet_over_10 = solve_minimum_planetary_mass(ecc_planet, K, P_planet, 1.1 * M_star)
print(f"Minimum mass for +10% is {M_planet:.5f} Jupiter mass, around 7.3% of the mass of this planet.")

M_planet_under_10 = solve_minimum_planetary_mass(ecc_planet, K, P_planet, 0.9 * M_star)
print(f"Minimum mass for -10% is {M_planet:.5f} Jupiter mass, around 7.3% of the mass of this planet.")
Minimum mass for +10% is 0.07272 Jupiter mass, around 7.3% of the mass of this planet.
Minimum mass for -10% is 0.07272 Jupiter mass, around 7.3% of the mass of this planet.

Para este caso, la masa de la estrella observada es cercana a la masa del Sol. Considerando esta situación junto con la cercanía del exoplaneta a la estrella, es presumible asumir que la masa del planeta es muy pequeña comparada con la de su estrella. Por ello, una variación del 10% en la masa de la estrella apenas influye en la masa mínima del planeta.

Ejercicio 8 - Solución

Calcula la densidad del planeta, e intenta deducir qué tipo de planeta puede ser.

Para calcular la densidad del planeta, asumimos que presenta una forma de esfera perfecta. Conocida la relación:

$$ \rho = \frac{m}{V} $$

Donde:

Relacionando con el volumen de una esfera se obtiene:

$$ \rho = \frac{3m}{4\pi r^3} $$

Donde:

Generamos una colección de funciones auxiliares y calculamos la densidad del planeta:

def solve_sphere_volume(R_sphere):
    return (3 / 4) * np.pi * R_sphere ** 3

def solve_density(mass, volume):
    return mass / volume

def solve_sphere_planet_density(M_planet, R_planet):
    return solve_density(M_planet, solve_sphere_volume(R_planet))


rho_planet = solve_sphere_planet_density(M_planet * M_jup, R_planet) 
print(f"La densidad del planeta es {rho_planet:.0f}")
La densidad del planeta es 3052 kg / m3

Considerando la siguiente tabla para la clasificación de planetas:

Tabla de clasificación de planetas

Es posible identificar el tipo de planeta conocidos los siguientes datos:

print(f"El radio del planeta en radios de Jupiter es {R_planet / R_jup:.2f}")
print(f"El logaritmo de la masa del planeta en masas terrestres es {np.log(M_planet * M_jup / M_earth):.2f}")
El radio del planeta en radios de Jupiter es 0.37
El logaritmo de la masa del planeta en masas terrestres es 3.14

Estos datos indican que el planeta se encuentra en la zona indicada como Kepler-22b. Nos encontramos ante un planeta de grandes dimensiones comparado con la tierra.

Si bien presenta un tamaño cercano a Neptuno, su órbita es tan cercana a su estrella que no puede tratarse de un planeta gaseoso. Esto se debe a que el viento solar habría barrido por completo su atmósfera. Por otro lado, su densidad es demasiado baja para ser un planeta rocoso.

Una posible explicación es que el planeta esté formado por lo que se conoce como hielo caliente. El hielo caliente se forma cuando se somete a alta presión (causada por la gravedad del planeta) y se calienta más allá de su punto de fusión. Bajo estas condiciones extremas, las moléculas de agua pueden adoptar una estructura cristalina diferente a la del hielo común que conocemos. En lugar de la estructura hexagonal típica del hielo, el hielo caliente tiene una estructura cúbica.

Ejercicio 9 - Solución

Calcula la temperatura de equilibrio del planeta. Utiliza un albedo nulo, o el valor del albedo de la Tierra. Comenta el valor obtenido.

Para calcular la temperatura de equilibrio del planeta, aplicamos la siguiente relación:

$$ T_{\text{eq}} = T_s (1 - A)^{1 / 4} \sqrt{\frac{R_s}{2a}} $$

Donde:

Aplicando la relación anterior se obtiene:

def solve_equilibrium_temperature(T_star, albedo, R_star, semi_major_axis):
    return T_star * (1 - albedo) ** 0.25 * np.sqrt(R_star / (2 * semi_major_axis))


T_eq = solve_equilibrium_temperature(T_star, 0, R_star, a_planet).decompose()
print(f"La temperatura de equilibrio es de {T_eq:.2f}, equivalente a {T_eq.value + 273.16:.2f} C")
La temperatura de equilibrio es de 647.08 K, equivalente a 920.24 C

Ejercicio 10 - Solución

Sitúa el planeta en un diagrama con las zonas habitabilidad, y discute si se encuentra o no en zona habitable.

Considerando la relación para la zona de habitabilidad establecida por el siguiente diagrama:

Zona de habitabilidad

Teniendo en cuenta los datos del planeta:

print(f"Semi-eje mayor de la órbita del planeta {a_planet.to(u.au):.2f}")
print(f"Relación masa estrella y masa solar {M_star / M_sun:.2f}")
Semi-eje mayor de la órbita del planeta 0.03 AU
Relación masa estrella y masa solar 0.45

Se puede deducir que no se encuentra dentro de la zona de habitabilidad.

Ejercicio 11 - Solución

De qué planeta se trata? Busca en qué año fue detectado, por qué método, y por qué investigadores. Puedes buscar más información extra si lo deseas.

Tras una búsqueda rápida en el NASA Exoplanet Archive or the Extrasolar Planets Encyclopaedia, se ha podido indentificar al planeta como Planeta Gliese 436 b, el cual orbita la Estrella Gliese 436.

Gliese 436 b es un exoplaneta que orbita alrededor de la estrella enana roja Gliese 436, ubicada a aproximadamente 33 años luz de distancia de la Tierra, en la constelación de Leo. Fue detectado por primera vez en 2004.

El método utilizado para detectar Gliese 436 b fue el de tránsito. En este método, los investigadores observan el brillo de una estrella y buscan pequeñas disminuciones periódicas en su brillo causadas por el paso de un planeta frente a ella. Cuando un planeta transita por delante de su estrella, bloquea parcialmente la luz estelar y produce una disminución en el brillo que puede ser detectada y estudiada.

En el caso de Gliese 436 b, los investigadores utilizaron datos del Telescopio Espacial Hubble y del Observatorio Keck en Hawái para realizar observaciones y mediciones precisas. Estas mediciones revelaron que el planeta tiene aproximadamente 22 veces la masa de la Tierra y está ubicado a una distancia muy cercana a su estrella, lo que resulta en una órbita extremadamente corta de aproximadamente 2.6 días terrestres.

Además de su cercanía a su estrella, Gliese 436 b es notable por ser un “Neptuno caliente”. Esto significa que es un planeta gaseoso similar a Neptuno, pero se encuentra en una órbita tan cercana a su estrella que las temperaturas superficiales son extremadamente altas, alcanzando alrededor de 800 grados Celsius (1,472 grados Fahrenheit). Esta proximidad extrema también ha llevado a la evaporación y escape de parte de la atmósfera del planeta.

Gliese 436 b