# Die Basics
import numpy as np
import pandas as pd
# Astronomische Einheiten
import astropy.units as u
# Slider und sowas
from ipywidgets import interact, FloatSlider
from IPython.display import Markdown as md
# Definiere eine Konstante, die Astropy nicht hat (?)
vsun = 220. # km/s - Sun's velocity around the Galactic center
1. Eigenschaften der interstellaren Materie (ISM)¶
Nenne sechs physikalische Größen, die die Eigenschaften und die Verteilung der interstellaren Materie in Galaxien bestimmen.¶
- Teilchendichte $n$: Anzahl der Teilchen pro Volumen.
- Temperatur $T$: ist im astrophysikalischen Kontext über die Boltzmann-Statistik definiert, benötigt also ein thermisches Gleichgewicht.
- Ionisationszustand: Relativer Anteil der Teilchen, die sich in unterschiedlichen Anregungszuständen befinden.
- Molekularer Anteil: Relativer Anteil der Moleküle an der Gesamtheit der Teilchen
- Metallizität: Anteil von Elementen schwerer als Helium. Wichtige Größe:
$[\mathrm{Fe}/\mathrm{H}] = \log_{10}{\left(\frac{N_{\mathrm{Fe}}}{N_{\mathrm{H}}}\right)}- \log_{10}{\left(\frac{N_\mathrm{Fe}}{N_\mathrm{H}}\right)}_{\odot}$
- Staubgehalt: Relativer Anteil von Staubteilchen an allen Teilchen.
Bei relativen Anteilen arbeitet man häufig mit $n$ und weniger mit dem Massenanteil.
Was sind zwei wichtige Unterschiede zwischen HI- und HII-Gebieten?¶
In einem HI-Gebiet ist der Wasserstoff neutral (andere Elemente können angeregt sein) oder liegt als Molekül vor. In HII-Gebieten liegt Wasserstoff ionisiert vor. HII-Gebiete haben also eine deutlich höhere Temperatur als HI-Gebiete. HI-Gebiete lassen sich gut über die 21cm-Strahlung erforschen, HII-Gebiete emittieren Linien der Balmerserie und haben ihr Strahlungsmaximum im Blauen.
Wie entsteht die 21cm-Strahlung des neutralen Wasserstoffs?¶
Die Strahlung, die bei einer Wellenlänge von 21cm emittiert wird, entsteht beim Hyperfeinstrukturübergang des neutralen Wasserstoffs. Er wird auch als Spin-Flip Übergang bezeichnet. Dabei handelt es sich um die Energie, die bei der Änderungs des Elektron-Spins $F=1\to F=0$ im Wasserstoff im $1s$-Zustand emittiert wird (siehe Strukturdiagramm auf Wikipedia).
Findest du schematische Darstellung der 21cm-Linie auf der Plakette, die gerade auf den beiden Pioneer-Sonden das Weltall durchprflügt?
import matplotlib.image as mpimg
# Used to display the sketch in 1.
import matplotlib.pyplot as plt
img = mpimg.imread('Pioneer_plaque.png')
plt.figure(figsize=(10,10))
plt.axis("off")
plt.title("Von Vectors by Oona Räisänen (Mysid); \n designed by Carl Sagan & Frank Drake;\n artwork by Linda Salzman Sagan - Vectorized in CorelDRAW from NASA image GPN-2000-001623,\n Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=1433765", fontsize=8)
plt.imshow(img);
Begründe, warum diese Emissionslinie als wichtigstes Werkzeug zur Erforschung der neutralen ISM gilt.¶
Siehe Lehrbuch:
Das ISM ist für 21cm-Strahlung optisch dünn, dadurch können wir die 21cm-Emission von Regionen neutralen Wasserstoffs (HI-Gebieten) aus der gesamten Galaxis empfangen.
Optisch dünn bedeutet, dass die Photonen dieser Strahlung nicht mit dem ISM wechselwirken, nicht mal Gebiete neutralen Wasserstoffs untereinander, weil die 21cm-Linie quantenmechanisch ein verbotener Übergang ist. Heißt: Wenn ein Wasserstoffatom in den $F=1$-Zustand angeregt wird, bleibt er doch erstmal für einige Millionen Jahre stecken, bevor er das Licht wieder emittiert.
2. Interstellare Wolke¶
Wenn wir die Ebene der Milchstraße in der 21cm-Linie beobachten, finden sich bei $l = 45°$ sehr viele Interstellare HI Gebiete. Das Gebiet mit der höchsten Radialgeschwindigkeit in dieser Richtung bewegt sich mit $v_r = 73$ km/s (schnellste HI-Wolke).
Wieso können wir die Wolken zählen, wenn sie sich doch auf der Sichtachse hintereinander verstecken?¶
Siehe Lehrbuch:
Durch die Bewegung einer H I -Wolke relativ zu uns wird die Wellenlänge verschoben, wodurch man die Radialgeschwindigkeit einer Wolke durch die Linienverschiebung bestimmen kann.
Je stärker die Linienverschiebungs ins Blaue, desto höher die Radialgeschwindigkeit. Jede Wolke produziert so ihre eigene (wenn auch verbreiterte) 21cm-Linie.
import matplotlib.pyplot as plt
%matplotlib inline
def gaussian(x, mu, sig):
return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))
x = np.linspace(-1,6,200 )
y = np.full_like(x,0)
plt.figure(figsize=(9,5))
for a,mu,sig in [(.5,21,.2),(.23,23,.25),
(.17,22,.15),(.4,21.5,.15),
(.44,24,.3),(.2,22.3,.19),]:
mu = mu-21
g = a*gaussian(x, mu, sig)
plt.plot(x, g)
y = y + g
plt.plot(x, y, c="k",label="Gemessene 21cm-Strahlung")
plt.xlabel(r"Blauverschiebung $\lambda-21$ cm",fontsize=14)
plt.ylabel(r"Intensität (bel. Einheiten)",fontsize=14)
plt.xticks([0])
plt.xlim(-1,5)
plt.legend(fontsize=14);
Jede der farbigen Kurven in der Skizze stellt eine Wolke dar. Es wird sichtbar, dass der Trick auch seine Schwächen hat!
Wie weit ist die schnellste Wolke von uns entfernt? Wie weit ist sie vom Zentrum der Milchstraße entfernt?¶
Wir nehmen an, dass sich alle Wolken auf Kreisbahnen um das Zentrum der Milchstraße bewegen.
img = mpimg.imread('sketch.png')
plt.figure(figsize=(10,10))
plt.axis("off")
plt.imshow(img);
Skizze mit Sonne, Galaktischem Zentrum und Wolke bei $l=-45^o$.
$R_0$ ist der Abstand der Sonne vom Galaktischen Zentrum. Der Wert kann je nach Messmethode unterschiedlich sein (Wikipedia: Galactic Center). Wir benutzen $8.2\,$kpc.
$l=45^o$ ist ein dankbarer Winkel, denn dann gilt ein einfaches geometrisches Argument (wir benutzen im Folgenden den Betrag von $l$):
$D = R = R_0 \cdot \sin l$
def distance(R_0, l=45.):
"""Calculate the distance of a cloud
to the Sun and the Galactic center if
the cloud is tangetially moving right
towards us.
Parameters:
-----------
R_0 : float
distance from the Sun to the
Galactic center
l : float
angle between the cloud and the
Galactic center as seen from the
Sun
Return:
-------
string with the distances of the cloud
relative to the Sun and the Galactic center
"""
from_us = R_0 * np.sin((l*u.deg).to(u.rad).value)
from_center = R_0 * np.cos((l*u.deg).to(u.rad).value)
return print(f"The cloud is {from_us:.2f} kpc away from the Sun, " \
f"and {from_center:.2f} kpc away from the Galactic center.")
x_widget = FloatSlider(min=7.4, max=8.7, step=0.05, description=r"$R_0 [kpc]$")
y_widget = FloatSlider(min=0., max=90., step=1, value=45., description=r"$l$ [deg]")
interact(distance, R_0=x_widget, l=y_widget);
Berechne die Geschwindigkeit, mit der die schnellste Wolke um das Zentrum der Milchstraße kreist.¶
Die Sonne bewegt sich mit $v_\odot=220$ km/s um das Zentrum. Die gemessene Radialgeschwindigkeit der Wolke wird im Ruhesystem der Sonne, also relativ zu dieser Geschwindigkeit gemessen. Um in das Ruhesystem des Zentrums der Galaxie zu kommen, müssen wir also die Radialkomponente (in Richtung der Wolke)
$v_{r,\odot} = v_\odot \sin l$
von der gesuchten Geschwindigkeit der Wolke $v_{r,*}$ abziehen, um $v_r$ in das gefragte System zu überführen:
$v_r = v_{r,*} - v_{r,\odot} = v_{r,*} - v_\odot \sin l$
Da wir hier von der schnellsten Wolke reden ist $v_{r,*}$ zugleich die Bahngeschwindigkeit der Wolke um das Zentrum:
$v_{r,*} = v_* = v_r + v_\odot \sin l$
Als Funktion definiert:
def velocity(l, vr):
"""Calculate the velocity with
which the cloud is rotating around
the Galactic center.
Parameters:
-----------
l : float
angle between the cloud and the
Galactic center as seen from the
Sun in degrees
vr : float
radial velocity of the cloud in km/s
Return:
-------
string with the value for the cloud's
rotation velocity
"""
vc = vr + vsun * np.sin((l*u.deg).to(u.rad).value)
return print(f"The cloud is rotating at {vc:.2f} km/s.")
#x_widget = FloatSlider(min=7.4, max=8.7, step=0.05, description=r"$R_0$ [kpc]")
y_widget = FloatSlider(min=0., max=90., step=1, value=45., description=r"$l$ [deg]")
z_widget = FloatSlider(min=0., max=200., step=1, value=73., description=r"$v$ [km/s]")
interact(velocity, l=y_widget, vr=z_widget);
Die Rotationsgeschwindigkeit der Wolke ist nur wenig höher als die der Sonne - ein auffälliger Hinweis auf eine flache Rotationskurve!
Die eben durchgeführte Rechnung ist als Tangentialpunktmethode zur Bestimmung der Galaktischen Rotationskurve bekannt.
Warum kann man die Tangentialpunktmethode nur für die Vermessung der Rotationskurve innerhalb der Entfernung der Sonne $R_0$ vom Zentrum der Milchstaße verwenden?¶
Für $R > R_0$ wählen wir $90^\circ<l<270^\circ$. Für diese Winkel gibt es einfach keine Tangente, wo die Radialgeschwindigkeit ein Maximum annehmen könnte. Die höchste Geschwindigkeit wird entweder für die nächstgelegene Wolke angenommen (z.B. bei Winkeln nahe $90^\circ$ und $270^\circ$), oder die Wolken besitzen gar keine nennenswerte Radialkomponente der Geschwindigkeit (bei Winkeln nahe $180^\circ$).
Bonusaufgabe (2 Punkte): Wie oft umrundet die schnellste Wolke das Zentrum der Milchstra\ss e innerhalb eines Galaktischen Jahres?¶
Galaktisches Jahr $=$ die Zeit, die die Sonne für einen Umlauf um das Zentrum der Milchstaße benötigt.
Die Sonne benötigt die Zeit $T_{\odot}$ für einen Umlauf:
$T_{\odot} = \dfrac{2 \pi R_0}{v_{\odot}}$
In dieser Zeit kann die Wolke mit $v_{cloud}$ eine Distanz $\Delta d_{cloud}$ (in Einheiten von Sonnenumrundungen) überwinden:
$\Delta d_{cloud} = \dfrac{v_{cloud} T_{\odot}}{2 \pi R} = \dfrac{v_{cloud} R_0 }{v_0 R}$
def rotations_around_galactic_center(R_0, v_cloud, R):
""" Formula for d_cloud.
Parameters:
-----------
R_0 : float
distance from the Sun to the
Galactic center in kpc
v_cloud : float
the clouds velocity on the
orbit around the Galactic center
R : float
distance from the cloud to the
Galactic center
Return:
-------
string with the number of rotations
"""
dcloud = v_cloud * (R_0 * u.kpc).to(u.km) / vsun / (R * u.kpc).to(u.km)
return md(f"$\Delta ={dcloud:.2f}$ rotations around the Galactic center.")
ws_widget = FloatSlider(min=0., max=400., step=5, value=228., description=r"$v_{cloud}$ [km/s]")
r_widget = FloatSlider(min=0, max=15, step=.1, value=5.8, description=r"$R [kpc]$")
interact(rotations_around_galactic_center, R_0=x_widget, v_cloud=ws_widget, R=r_widget);
3. Entfernungsbestimmung mit der Cepheidenmethode¶
In dieser Aufgabe bauen wir eine Entfernungsleiter und benutzen sie auch!
Für drei Cepheidensterne in der Milchstraße wurden sowohl die Pulsationsperiode $P$ in Tagen, die Parallaxe $\pi$ in Millibogensekunden, die scheinbare Magnitude $m_V$ im $V$ Band, und die entsprechende interstellare Extinktion $A_V$ gemessen:
ext = pd.DataFrame({"star":["RT Aur","X Sgr", "l Car"],
"pi_mas":[2.4,3.,2.01],
"P_d":[3.728190, 7.012877, 35.551341],
"m_V":[5.464, 4.556, 3.732],
"A_V":[.2,.58,.52]})
ext = ext.set_index("star")
ext.rename(index=str, columns={"pi_mas":r"$\pi$ [mas]",
"P_d":r"$P$ [d]",
"m_V":r"$m_V$",
"A_V":r"$A_V$",})
Bestimme aus diesen drei Messungen eine Perioden-Luminositäten-Relation.¶
Die allgemeine Form diese Relation hat die Form:
$M_V = a + b \cdot \log_{10} P$
$M_V$ ist die absolute Magnitude im $V$ Band, $a$ und $b$ sind die zu bestimmenden Parameter.
Aus der Parallaxe erhalten wir die Entfernungen für die Kalibrierung:
$D = \left(\frac{p}{1^{\prime\prime}}\right)^{-1}\,\text{pc}$
Aus dem Entfernungsmodul erhalten wir über $m_V$ die absolute Magnitude $M_V$:
$ M_V = m_v - 5\log(D/1\,\text{pc}) + 5 - A_V$
Daraus erhalten wir folgende Zahlen:
Table 1.
ext["D_pc"] = ext.pi_mas.apply(lambda x: 1.*u.arcsec / (x*u.mas).to(u.arcsec))
ext["M_V"] = ext.apply(lambda x: x.m_V - 5. * np.log10(x.D_pc) + 5. - x.A_V, axis=1).apply(lambda x: f"{x:.2f}")
ext["D_pc"] = ext["D_pc"].apply(lambda x: f"{x:.2f}")
ext
Es gibt mehrere Methoden, um $a$ and $b$ zu bestimmen. Neben der graphischen Methode, gibt es auch die lineare Regression, die wir hier verwenden:
Die Formeln dazu lauten:
$b = \frac{\sum_i\left(x_i -\overline{x}\right)\left(y_i -\overline{y}\right)}{\sum_i\left(x_i -\overline{x}\right)^2} \qquad\text{and}\quad a = \overline{y} - b\,\overline{x}$
Hier ist $y = M_V$ und $x = \log P$. $\overline{y}$ und $\overline{x}$ sind die entspr. Mittelwerte.
def linreg_b(x,y):
"""Linear regression formula for b."""
xmean, ymean = np.mean(x), np.mean(y)
return (np.sum((x - xmean) * (y - ymean)) /
np.sum((x - xmean)**2))
def linreg_a(x, y, b):
"""Linear regression formula for a."""
return np.mean(y) - b * np.mean(x)
# x is log10 P and y is M_V:
x, y = np.log10(ext.P_d.astype(float)), ext.M_V.astype(float)
# Apply the linear regression functions defined above:
b = linreg_b(x, y)
a = linreg_a(x, y, b)
# Print the solution:
md(f"The period-luminosity relation reads $M_V = {a:.3f} {b:.3f} \cdot \log P$.")
Bei einem Cepheidenstern in der Galaxie NGC 4321 messen wir eine Pulsationsperiode $P$ von $32\,$d. Seine scheinbare Helligkeit beträgt $m_V = 25.511$.
Wie weit ist NGC 4321 von uns entfernt?¶
Benutze dein Resultat aus (a).
Jetzt brauchst du wieder das Entfernungsmodul.
$D = 10^{0.2\,(m_V - M_V +5)}$
Mit Python setzen wir das Ergebnis für die PL-Relation automatisch ein:
# Calculate M_V using a and b as derived above:
M_V = a + b * np.log10(32.)
# Apply the distance modulus:
D = np.power(10, 0.2 * (25.511 - M_V + 5))
print(f"{(D * u.pc).to(u.kpc):.0f}")
Vergleiche dein Ergebnis mit anderen Entfernungsangaben in der Literatur.¶
Im NASA/IPAC Extragalactic Database findest du einige Dutzend Einträge zu NGC 4321.
In der Literatur finden sich sehr unterschiedliche Entfernungen: $14 200 - 21 400\,$kpc. Mit nur drei Datenpunkten haben wir also schon ein recht gutes Ergebnis erzielt. Eine genauere Aussage über die Güte unseres Resultats können wir aber nur dann treffen, wenn wie die Unsicherheiten auf $a$ und $b$ diskutieren.