From f3eefef401f6f4a2564d59a3c1f86f50f6554b93 Mon Sep 17 00:00:00 2001 From: hanemile Date: Tue, 11 Dec 2018 15:11:44 +0100 Subject: split up the repo into lots of files, that one big file got a bit to big :D --- docs/generieren.tex | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 docs/generieren.tex (limited to 'docs/generieren.tex') diff --git a/docs/generieren.tex b/docs/generieren.tex new file mode 100644 index 0000000..5fa9294 --- /dev/null +++ b/docs/generieren.tex @@ -0,0 +1,179 @@ +\section{Generieren} + +Das Generieren der Statischen Punkt Wolke aus der die Galaxie abstrahiert wird +ist ein wichtiger Bestandteil des Gesamtprojektes, denn alles baut auf ihr auf. +Kurz: um Kräfte zwischen Sternen zu berechnen braucht man erstmal Sterne! + +\subsection{Das Navarro-Frenk-White Profil} +Das Navarro-Frenk-White Profil (NFW-Profil) ist ein Profil das genutzt wird, um +die Räumliche Massen Verteilung von dunkler Materie anhand von Halos die in +N-Körper Simulationen simuliert wurden, zu generieren. Das NFW-Profil kann +jedoch auch genutzt werden um die Massen Verteilung von Sternen darzustellen. +Das Profil generiert für einen gegebenen Abstand \( r \) zum Mittelpunkt der +Galaxie eine Wahrscheinlichkeit \( \rho \). Die Funktion sieht dabei wie folgt aus: +NFW + +\begin{equation} \label{eq:NFW_profile} + \rho_{NFW}(r) = \frac{ 1 }{ \sqrt{ 2 \pi } \cdot \sigma } \cdot + \exp \left( \frac{ -\phi(r) }{ \sigma^{ 2 } } \right) +\end{equation} + +\begin{equation*} + \phi(r) = \frac{ 4\pi \cdot G \cdot f_{0} \cdot R_{s}^3 }{ r } \cdot + ln{ \left( 1 + \frac{ r }{ R_{s} } \right) } +\end{equation*} + +Es kann nun mithilfe der Random-Sampling Methode (\ref{subsec:random_sampling}) +ermittelt werden, ob ein Stern beibehalten wird oder nicht. + +\par Möchte man nun herausfinden wie weit ein Punkt mit der Koordinate \( +(x_{1}, x_{2}, x_{3} \) vom Mittelpunkt des Raumes entfernt ist, kann der Satz +des Pythagoras (\ref{eq:pythagoras}) verwendet werden. + +\begin{equation} \label{eq:pythagoras} + r_{3} = \sqrt{x_{1}^{2} + x_{2}^{2} + x_{3}^{2} } +\end{equation} + +Der Abstand \( r_{3} \) zum Mittelpunkt des Raumes kann nun in das NFW-Profil +(\ref{eq:NFW_profile}) gegeben werden um einen Wert \( s \) zu ermitteln welcher +beim Random Sampling verwendet wird: + +\begin{equation} +\rho_{NFW}(r) = \dots = s +\end{equation} + +Dieser Wert \( s \) stellt die Wahrscheinlichkeit dar, das ein Stern der +eine Entfernung \( r \) vom Mittelpunkt der Galaxie besitzt existiert. + +Die Galaxie sieht aus der Ferne jetzt jedoch aus wie ein Würfel, da die aus \( +\rho_{NFW_{1}} \) resultierende Kurve abrupt endet. Dies kann gelöst werden, +indem statt \( \rho_{NFW_{1}}(r) \) folgendes gerechnet wird: \( +\rho_{NFW_{1}}(r) - \rho_{NFW_{1}}(r_{max}) = \rho_{NFW_{2}}(r)\) + +\paragraph{Veranschaulichung:}~\\ + +\begin{center} + \begin{tikzpicture} + \draw[very thin, color=lightgray, step=5mm] (-0.9, -0.9) grid (3.9, 2.4); + \draw[->] (-1,0) -- (4,0) node[right] {$x$}; + \draw[->] (0,-1) -- (0,2.5) node[above] {$y$}; + \draw[scale=0.5, domain=0.25:6.5, smooth, variable=\x, black] plot ({\x},{(1/\x) + 1}) node[above] {$\rho_{NFW_{1}}(x)$}; + \draw[scale=0.5, domain=0.25:6.5, smooth, variable=\x, black] plot ({\x},{1/\x}) node[below] {$\rho_{NFW_{2}}(x)$}; + \end{tikzpicture} +\end{center} + +Problematisch ist hierbei die Tatsache, dass aufgrund der Verschiebung die +Anzahl der Sterne die in Relation zu dem Bereich in dem sie generiert werden +sehr stark sinkt. + +\subsection{Random Sampling} \label{subsec:random_sampling} +\begin{equation}\label{range:psi} + \psi = [ \rho(r_{min}); \rho(r_{max}) ] +\end{equation} + +Sei \( s \) ein zufälliger Wert im Intervall \( \psi \). Generiert man nun +einen zufälligen Wert \( r \) im Intervall \( \psi \), kann man schauen ob \( s +> r \lor s < r \) gilt. Ist \( r +> s \), wird der Stern verworfen, ist \( r < s \) wird der Stern behalten. + +\paragraph{Veranschaulichung:}~\\ + +\begin{center} + \begin{tikzpicture} + % draw the background grid + \draw[very thin, color=lightgray, step=5mm] (-0.9, -0.9) grid (3.9, 2.4); + + % draw the x-ticks + \draw[xshift=0cm](0.5cm, 1pt) -- (0.5cm, -3pt) node[anchor=north] {$r_{1}$}; + \draw[xshift=0cm](1.5cm, 1pt) -- (1.5cm, -3pt) node[anchor=north] {$r_{2}$}; + + % draw the y-ticks + \draw[yshift=0cm](1pt, 0.5cm) -- (-3pt, 0.5cm) node[anchor=east] {$p(r_{1})$}; + \draw[yshift=0cm](1pt, 1.0cm) -- (-3pt, 1.0cm) node[anchor=east] {$p(r_{2})$}; + + % draw the dotted lines connecting the point s_1 + \draw[thick, dotted] (0.5, 0) -- (0.5, 0.5); + \draw[thick, dotted] (0, 0.5) -- (0.5, 0.5); + + % draw the dotted lines connecting the point s_2 + \draw[thick, dotted] (0, 1.0) -- (1.5, 1.0); + \draw[thick, dotted] (1.5, 0) -- (1.5, 1.0); + + % draw the axes + \draw[->] (-1,0) -- (4,0) node[right] {$r$}; + \draw[->] (0,-1) -- (0,2.5) node[above] {$\psi$}; + + % draw the plot + \draw[scale=0.5, domain=0.25:6.5, smooth, variable=\x, black] + plot ({\x},{(1/\x) + 1}) node[above] {$\rho_{NFW_{1}}(x)$}; + + % draw the points + \fill (0.5, 0.5) circle (0.05) node[above] {$s_1$}; + \fill (1.5, 1) circle (0.05) node[above] {$s_2$}; + \end{tikzpicture} +\end{center} + +In der obigen Abbildung ist zu sehen wir zwei zufällige Punkte \( s_1 \) und \( s_2 \) +generiert wurden. + +Angenommen es wurde ein Stern generiert für den nach Formel +(\ref{eq:pythagoras}) gilt: \( r = \sqrt{x_{1}^{2} + x_{2}^{2} + x_{3}^{2}} = +\dots = r_1 \). Es wird dann ein Zufälliger Wert \( p(r_2) \) im in +(\ref{range:psi}) definierten Intervall generiert. Die folgenden zwei Fälle +können dann eintreten und werden wie in (\ref{cases:random_sampling}) +abgehandelt. + +\kern-1em + +\begin{equation}\label{cases:random_sampling} +\begin{cases} +s_1 \leq NFW(r_1) & \rightarrow \text{Stern wird beibehalten}\\ +s_1 > NFW(r_1) & \rightarrow \text{Stern wird verworfen} +\end{cases} +\end{equation} + + +\subsection{Lookup Tabellen} +Statt nun für jeden Stern die Distanz des jeweiligen Sternes \( r \) in das +NFW-Profil (\ref{eq:NFW_profile}) einzusetzen, kann das NFW-Profil im vorhinein +berechnet werden. Es wird dabei eine Tabelle erstellt in der die Entfernung des +Sternes zum Mittelpunkt der Galaxie der jeweiligen Wahrscheinlichkeit +zugeordnet wird: + +\begin{center} +\begin{tabular} {l | l} + \( r_n \quad n \in \mathbb{N} \) & \( \rho_n \quad n \in \mathbb{N} \) \\ \hline\hline + \( r_1 \) & \( \rho_1 \) \\ \hline + \( r_2 \) & \( \rho_2 \) \\ \hline + \( r_3 \) & \( \rho_3 \) \\ \hline + \( \dots \) & \( \dots \) \\ \hline + \( r_n \) & \( \rho_n \) \\ +\end{tabular} +\end{center} + +Die Tabelle kann jedoch nicht so genaue Ergebnisse liefern wie das NFW-Profil, +sie kann jedoch so angepasst werden, dass sie in den Arbeitsspeicher passt und +somit das NFW-Profil so genau wie möglich widerspiegelt und das Generieren +stark verbessert. Mit genügend Arbeitsspeicher ist der Fehler dann auch +vernachlässigbar. Ein Kritischer Faktor, der beachtet werden muss wenn +Lookuptabellen genutzt werden, ist die Geschwindigkeit des jeweiligen +Speichermediums. Nutzt man z.B. Eine sehr langsame Festplatte kann es mehr +Sinne machen die jeweiligen Werte direkt zu berechnen. Dagegen ist eine +schnelle SSD (Solid-State-Drive) um einiges schneller. + +TODO: Versuchsreihe. + +\subsection{Beschleunigung der Generierung} +Es existieren mehrere Möglichkeiten die Generierung der Punkte zu verbessern. + +Eine gute Möglichkeit ist die Nutzung von mehr Rechenleistung. Bei der Nutzung +von \( n \) mal sovielen Rechen kernen ist das Generieren von Sternen \( n \) +mal schneller. Die Server des Server-Hosters Hetzner können dabei gut +verwendet werden: Es wird stündlich abgerechnet und 32 Kerne mit 128 GB RAM +kosten \( \approx \) 50ct/h was es ermöglicht für einen vergleichsweisen +Günstigen Preis, sehr viele Koordinaten zu generieren. + +Die Ausgabe von jeder Potentiellen Koordinate in die Kommandozeile verlangsamt +die Generierung unglaublich stark, da der Rechner darauf wartet das die Ausgabe +fertig ist bevor er mit der nächsten Rechnung beginnt was zu einer relativ +starken Verlangsamung der Generierung führt. -- cgit 1.4.1