{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Rechnernutzung in der Physik\n", "**Institut für Experimentelle Teilchenphysik** \n", "**Institut für Theoretische Teilchenphysik** \n", "Prof. G. Quast, Prof. M. Steinhauser \n", "Dr. A. Mildenberger, Dr. Th. Chwalek \n", "[Ilias Seite zum Kurs](https://ilias.studium.kit.edu/ilias.php?ref_id=2212147&cmd=frameset&cmdClass=ilrepositorygui&cmdNode=x1&baseClass=ilrepositorygui) \n", "WS 2023/24 – Blatt 01 \n", "Abgabe: Montag 13.11.2023 bzw. Dienstag 14.11.2023 \n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Das erste Übungsblatt dient der Wiederholung oder Auffrischung der bereits erlernten *python*-Kenntnisse. Außerdem sollen Sie sich mit Ihrer Arbeitsumgebung auseinandersetzen und gegebenenfalls mit Ihrem Tutor Schwierigkeiten besprechen. Begleitet wird die Wiederholung durch einige aus der Vorlesung bekannte Themen.\n", "\n", "Zunächst noch einige ergänzende Worte zu der Umgebung:
\n", "Die Umgebung, in der Sie hier arbeiten, wird als *jupyter* notebook bezeichnet. *jupyter notebooks*\n", "sind Dateien vom Typ *.ipynb*, die sowohl erklärenden Text als auch Anweisungen für den Computer\n", "enthalten. *jupyter* bietet eine Browser-Schnittstelle mit einer (einfachen) Entwicklungsumgebung für \n", "Anweisungen in der Sprache *python* und erklärende Texte im intuitiven *markdown*-Format. Die \n", "Eingabe von Formeln im LaTeX-Format zur komfortablen und grafisch ansprechenden Gestaltung von \n", "Formeln wird ebenfalls unterstützt. \n", "\n", "Die *jupyter*-Oberfläche lässt sich zwar komplett mit der Maus bedienen, viel effizienter ist\n", "es allerdings, nach einiger Eingewöhnung die Tastatur zu benuzten. Eine kleine Liste an \n", "Tastenkürzeln (genannt \"*jupyter*-Shortcuts\") ist hier - als Tabelle im *markdown*-Format:\n", "\n", " Modus | Befehl | Aktion |\n", ":-----------------|:------------------|:--------------------------------------------|\n", "**A**llgemein | `esc` | verlässt Editiermodus |\n", " A | `enter` | geht in Editiermodus | \n", "**E**ditiermodus | `shift` + `enter` | führt Zelle aus und geht zur nächsten |\n", " E | `ctrl` + `enter` | führt Zelle aus |\n", "**K**ommandomodus | `d,d` | löscht aktuelle Zelle |\n", " K | `z` | macht Zellenlöschung rückgängig |\n", " K | `a` | fügt neue Zelle überhalb der aktuellen ein |\n", " K | `b` | fügt neue Zelle unterhalb der aktuellen ein |\n", " K | `m` | ändert zu Markdown |\n", " K | `y` | ändert zu Code |\n", "\n", "\n", "Durch Doppelklick in diese Zelle sehen Sie den eingegebenen Text, wenn Sie `shift` + `enter`\n", "eingeben, wird die Zelle formatiert und Sie sehen eine schön gesetzte Tabelle. \n", "\n", "Bitte ausprobieren ! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 1: Fingerübungen und Zufallszahlen \n", "---\n", "\n", "Im ersten Aufgabenteil führen Sie einige \"Computer-Experimente\" durch, um sich selbst einige Zufallszahlen zu erzeugen. Sie überprüfen damit Ihre *python* Kenntnisse und schaffen eine Grundlage für die [zweite Aufgabe](#Aufgabe2).
\n", "In den folgenden Aufgabenteilen erzeugen Sie Zufallszahlen für drei gängige Verteilungen und schätzen Sie deren Erwartungswert $\\mathrm{E}[n]$ (über den Mittelwert) und Varianz $\\mathrm{V}[n]$ (über die Stichprobenvarianz). Probieren Sie sich durch die verschiedenen *numpy* Methoden durch und scheuen Sie sich nicht, ihre Funktionsweisen nachzuschlagen auf entsprechenden Hilfeseiten. (Dieses Prinzip gilt natürlich in voller Allgemeinheit.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## a) Binomialverteilung\n", "Das klassische Beispiel für die Binomialverteilung ist der mehrfache Wurf einer Münze. Bei jedem einzelnen Wurf wird – idealerweise – mit gleicher Wahrscheinlichkeit das Ergebnis *Kopf* bzw. *Zahl* erwartet. Im Beispiel des Galton-Bretts in der Vorlesung war die Binomialverteilung maßgeblich für die einzelnen Streukörper. Sie werden noch einige weitere interessante Beispiele aus der Modernen Physik kennenlernen, die dieser Verteilung folgen. So werden Sie beispielsweise in der statistischen Mechanik häufig mit Zwei-Zustandssystemen konfrontiert. Beispiele hierfür sind Systeme mit genau zwei Energieniveaus (Energie 1, Energie 2), Fermionzustände (besetzt, nicht besetzt), Spin (up, down) u.v.m.\n", "\n", "Die Wahrscheinlichkeit, bei $N$ Würfen mit einer Münze insgesamt $n$ Mal das Ergebnis \"Zahl\" zu erhalten, wird durch die Binomialverteilung\n", "$$\n", "P(n;p,N)=\\left(\n", "\\begin{array}{c}\n", "N \\\\ n\n", "\\end{array}\n", "\\right)\n", "p^n(1-p)^{N-n},\\ \\ n=1,\\dots,N\n", "$$\n", "beschrieben. Wenn Sie ein solches Experiment oft wiederholen, können Sie die Häufigkeit des Auftretens des Ergebnisses $n$ bestimmen und mit der Binomialverteilung vergleichen.\n", "> Überlegen Sie sich schon im Vorraus wie der Erwartungswert und die Varianz dieser Verteilung aussehen muss.\n", "\n", "Nutzen Sie die *numpy*-Methode *np.random.binomial(N, p, size=1)*, um eine Stichprobe mit $N=10$ \"fairen Münzwürfen\" zu erzeugen.\n", "> Vorüberlegung: Welchen Wert soll in diesem Fall $p$ annehmen?\n", "\n", "Wiederholen Sie die Stichprobe 100 Mal und speichern Sie sich in einem Array. Jeder Eintrag in diesem Array kann interpretiert werden als die Häufigkeit des Auftretens des Ergebnisses \"Zahl\". \n", "> Hinweis: Verwenden Sie das *size* Argument von *np.random.binomial*, um den Aufwand des Codes zu verringern. \n", "\n", "Berechnen Sie anschließend Erwartungswert und Varianz der gegebenen Binomialverteilung mithilfe der mathematischen Formeln für eine solche Verteilung und vergleichen Sie die Resultate mit den Ergebnissen der Methoden *np.mean(array)* bzw. *np.var(array)*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#S = # Size of the ensemble of toy experiments (number of toy experiments)\n", "#N = # how often to toss\n", "#p = # probability\n", "\n", "#rng = np.random.default_rng(42)\n", "#results_bino = rng.binomial(N, p, size=S)\n", " \n", "# calculate mathematical expectation and variance using the mathematical equation for the binomial distribution\n", "\n", "#math_mean = \n", "#math_var = \n", "\n", "# calculate sample mean and variance with numpy\n", "#sample_mean = np.mean(results_bino)\n", "#sample_var = np.var(results_bino)\n", "\n", "# print out both sample means and variances\n", "\n", "print(\"Mein Erwartungswert: \", math_mean)\n", "print(\"Meine Varianz: \", math_var)\n", "#print(\"Numpy Mittelwert: \", sample_mean)\n", "#print(\"Numpy Stichprobenvarianz: \", sample_var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wiederholen Sie den Vorgang (Mehrfachausführung der Zelle) drei bis vier Mal für 100 Experimente (beachten Sie hierfür die Einstellung des Seeds für den Zufallszahlengenerator).
\n", "Wiederholen Sie den Vorgang auch für 100000 Experimente.\n", "> Frage: Was fällt dabei auf?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## b) Gaußverteilung\n", "Die Gauß- oder auch Normalverteilung wird in Ihrem Studium, dem Berufsleben und auch im Alltag sehr häufig auftauchen, da sie für viele Aspekte verwendet wird, in denen stochastische Prozesse eine Rolle spielen. Insbesondere durch den **zentralen Grenzwertsatz** erhält die Normalverteilung eine besondere Stellung in Natur- und Sozialwissenschaften. Dieser sagt nämlich aus, dass für viele additive, unabhängige Zufallseffekte die Verteilung dieser einer Normalverteilung entgegen strebt.
\n", "Die Gaußverteilung $f(x;\\mu,\\sigma)$ wird im Wesentlichen durch zwei Parameter charakterisiert:\n", "\n", "* Der Erwartungswert der Verteilung entspricht dem Parameter $\\mu$: $\\mathrm{E}[x]=\\mu$\n", "* Die Standardabweichung der Verteilung ist gegeben durch den Parameter $\\sigma$, die Varianz ist dann gegeben durch $\\mathrm{V}[x]=\\sigma^2$\n", "\n", "Die Wahrscheinlichkeitsdichte hat die Form:\n", "\n", "$$\n", "f(x;\\mu,\\sigma)=\\frac{1}{\\sigma\\sqrt{2\\pi}}e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2}.\n", "$$\n", "\n", "Verwenden Sie die *numpy* Methode *np.random.standard_normal(Len)*, um normalverteilte Zufallszahlen mit dem Erwartungswert $\\mu=3$ und der Standardabweichung $\\sigma=2$ zu erzeugen. *Len* gibt dabei die Länge des erzeugten Arrays an. Verwenden Sie *Len* $=100000$.\n", "> Hinweis: *np.random.standard_normal(Len)* erzeugt Zufallszahlen mit Erwartungswert $\\mu=0$ und Standardabweichung $\\sigma=1$\n", "\n", "Berechnen Sie ebenfalls wieder Mittelwert und Stichprobenvarianz der Zufallszahlen mit den entsprechenden *numpy*-Methoden und vergleichen Sie mit Erwartungswert und Varianz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Len = # number of toy experiments\n", "#mu = # mean\n", "#sig = # standard deviation\n", "\n", "#rng = np.random.default_rng(42)\n", "#results_norm = rng.standard_normal(Len) # MODIFY HERE\n", " \n", "# calculate mathematical expectation and variance using the mathematical equation for this distribution\n", "\n", "#math_mean = \n", "#math_var = \n", "\n", "# calculate sample mean and variance with numpy\n", "#sample_mean = np.mean(results_norm)\n", "#sample_var = np.var(results_norm)\n", "\n", "# print out both means and variances\n", "\n", "#print(\"Mein Erwartungswert: \", math_mean)\n", "#print(\"Meine Varianz: \", math_var)\n", "#print(\"Numpy Mittelwert: \", sample_mean)\n", "#print(\"Numpy Stichprobenvarianz: \", sample_var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## c) Poissonverteilung\n", "Betrachten Sie als drittes Beispiel die ebenfalls häufig auftretende Poissonverteilung. Die Poissonverteilung wird verwendet bei der Beschreibung von diskreten Ereignissen in festen Intervallen, die unabhängig von der Zeit und mit einer konstanten Rate ablaufen. Sie haben die Verteilung bereits bei radioaktiven Zerfällen kennengelernt. Aber auch im Alltag, wie ankommende Briefe bei der Poststelle oder ankommende Anrufe bei Telefondienstleistern, kommt die Verteilung zum Einsatz. Sie werden im laufenden und in zukünftigen Praktika im Studium ebenfalls häufig auf die Poissonverteilung stoßen.
\n", "Die Wahrscheinlichkeitsfunktion der Verteilung als Funktion der Zahl von Ereignissen ($n=0,1,2,\\dots$) wird durch\n", "$$\n", "P(n;\\nu)=\\frac{\\nu^n}{n!}e^{-\\nu}\n", "$$\n", "beschrieben mit dem reellen Parameter $\\nu$, der gleichzeitig Erwartungswert und Varianz der Verteilung darstellt.\n", "\n", "Erzeugen Sie 1000 poissonverteilte Zufallszahlen mit der *numpy*-Methode *np.random.poisson(nu,size)* ($\\nu=10$) und berechnen Sie erneut Erwartungswert und Varianz von Hand und deren Schätzwerte mithilfe der *numpy*-Methoden." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "#size = # number of toy experiments\n", "#nu = # real parameter\n", "\n", "#rng = np.random.default_rng(42)\n", "#results_pois = rng.poisson(nu,size)\n", " \n", "# calculate mathematical expectation and variance using the mathematical equation for this distribution\n", "\n", "#math_mean = \n", "#math_var = \n", "\n", "# calculate sample mean and variance with numpy\n", "#sample_mean = np.mean(results_pois)\n", "#sample_var = np.var(results_pois)\n", "\n", "# print out both sample means and variances\n", "\n", "#print(\"Mein Mittelwert: \", math_mean)\n", "#print(\"Meine Stichprobenvarianz: \", math_var)\n", "#print(\"Numpy Mittelwert: \", sample_mean)\n", "#print(\"Numpy Stichprobenvarianz: \", sample_var)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 2: Wahrscheinlichkeitsdichten \n", "---\n", "Bisher haben Sie sich allein mit den Parametern und dem Erzeugen von Zufallszahlen beschäftigt. Im Folgenden veranschaulichen Sie sich selbst das Gelernte mithilfe einiger Diagramme. Eines der wichtigsten Werkzeuge an dieser Stelle: das **Histogramm**. Da die Darstellungsmöglichkeiten beinahe unendlich sind, beschränkt sich das Übungsblatt allein auf die Methode *plt.hist()* aus der *matplotlib.pyplot*-Bibliothek. Die folgende Aufgabenstellung führt Sie zu einer nützlichen Darstellung von Daten und fordert Sie in den ersten zwei Aufgabenteilen dazu auf, sich häufig dabei auftretende Fehler im Selbststudium bewusst zu machen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## a) \"Einfach mal plotten\"\n", "Häufig ist der erste Gedanke bei der Darstellung von Zufallszahlen und deren Wahrscheinlichkeitsdichtefunktionen (*engl.: probability density functions, kurz: PDFs*) bzw. Wahrscheinlichkeitsfunktionen (*engl.: probability mass functions, kurz: PMFs*), in einem Buch oder in einer Tabelle die PDF bzw. PMF herauszusuchen und einfach zusammen mit den Daten in ein Diagramm zu plotten.\n", "\n", "Verwenden Sie die Angaben aus der [vorherigen Aufgabe](#Aufgabe1) für die normalverteilten Zufallszahlen. Stellen Sie die bereits erzeugten Zufallszahlen mit *plt.hist(zahlen)* dar und tragen Sie sie in ein Diagramm mit der PDF ein (*plt.plot(x, y)* wird hier nützlich sein)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import scipy.special as sp" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Binomial distribution\n", "def fBinomial(x, N_B, p_B):\n", " n = np.around(x)\n", " return sp.binom(N_B, n) * p_B**n * (1-p_B)**(N_B-n)\n", "\n", "# Poisson distribution\n", "def fPoisson(x, nu_P):\n", " n=np.around(x)\n", " return (nu_P**n) / np.exp(nu_P) / sp.gamma(n+1.)\n", "\n", "# Gaussian distribution\n", "def fGauss(x, mu_N, sigma_N):\n", " return np.exp(-(x-mu_N)**2/2./sigma_N**2) / np.sqrt(2.*np.pi) / sigma_N\n", "\n", "# create array for distribution function\n", "#x_gPDF = np.linspace(-5,12,1000)\n", "#mean = np.mean(results_norm)\n", "#std = np.std(results_norm)\n", "\n", "# plot histogram and distribution\n", "\n", "\n", "# adjust plot\n", "plt.xlabel('x')\n", "plt.ylabel('frequency')\n", "plt.legend(loc='best')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sie sollten sehen, dass das dargestellte Diagramm keinerlei Aussage enthält. Es ist nur das Histogramm ohne die PDF zu sehen. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## b) Normierung und Binbreite\n", "Wenn Sie sich an die Vorlesung zurückerinnern, dann wird Ihnen ein Detail auffallen: Die Wahrscheinlichkeit(sdichte) ist auf den Wert **1** normiert. Ihre histogrammierten \"Daten\" sind bisher jedoch noch gar nicht normiert.\n", "\n", "Glücklicherweise übernimmt *plt.hist()* genau diese Funktion für Sie. Finden Sie mithilfe der [Dokumentation von *plt.hist()*](https://matplotlib.org/3.6.0/api/_as_gen/matplotlib.pyplot.hist.html) heraus, mit welchem Argument in *plt.hist()* Sie das Histogramm anpassen können, damit das Histogramm normiert ist und mit der PDF in einer Abbildung dargestellt werden kann.\n", "\n", "*Ignorieren Sie an dieser Stelle noch die Binbreite.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# plot histogram and distribution\n", "\n", "\n", "# adjust plot\n", "plt.xlabel('x')\n", "plt.ylabel('rel. frequency')\n", "plt.legend(loc='best')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sie sollten erkannt haben, dass das Problem mit der Darstellung der PDF gelöst wird.\n", "\n", "Die Auswahl der Binbreite ist, anders als die Normierung, alles andere als trivial. Sie hängt meistens von Ihrem Experiment ab und sollte in einfachen Worten die Auflösung Ihrer Messung widerspiegeln. Die Faustregel ist 20-50 Bins für größere Stichproben. Bei kleinen diskreten Verteilungen ist meist die Anzahl der insgesamt auftauchenden unterschiedlichen Zahlen ein gutes Maß für die Binanzahl.\n", "\n", "Stellen Sie die Daten zusammen mit der PDF auf zwei Weisen dar:\n", "1. Mit 20 Bins\n", "2. Mit so vielen Bins, dass Sie im Prinzip die PDF nach Riemann \"integriert\" haben" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# plot histogram and distribution for 20 bins\n", "\n", "\n", "# adjust plot\n", "plt.xlabel('x')\n", "plt.ylabel('rel. frequency')\n", "plt.legend(loc='best')\n", "\n", "plt.show()\n", "\n", "# plot histogram and distribution for many bins\n", "\n", "\n", "# adjust plot\n", "plt.xlabel('x')\n", "plt.ylabel('rel. frequency')\n", "plt.legend(loc='best')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## c) Anwendung des Gelernten\n", "Erstellen Sie für jede Verteilungsfunktion aus [Aufgabe 1](#Aufgabe1) eine representative Abbildung mit den histogrammierten Zufallszahlen und der entsprechenden Wahrscheinlichkeits(dichte)funktion. Achten Sie dabei auf Achsenbeschriftung und Legende.\n", "\n", "**Tipps:**\n", "- Wenden Sie die Faustregel bei den gaußverteilten Zufallszahlen an.\n", "- Probieren Sie bei poisson- und binomialverteilten Zufallszahlen aus, welche Binanzahl dem betrachteten Bereich entspricht.\n", "- Verwenden Sie bei poisson- und binomialverteilten Zufallszahlen das Argument *align='left'* in *plt.hist()*." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Gaussian\n", "# plot histogram and distribution\n", "\n", "\n", "# adjust plot\n", "\n", "\n", "# Poisson\n", "# create array for distribution function\n", "\n", "\n", "# plot histogram and distribution\n", "\n", "\n", "# adjust plot\n", "\n", "\n", "# Binomial\n", "# create array for distribution function\n", "\n", "\n", "# plot histogram and distribution\n", "\n", "\n", "# adjust plot\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.11.5" }, "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } } }, "nbformat": 4, "nbformat_minor": 4 }