{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Computergestützte Datenauswertung\n",
"**Institut für Experimentelle Teilchenphysik (ETP)**
\n",
"**Institut für Theorie der Kondensierten Materie (TKM)**
\n",
"Prof. Dr. Torben Ferber (ETP)
\n",
"Dr. Nils Faltermann (ETP), Dr. Andreas Poenicke (TKM), Alexander Heidelbach (ETP)
\n",
"[Ilias Seite zum Kurs](https://ilias.studium.kit.edu/ilias.php?ref_id=2067677&cmd=frameset&cmdClass=ilrepositorygui&cmdNode=x0&baseClass=ilrepositorygui)
\n",
"Sommersemester 2023 – Blatt 04
\n",
"Abgabe: Montag, 26.06.2023 ($A$) & Montag, 03.07.2023 ($B$)\n",
"\n",
"---"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Auf dem vierten Übungsblatt wenden Sie sich teilweise praktischen Anwendungen zu und betrachten die Fehlerfortpflanzung am Beispiel der Vorlesung.\n",
"Die [erste Aufgabe](#Aufgabe1) bietet Ihnen die Gelegenheit, sich mit der Fehlerfortpflanzung für simple Kombinationen von Zufallszahlen auseinanderzusetzen.\n",
"Die Aufgabe bietet Ihnen auch in Form einer freiwilligen Zusatzaufgabe die Bedeutung von Korrelation und Kovarianzmatrix visuell zu verdeutlichen.\n",
"In der [zweiten](#Aufgabe2) und [dritten](#Aufgabe3) Aufgaben beschäftigen Sie sich mit der Verarbeitung eines Signals. \n",
"Sie werden zunächst das Signal mithilfe eines Filters glätten und anschließen beinahe unbeeinflusst von Rauchen die Periode des Signals zu bestimmen.\n",
"Einen sehr ähnlichen Fall wird Ihnen möglicherweise im nächsten Semester schon begegnen im Praktikumsversuch \"Elastizität\".\n",
"Dort können Sie Auswertung einer Aufgabe beinahe vollständig mit den hier gezeigten Methoden durchführen."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 1: Fehlerfortpflanzung \n",
"---\n",
"In dieser Aufgabe folgen Sie dem Beispiel der Vorlesung, indem Sie die Fehlerfortpflanzung für einen einfachen Fall selbst berechnen und testen können.\n",
"Im späteren Verlauf dieser Aufgabe werden Sie auch die Grenzen der Fehlerfortpflanzung kennenlernen.\n",
"Zum Schluss der Aufgabe bekommen Sie die Möglichkeit, in Form einer **freiwilligen Zusatzaufgabe** den Einfluss von Korrelationen zwischen Zufallszahlen ebenfalls zu erfahren.\n",
"Betrachten Sie im Folgenden die Summe und den Quotienten von normalverteilten Zufallszahlen."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Erzeugen Sie zwei Datensätze von je 5000 normalverteilten Zufallszahlen $x_i$ mit $(\\mu_x,\\,\\sigma_x)=(1.5,\\,0.5)$ und $y_i$ mit $(\\mu_y,\\,\\sigma_y)=(0.6,\\,0.15)$.\n",
"Bilden Sie die Summe von Paaren von Zufallszahlen, $v_i=x_i + y_i$, und stellen Sie die Summen $v_i$ als Histogramm grafisch dar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Initialisierung des Zufallsgenerators\n",
"rng = np.random.default_rng(42)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Funktion für die Normalverteilung\n",
"def Gauss(x, mu=0., sigma=1.):\n",
" return np.exp(-(x - mu)**2 / 2 / sigma**2) / np.sqrt(2*np.pi) / sigma"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition der Inputvariablen\n",
"\n",
"\n",
"# Berechnung der Verteilungen von x und y\n",
"\n",
"\n",
"# Berechnung der Summe der Zufallszahlen\n",
"\n",
"\n",
"# Darstellung der Summe als Histogramm\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Berechnen Sie mithilfe des Fehlerfortpflanzungsgesetzes die Standardabweichung $\\sigma_v$ der $v_i$ und zeichnen Sie zum Vergleich eine Normalverteilung mit $(\\mu_v=\\mu_x + \\mu_y, \\sigma_v)$ in das Histogramm ein.\n",
"\n",
"**Hinweis:**
\n",
"Vergessen Sie nicht für eine geeignete Darstellung, entweder das Histogramm zu Normieren oder die Verteilungsfunktion richtig zu skalieren."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Berechnung der statistischen Größen aus der Fehlerfortpflanzung\n",
"\n",
"\n",
"# Darstellung des Histogramms und der Normalverteilung\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Bilden Sie nun das Verhältnis von je zwei der beiden Zahlen, $w_i=x_i/y_i$, und stellen Sie das Histogramm der Quotienten $w_i$ grafisch dar.\n",
"Berechnen Sie wieder mithilfe des Fehlerfortpflanzungsgesetzes die Standardabweichung $\\sigma_w$ der $w_i$ und zeichnen Sie zum Vergleich eine Normalverteilung mit $(\\mu_w=\\mu_x / \\mu_y, \\sigma_w)$ ein.\n",
"Vergleichen Sie den Mittelwert und die Standardabweichung dieser Normalverteilung mit dem Wert der Stichprobenvarianz, die Sie direkt aus dem Histogramm erhalten.\n",
"Ist die aus der Fehlerfortpflanzung resultierende Normalverteilung eine gute Abschätzung der Datenverteilung?\n",
"\n",
"**Hinweis:**
\n",
"Für eine bessere visuelle Darstellung der Verteilung und der Normalverteilung stellen Sie nur Werte für $w\\in[-1, 10]$ dar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Berechnung des Quotienten der Zufallszahlen\n",
"\n",
"\n",
"# Berechnung der statistischen Größen aus der Fehlerfortpflanzung\n",
"\n",
"\n",
"# Vergleich der statistischen Größen\n",
"\n",
"\n",
"# Darstellung des Histogramms und der Normalverteilung\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Freiwillige Zusatzaufgabe\n",
"\n",
"In dieser Zusatzaufgabe sollen Sie sich mit korrelierten Zufallszahlen und der Bedeutung der vollständigeren Fehlerfortpflanzung beschäftigen.\n",
"Dazu gehen Sie zurück zu dem Beispiel der Summe zweier Zufallszahlen.\n",
"Für die Bearbeitung dieser Aufgabe müssen Sie allerdings einen Satz an Zufallszahlen $x$ und $y$ erzeugen."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Erzeugen Sie zwei Datensätze von je 5000 normalverteilten Zufallszahlen $x^\\prime_i$ mit $(\\mu_{x^\\prime},\\,\\sigma_{x^\\prime})=(1.5,\\,0.5)$ und $y^\\prime_i$ mit $(\\mu_{y^\\prime},\\,\\sigma_{y^\\prime})=(0.6,\\,0.15)$ mit einem Korrelationsfaktor von $\\rho=0.9$.\n",
"Hierzu können Sie die [`numpy.random.Generator.multivariate_normal(mean, cov)`](https://numpy.org/doc/stable/reference/random/generated/numpy.random.Generator.multivariate_normal.html) Methode verwenden.\n",
"übergeben Sie als `mean` ein Array aus den beiden Mittelwerten und als `cov` ein Array der Kovarianzmatrix.\n",
"\n",
"**Hinweis:**
\n",
"Berechnen Sie die Kovarianzmatrix aus den Unsicherheiten $\\sigma_{x^\\prime}$ und $\\sigma_{y^\\prime}$ der einzelnen Sätzen an Zufallszahlen und $\\sigma_{x^\\prime y^\\prime}=\\rho\\sigma_{x^\\prime}\\sigma_{y^\\prime}$.\n",
"\n",
"\\begin{equation}\n",
"\\text{Cov}(x^\\prime,y^\\prime) = \n",
"\\begin{bmatrix}\n",
"\\sigma_x^{^\\prime 2} & \\rho\\sigma_{x^\\prime}\\sigma_{y^\\prime} \\\\\n",
"\\rho\\sigma_{x^\\prime}\\sigma_{y^\\prime} & \\sigma_y^{^\\prime 2} \\\\\n",
"\\end{bmatrix}\n",
"\\end{equation}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Korrelationsfaktor\n",
"\n",
"\n",
"# Erstellung des Erwartungswertvektors und der Kovarianzmatrix\n",
"\n",
"\n",
"# Erzeugung der Verteilung der Zufallszahlen\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Bilden Sie die Summe von Paaren von Zufallszahlen, $u_i=x^\\prime_i + y^\\prime_i$, und stellen Sie die Summen $u_i$ als Histogramm grafisch dar.\n",
"Zeichnen Sie zum Vergleich zwei Normalverteilung mit $(\\mu_v=\\mu_{x^\\prime} + \\mu_{y^\\prime}, \\sigma_u)$ in das Histogramm ein.\n",
"Berechnen Sie einmal $\\sigma_u$ mithilfe der Fehlerfortpflanzung ohne Berücksichtigung der Korrelation und einmal mit."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Berechnung der Summe der Zufallszahlen\n",
"\n",
"\n",
"# Berechnung der statistischen Größen aus der Fehlerfortpflanzung\n",
"\n",
"\n",
"# Darstellung der Ergebnisse\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 2: Signaldarstellung und -verarbeitung \n",
"---\n",
"Im Folgenden betrachten Sie auf diesem Übungsblatt ein Signal, wie Sie es z.B. im Praktikum zur Auswertung direkt von einem Messgerät erhalten. \n",
"Das Signal liegt als Datei im CSV-Format vor (`signal_raw.csv`).\n",
"Sie werden feststellen, dass das Signal durch zufällige Beiträge zur Amplitude an jedem Messpunkt sehr verrauscht ist. \n",
"Solch eine Situation werden Sie ebenfalls im Praktikum vorfinden. \n",
"Sie werden in dieser Aufgabe das Signal mit einem einfachen Mittelwertfilter glätten.\n",
"\n",
"\n",
"**Arbeitsanweisung:**
\n",
"Lesen Sie die Datei mit einer geeigneten Methode aus *NumPy* oder *PhyPraKit* ein.\n",
"Stellen Sie außerdem das Signal grafisch dar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Einlesen der Daten aus der Datei\n",
"\n",
"\n",
"# Darstellung des Messsignals\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Glätten das Signal mit einem einfachen Mittelwertfilter (siehe Hinweis).\n",
"Wählen Sie einen passenden Glättungsparameter und stellen Sie den geglätteten Signalverlauf dar. \n",
"Bilden Sie die Differenz des geglätteten Signals und des Originals und stellen Sie diese ebenfalls grafisch dar. \n",
"Was passiert, wenn Sie den Glättungsparameter zu klein oder zu groß wählen?\n",
"\n",
"**Hinweis:** \n",
"1. Das installierte Paket *PhyPraKit* enthält bereits die Implementierung eines Mittelwertfilters: `PhyPraKit.meanFilter(a, width)`. \n",
"Hier ist `a` das Array des jeweiligen Signals und `width` bestimmt den Glättungsparameter. \n",
"Schauen Sie gerne in den [Code](https://github.com/GuenterQuast/PhyPraKit/blob/master/PhyPraKit/PhyPraKit.py#L804), um die Implementierung selbst nachvollziehen zu können oder als Inspiration für eine eigene Version zu nutzen.\n",
"2. Zum einfachen visuellen Vergleich verschiedener Glättungsparameter bietet es sich an, das Glätten und Darstellen des Ergebnisses und der Differenz in einer Funktion zu definieren."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import PhyPraKit as ppk"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Implementtion des Mittelwertfilters\n",
"\n",
"# Aus Hinweis: Funktion zur Berechnung und Darstellung\n",
"#def plot_filter(width=4.0):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Auswertung der Glättung\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 3: Autokorrelation \n",
"---\n",
"\n",
"Bei periodischen Signalen ist häufig die Frequenz bzw. Periodendauer von Interesse. \n",
"Die genaueste Methode zur Frequenzbestimmung eines Signals mit fester Grundfrequenz ist die Autokorrelationsanalyse, die Sie bereits in der Vorlesung kennengelernt haben.\n",
"In dieser Aufgabe werden Sie die Autokorrelation nutzen, um die Frequenz der bisherigen Schwingung zu bestimmen.\n",
"Verwenden Sie entweder das geglättete Signal aus der vorherigen Aufgabe oder eine bereits gelättete Version der Daten (`signal_smooth.csv`)."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Berechnen Sie die Autokorrelation des bereits geglätteten Signals.\n",
"Verwenden Sie für die Berechnung können Sie entweder geeignete *NumPy* Funktionen oder die Funktion [`autocorrelate(a)`](https://github.com/GuenterQuast/PhyPraKit/blob/master/PhyPraKit/PhyPraKit.py#L1070) aus dem *PhyPraKit* Paket.\n",
"Hier ist `a` das Array, welches Sie untersuchen.\n",
"Stellen Sie das Ergebnis grafisch dar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Einlesen der Daten aus der Datei\n",
"\n",
"\n",
"# Berechnung der Autokorrelation\n",
"\n",
"\n",
"# Darstellung der Autokorrelation\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Bestimmen Sie die Periodendauer des Signals anhand der lokalen Minima und Maxima der Autokorrelation. \n",
"Finden Sie zunächst die entsprechenden Zeiten der Minima und Maxima über geeignete Funktionen. \n",
"Die Periodendauer ergibt sich dann aus dem zeitlichen Abstand zweier benachbarter Minima oder Maxima. \n",
"Geben Sie den Mittelwert und die entsprechende Stichprobenstandardabweichung aller Paare an.\n",
"\n",
"**Hinweis:**
\n",
"Geeignete Funktionen wären beispielsweise:\n",
"- [`scipy.signal.find_peaks()`](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html) oder \n",
"- [`PhyPraKit.convolutionPeakfinder()`](https://github.com/GuenterQuast/PhyPraKit/blob/master/PhyPraKit/PhyPraKit.py#L1015)\n",
"\n",
"Lesen Sie sich zur korrekten Verwendung die jeweiligen Beschreibungen (Dokumentationen) der jeweiligen Methoden durch.\n",
"Für ein sinnvolles Ergebnis werden Sie einige Parameter durchprobieren müssen.\n",
"Es bietet sich auch an, zur Überwachung der Bestimmung der Minima und Maxima diese jeweils in einen Plot zusammen mit der vorherigen Autokorrelation darzustellen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Bestimmung der Minima und Maxima\n",
"\n",
"\n",
"# Statistische Analyse der Autokorrelation\n",
"\n",
"\n",
"# Optional: Darstellung der gefundenen Minima und Maxmia (nicht gefordert)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}