{ "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. 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 02
\n", "Abgabe: Montag, 08.05.2023 ($A$) & Montag, 15.05.2023 ($B$)\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Auf dem zweiten Blatt setzen Sie sich mit der Definition und Nutzung von *Python* Funktionen sowie den Bibliotheken *NumPy* und *Matplotlib* auseinander. \n", "In der [ersten Aufgabe](#Aufgabe1) definieren Sie selbstständig *Python* Funktionen und lernen, wie diese das mehrfache Ausführen von Code erleichtern können.\n", "Die [zweite Aufgabe](#Aufgabe2) 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 [letzten Aufgabe](#Aufgabe3) beschäftigen Sie sich mit der Visualisierung von \"gemessenen\" Daten und der Vergleich zu der entsprechenden Erwartung." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 1: Erste Schritte in *Python* \n", "---\n", "\n", "In der Vorlesung haben Sie die weitverbreitete Programmiersprache *Python* kennengelernt.\n", "Mit der ersten Aufgabe auf diesem Blatt sollen Sie sich mit dem Schreiben von Funktionen in *Python* vertraut machen.\n", "Funktionen sind ein wesentlicher Bestandteil jeder modernen Programmiersprache und kommen immer üblicherweise dann zum Einsatz, wenn Sie eine Anweisung mehrfach ausführen möchten.\n", "Die Syntax für Funktionsdefinitionen in *Python* sieht aus wie folgt:\n", "\n", "```python\n", "def funktion_name():\n", " \n", " return \n", "```\n", "\n", "Den `` können Sie komplett selbstständig wählen. \n", "Bis auf einige wenige *Python*-interne Funktionennamen hat die Auswahl des Namens keinerlei Auswirken.\n", "Für sich selbst oder weitere Personen, die Ihren Code irgendwann lesen, sollten Sie jedoch immer einen möglichst aussagekräftigen Namen wählen. \n", "\n", "\n", "Die `` legt alle Funktion internen Variablen fest.\n", "Sie können den Parametern bereits an dieser Stelle Standardwerte geben. \n", "Diese Parameter müssen dann nicht zwingend beim Funktionsaufruf mit angegeben werden.\n", "Definieren Sie beispielsweise `def funktion(a, b=2):`, dann müssen Sie beim Aufruf der Funktion mindestens den Parameter `a` angeben, wenn Sie `b` nicht angeben, hat diese Variable den Wert 2.\n", "Beispielhafte Aufrufe:\n", "```python\n", "funktion(1)\n", "funktion(1, 1)\n", "funktion(1, b=1)\n", "funktion(a=1, b=1)\n", "```\n", "\n", "Bei `` steht der Code, den Sie in der Funktion definieren wollen.\n", "Die `return ` Anweisung legt die Ausgabe der Funktion fest.\n", "Sie können die `return` Anweisung auch weglassen, wenn Ihre Funktionen keine Ausgabe benötigt." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Arbeitsanweisung:**
\n", "Schreiben Sie selbst 2 Funktionen zur Berechnung von Fakultäten $n!$. \n", "Implementieren Sie hierzu die explizite und rekursive Definition der Fakultät in *Python* in der nächsten Zelle und verwenden Sie keine externen Bibliotheken zur Berechnung.\n", "\n", "**Hinweis zur Vorgehensweise beim Programmieren:**
\n", "Während der Programmentwicklung empfiehlt es sich, neu eingegebenen Code regelmäßig zu testen.\n", "Es ist auch üblich und sinnvoll, mit jeweils geeignet platzierten `print`-Befehlen zu überprüfen, ob wirklich genau das geschieht, was Sie sich vorgestellt hatten.\n", "Es ist normal, dass Python Sie gelegentlich mit Fehlermeldungen konfrontiert, die auf den ersten Blick nicht immer einsichtig sind. \n", "Korrigieren und testen Sie Ihren Code und bauen Sie Ihre Programme so schrittweise aus gut getesteten Einzelkomponenten auf, bis Sie am Ende ein zufriedenstellendes Gesamtergebnis erhalten.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Berechnung als Funktion über explizite Definition\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Berechnung über rekursive Funktion\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Überprüfen Sie Ihre Funktionsdefinitionen, indem Sie das Ergebnis der beiden Funktionen für die Werte $n=2,\\dots, 10$ ausgeben lassen." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Aufruf der Funktion innerhalb einer Schleife über die geforderten Werte\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 2: 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* (und viele weitere) Bibliothek(en) sind 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. Suchen Sie für die Erzeugung der Zufallszahlen eine passende Funktion in der Dokumentation von [*numpy.random*](https://numpy.org/doc/stable/reference/random/legacy.html#functions-in-numpy-random) aus oder verwenden Sie die Ihnen aus der Vorlesung bekannten Beispielfunktionen.\n" ] }, { "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 3: 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 Grafik-Werkzeug 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 [*np.linspace*](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html) Funktion 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 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*](https://numpy.org/doc/stable/reference/random/legacy.html#functions-in-numpy-random) 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" ] } ], "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 }