{ "cells": [ { "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. Ulrich Husemann (ETP)
\n", "Dr. Thorsten Chwalek (ETP), Dr. Andreas Poenicke (TKM)
\n", "[ILIAS-Seite zum Kurs](https://ilias.studium.kit.edu/ilias.php?baseClass=ilrepositorygui&ref_id=2627198)
\n", "Sommersemester 2025 – Blatt 01
\n", "Abgabe: Montag, 5.05.2025 & Dienstag, 6.05.2025 \n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Auf dem ersten echten Übungsblatt setzen Sie sich mit den Bibliotheken *NumPy* und *Matplotlib* auseinander und werten ein Würfelspiel aus. \n", "Die [erste Aufgabe](#Aufgabe1) bietet die Möglichkeit, die sehr viel verwendete *Python*-Bibliothek *NumPy* kennenzulernen und den Einsatz von elementweisen Vektoren und die Erzeugung von Zufallszahlen zu üben.\n", "In der [zweiten Aufgabe](#Aufgabe2) beschäftigen Sie sich mit der Visualisierung von \"gemessenen\" Daten und der Vergleich zu der entsprechenden Erwartung.\n", "Die [letzte Aufgabe][#Aufgabe3) behandelt ein Zufallsexperimente mit Würfeln.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 1: Datenauswertung: *NumPy* \n", "---\n", "Vieles lässt sich bereits mit dem Standardbefehlssatz von *Python* erreichen.\n", "Im Bereich der Datenauswertung hat sich jedoch die Bibliothek [*NumPy*](https://numpy.org/devdocs/user/index.html) zu einem Standard entwickelt, da diese nicht nur zusätzliche Funktionen bietet, sondern auch gerade bei größeren Datenmengen deutlich schneller arbeitet.\n", "Funktionen - wie die Fakultät - müssen Sie in der Zukunft selten selbst implementieren, schauen Sie bei üblichen mathematischen Funktionen erst nach, ob diese nicht bereits in *NumPy* oder *SciPy* definiert wurden.\n", "\n", "Einen weitere wichtige Anwendung von *NumPy* haben Sie bereits in der Vorlesung kennengelernt: Die Erzeugung von (Pseudo-) Zufallszahlen. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Arbeitsanweisung:**
\n", "Ziel dieser Aufgabe ist es, Ihr eigenes kleines Zufallsexperiment zu schreiben.\n", "Simulieren Sie hierzu den Wurf eines Würfels mit den Augenzahlen $\\{1, \\dots,6\\}$ insgesamt 10 Mal.\n", "Übeberlegen Sie sich, wie wahrscheinlich jeder Wert auftreten kann und welche Verteilung von Zufallszahlen Sie hierfür benötigen. \n", "Speichern Sie die Häufigkeit jeder Augenzahl in einem `numpy.array` und lassen Sie sich die Werte ausgeben. \n", "Wiederholen Sie Ihre Simulation mit 100 bzw. 1000 Würfen. \n", "Erhalten Sie das erwartete Ergebnis?\n", "\n", "**Hinweise:**
\n", "1. Die *NumPy*-Bibliothek (und viele weitere Bibliotheken) ist bereits auf dem *Jupyter*-Server installiert. Die übliche Weise, *NumPy* in Ihren *Python*-Skripten (und *Jupyter*-Notebooks) aufzurufen, ist wie folgt:\n", " ```python\n", " import numpy as np\n", " ```\n", " Anschließend können Sie auf jede Funktionalität mit `np` zugreifen, bspw.:\n", " ```python\n", " a = np.array([1, 2, 3])\n", " ```\n", "2. Erzeugen Sie mit `numpy.random.default_rng()` einen Standard-Zufallszahlengenerator. Suchen Sie für die Erzeugung der Zufallszahlen eine passende Funktion in der Dokumentation von [`numpy.random.Generator`](https://numpy.org/doc/stable/reference/random/generator.html#simple-random-data) aus oder verwenden Sie die Ihnen aus der Vorlesung bekannten Beispielfunktionen." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Importieren von numpy\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Anzahl an Würfen\n", "n = 10 # oder 100 oder 1000\n", "\n", "# Implementation des Zufallsexperiments\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ausgabe der Würfe\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Aufzählen der Häufigkeit\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 2: Darstellungen von Daten: *Matplotlib* \n", "---\n", "Ein wichtiger Schritt bei der Datenauswertung ist die Visualisierung der Daten. \n", "Durch die Bibliothek [*Matplotlib*](https://matplotlib.org/stable/tutorials/index) steht Ihnen hierzu ein mächtiges Werkzeug zur Verfügung, welches auch oft in Kombination mit *NumPy* verwendet wird.\n", "\n", "**Arbeitsanweisung:**
\n", "Simulieren Sie in den **folgenden Zellen** gemäß der zugehörigen Anleitung eine Datennahme von \"Messwerten\", die einer Parabel $f(x)=x^2$ folgen. \n", "Stellen Sie anschließend das Ergebnis geeignet dar. \n", "Die Darstellung soll die \"Messwerte\" inklusive deren Unsicherheiten sowie das vorausgesagte Modell enthalten.\n", "\n", "**Anmerkung:**
\n", "Ähnliche Problemstellungen, also der Vergleich von Daten mit einer Modellfunktion, treten in der Datenauswertung sehr häufig auf. \n", "Es lohnt sich daher, an Ihrem Code sehr sorgfältig zu arbeiten, damit Sie ihn oder Teile davon später weiter verwenden können. \n", "Sie erhalten hier Ihr eigenes, flexibles Grafikwerkzeug für den Vergleich von Daten mit Modellen, auf das Sie immer wieder zurückgreifen können." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Importieren der benötigten Module\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Berechnen Sie zunächst die Parabel $f(x)=x^2$ im Wertebereich $x \\in [0, 5]$ für 1000 $x$-Werte. \n", "\n", "**Hinweise:**
\n", "1. Zur Erstellung der $x$-Werte können Sie die Funktion [`np.linspace`](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html) verwenden. \n", "2. Beachten Sie, dass Exponenten in *Python* mit `**` angegeben werden (z.B. `2**3=8`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Definition von y=x^2\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Erzeugen Sie \"Messwerte\" für $x \\in \\{1, 2 ,3 ,4\\}$, die jeweils dem Wert $f(x)$ mit einer normalverteilten (auch: gaußförmigen) Unsicherheit von $10 \\%$ des wahren Werts entsprechen. \n", "Erzeugen Sie hierfür ein *NumPy*-Array mit vier Zufallszahlen aus einer Standard-Normalverteilung. \n", "Wenn Sie diese Werte mit der gewünschten Unsicherheit (also $0.1\\cdot x^2$) multiplizieren, erhalten Sie die Zufallskomponente eines jeden Datenpunktes, die Sie zu den berechneten $y$-Werten addieren.\n", "\n", "**Hinweise:**
\n", "1. Suchen Sie erneut für die Erzeugung der Zufallszahlen eine passende Funktion in der Dokumentation von [`numpy.random.Generator`](https://numpy.org/doc/stable/reference/random/generator.html#distributions) aus.\n", "2. Anmerkung: Für besonders kurzen (und übersichtlichen) Code nutzen Sie die elementweise Vektorisierung von *NumPy* aus. Z.B.: \n", " ```python\n", " a = np.array([1, 2, 3])\n", " b = a + a # bzw. b = 2*a\n", " print(b) # Ausgabe: array([2, 4, 6])\n", " ```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Erstellen der Datenpunkte\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stellen Sie nun das Ergebnis in einem Plot dar. \n", "Zeigen Sie die erwartete Parabel als eine Linie und die erzeugten \"Messwerte\" als Kreise mit Fehlerbalken. \n", "Denken Sie ebenfalls an das Hinzufügen von Achsenbeschriftungen und einer Legende. \n", "\n", "**Hinweise:**
\n", "1. Im Allgemeinen werden Sie einen Großteil der einfachen Darstellungen mithilfe von [`plt.plot`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html) erledigen können.\n", "2. Fehlerbalken können am einfachsten mit [`plt.errorbar`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.errorbar.html) dargestellt werden.\n", "3. Geben Sie den Darstellungsfunktionen (`plt.plot`, `plt.errorbar`,...) jeweils ein `label`-Parameter mit, welcher in der Legende dargestellt wird.\n", "4. Machen Sie sich mit [`plt.xlabel`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xlabel.html), [`plt.ylabel`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.ylabel.html) und [`plt.legend`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html) vertraut." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Darstellung in einem Plot inkl. Achsenbeschriftung und Legende\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 3: Würfelspiel \n", "---\n", "In dieser Aufgabe führen Sie Zufallsexperimente mit Würfeln aus.\n", "Sie werfen jedes Mal $n$ Würfel gleichzeitig und betrachten die resultierende Augensumme.\n", "Ziel dieser Aufgabe ist es, das Durchführen und grafische Darstellen von Zufallsexperimenten zu vertiefen.\n", "\n", "Sie können folgende Funktion für die Simulation eines Würfelergebnisses mit drei Würfeln verwenden.\n", "Sie erhalten beim Ausführen der `dice()` Funktion die drei gewürfelten Augenzahlen." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "rng = np.random.default_rng(42)\n", "\n", "def dice():\n", " # Wurf von 3 Würfeln\n", " return rng.integers(low=1, high=7, size=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Arbeitsanweisung:**
\n", "Zunächst spielen Sie mit 3 Würfeln.\n", "Summieren Sie für jeden Wurf mit 3 Würfeln die Augensumme $S$ der Würfel.\n", "Führen Sie 1000 solcher Spiele durch und stellen Sie die Häufigkeitsverteilung der Augensumme $S$ grafisch dar.\n", "\n", "**Hinweis:**
\n", "Verwenden Sie gerne die Funktion [`matplotlib.pyplot.hist`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html) zur Darstellung der Häufigkeit der verschiedenen Augensummen.\n", "Eine sehr einfach Verwendung der Funktion ist, `plt.hist(a, b)` in der `a` das Array ist, welches all die Aufgensummen enthält, und `b` das Binning vorgibt. \n", "Geben Sie beispielsweise eine Integerzahl für `b` ein, so werden `b` Bins zur Darstellung verwendet.\n", "Überlegen Sie sich, wie viele Bins sie für alle möglichen Augensummen Ergebnisse mit 3 Würfeln benötigen würden.\n", "\n", "*Anmerkung*: Sie können auch eine Liste oder ein `numpy.array` mit $n_\\mathsf{bins}+1$ Einträgen als `b` übergeben. Diese werden als die Bingrenzen interpretiert." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Durchführen des Zufallsexperiments:\n", "# 3 Würfel, 1000 Mal geworfen\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Grafische Darstellung des Ergebnisses\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verallgemeinern Sie Ihren Code oder die oben angegebene Funktion so, dass Sie auch mit einer beliebigen Zahl von $n$ Würfeln gleichzeitig $N$ Spiele spielen können.\n", "Berechnen Sie nun anstelle der Augensumme die mittlere Augensumme $\\bar{s}=S/n$ und geben Sie für alle $N$ Spiele die mittlere Augensumme $\\bar{s}$ in der neuen Funktion aus.\n", "Stellen Sie anschließend die Häufigkeitsverteilung der mittleren Augenzahl für $n=10$, $n=50$ und $n=100$ für jeweils $N=1000$ Spiele dar." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ggfls. neue Funktion zum Wüfeln definieren\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Anzahl an Spielen\n", "N = 1000\n", "\n", "# Durchführung des Zufallexperiments und grafische Darstellung\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wiederholen Sie nun die Zufallsexperimente mit $n=5$ und $n=100$ Würfel für $N=10000$ Spiele. \n", "Bestimmen Sie für beide Durchläufe jeweils die Stichprobenstandardabweichung und das arithmetische Mittel und zeichnen Sie eine Normalverteilung mit den ausgerechneten Werten mit in das Histogramm.\n", "Was beobachten Sie für die jeweilige Würfelanzahl?\n", "\n", "**Hinweise:**
\n", "1. eine Funktion, die die Normalverteilung implementiert, ist in der folgenden Zelle gegeben. Wenn Sie die Verteilung mit dem Histogramm zusammen darstellen wollen, müssen Sie entweder das Histogramm normieren (fügen Sie folgende Option hinzu zur Darstellung vom Histogramm: `plt.hist(..., density=True)`) oder die Darstellung der Normalverteilung.\n", "2. Wiederholen Sie die Zufallsexperimente gerne einige Mal durch mehrfaches Ausführen der Zelle, um den Unterschied zu beobachten." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Funktion für die Normalverteilung\n", "def Gaussian(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": [ "# Anzahl an Spielen\n", "N = 10000\n", "\n", "# Durchführung des Zufallexperiments und grafische Darstellung\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.10" } }, "nbformat": 4, "nbformat_minor": 4 }