diff --git a/tools/data_aquisition_by_hand.ipynb b/tools/data_aquisition_by_hand.ipynb index 56853146762490a40e914fa4f2e3580c8df70765..8a76c0ebc39e31d1d9aef205de27a5e38d1b53c0 100644 --- a/tools/data_aquisition_by_hand.ipynb +++ b/tools/data_aquisition_by_hand.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "4abb1785-91d0-4c14-8b61-a04e2823a405", + "id": "14f93d6e-7330-4931-8076-a482dcc871e1", "metadata": { "jp-MarkdownHeadingCollapsed": true }, @@ -15,9 +15,27 @@ " * Legen Sie geeignete Tabellen in Code-Zellen an. \n", " * Richten Sie die grundlegende Weiterverarbeitung der Messdaten ein, indem Sie z.B. **Code-Snipets zur Berechnung systematischer Unsicherheiten in einer Code-Zelle hinterlegen**. \n", " * Richten Sie die Möglichkeit ein die aufgenommenen **Daten sofort zu visualisieren**. So können Sie missglückte Messungen (sog. *outlier*) leicht identifizieren und ggf. neu messen. \n", - " * Speichern Sie das Jupyter-notebook während der Datennahme in regelmäßigen Zeitabständen, damit Ihnen keine Daten verloren gehen.\n", - "\n", - "In der folgenden Code-Zelle sehen Sie ein Beispiel für eine vorgefertigte Tabelle, wie man Sie bereits in der Vorbereitung zum Versuch einrichten kann, und in die Sie nur noch Ihre Messwerte eintragen müssen. Nach Ausführen der Code-Zelle können Sie die aufgenommenen Daten zu jedem Zeitpunkt **sofort visualisieren**: " + " * Speichern Sie das Jupyter-notebook während der Datennahme in regelmäßigen Zeitabständen, damit Ihnen keine Daten verloren gehen." + ] + }, + { + "cell_type": "markdown", + "id": "7b0f197c-3e85-45aa-93c2-035873086617", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Vorgefertige Tabellen in Codezellen" + ] + }, + { + "cell_type": "markdown", + "id": "71eb8d3a-da8a-4f4f-8c74-88b44f55352f", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "In der folgenden Code-Zelle sehen Sie ein Beispiel für eine vorgefertigte Tabelle, wie man sie bereits in der Vorbereitung zum Versuch einrichten kann, und in die Sie nur noch Ihre Messwerte eintragen müssen. Nach Ausführen der Code-Zelle können Sie die aufgenommenen Daten zu jedem Zeitpunkt **sofort visualisieren**: " ] }, { @@ -65,6 +83,85 @@ "# are better suited for statistical parameter estimation, like e.g. kafe2.\n", "plt.scatter((a0+a1)/2, a2)" ] + }, + { + "cell_type": "markdown", + "id": "2e7835fc-1d8b-40c8-b1d9-c6bb53da02ff", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Anzeige von Daten mit Unsicherheiten" + ] + }, + { + "cell_type": "markdown", + "id": "e312ddd6-620f-472c-a6f4-1bc17ccfc08e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "In der folgenden Code-Zelle zeigen wir Ihnen ein Beispiel, wie man mit Hilfe der Bibliothek *matplotlib* **Daten mit Unsicherheiten in $x$- und $y$-Richtung visualisiert'': " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bdaf1156-73dd-460f-b65c-a4c0c9b8b4aa", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np, matplotlib.pyplot as plt\n", + "\n", + "# data point in x\n", + "x_data = [1, 2, 3, 4, 5]\n", + "# uncertainty in x\n", + "x_err = [0.3, 0.3, 0.2, 0.2, 0.1]\n", + "# data point in y\n", + "y_data = [1, 4, 9, 16, 25]\n", + "# uncertainty in y\n", + "y_err = [0.75, 0.8, 1.2, 2.5, 3.5] \n", + "\n", + "# Display with errorbars\n", + "plt.title(\"Beispiel zur Visualisierung von Daten mit Unsicherheiten\")\n", + "plt.errorbar(x_data, y_data, xerr=x_err, yerr=y_err, color='darkblue', marker=\"o\")\n", + "plt.ylabel(\"y-Achse\", size='x-large')\n", + "plt.xlabel(\"x-Achse\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e986db70-3cfa-4816-86c9-6f41b5f816e7", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## Check" + ] + }, + { + "cell_type": "markdown", + "id": "c9955ad7-bd9f-49cb-965a-e6153b8ab364", + "metadata": {}, + "source": [ + "Führen Sie zur Wiederholung des Gelernten und zum Test Ihres Verständnisses noch einmal die folgenden Operationen durch:\n", + "\n", + " * Lesen Sie `x_data`, `x_err`. `y_data` und `y_err` ein, wie im Beispiel **Vorgefertigte Tabellen in Codezellen** gezeigt.\n", + " * Teilen Sie den den numpy array geeignet auf. \n", + " * Stellen Sie die eingelesenen Daten mit *matplotlib* dar, wie im Beispiel **Anzeige von Daten mit Unsicherheiten** gezeigt. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a865ae19-474c-4d69-aae1-27cbd56db520", + "metadata": {}, + "outputs": [], + "source": [ + "# ADD YOUR CODE BELOW" + ] } ], "metadata": { diff --git a/tools/work_with_data.ipynb b/tools/work_with_data.ipynb index 035f86c19e04de3370091009e43beaab6ce4ea37..c3bc0153ef942d480ff67937a968895c93791839 100644 --- a/tools/work_with_data.ipynb +++ b/tools/work_with_data.ipynb @@ -3,45 +3,107 @@ { "cell_type": "markdown", "id": "4abb1785-91d0-4c14-8b61-a04e2823a405", - "metadata": {}, + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, "source": [ "# Beispiele zur Arbeit mit Daten \n", "\n", "In den folgenden Abschnitten zeigen wir Ihnen:\n", "\n", - " * Wie Sie, mit Hilfe der Bibliothek *numpy* Mittelwert und Varianz einer Stichprobe von zufallsgrößen auswerten können.\n", - " * Wie die einen gewichteten Mittelwert und die Unsicherheit daraus auswerten können.\n", - " * Wie Sie den *pull* zwischen zwei Messungen $x_{0}$ und $x_{1} $ mit Unsicherheiten $\\Delta x_{0}$ und $\\Delta x_{1}$ berechnen können." + " * Wie Sie, mit Hilfe der Bibliothek *numpy* **Mittelwert und Varianz einer Stichprobe** von Zufallsgrößen auswerten können.\n", + " * Wie die einen **gewichteten Mittelwert und die Unsicherheit** daraus auswerten können.\n", + " * Wie Sie den ***pull* zwischen zwei Messungen $x_{0}$ und $x_{1}$ mit Unsicherheiten $\\Delta x_{0}$ und $\\Delta x_{1}$** berechnen können.\n", + "\n", + "Wir verwenden dabei die folgenden ausgedachten Datenpunkte" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "5dcc2735-37bb-4bcc-be21-1ca7bcfb63f7", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Gewichteter Mittelwert: 4.5402900284048435 +/- 0.03668095690941965\n" - ] - } - ], + "outputs": [], "source": [ "import numpy as np\n", "\n", "# Werte\n", "vx = np.array([1, 2, 3, 4, 6, 5, 8, 7])\n", - "dx = np.array([0.1, 0.2, 0.1, 0.1, 0.05, 0.75, 1.5, 0.25]) \n", + "dx = np.array([0.1, 0.2, 0.1, 0.1, 0.05, 0.75, 1.5, 0.25]) " + ] + }, + { + "cell_type": "markdown", + "id": "1f7de24e-bafb-4a70-aaff-347866dc0615", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Mittelwert und Varianz der Stichprobe" + ] + }, + { + "cell_type": "markdown", + "id": "9170e82d-f333-4959-a132-286d3f58b6cb", + "metadata": {}, + "source": [ + "In der folgenden Codezelle sehen, wie wie man Mittelwert und Varianz aus einer Stichprobe mit Hilfe der Bibliothek *numpy* berechnet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6b1ed77-7227-41a6-8864-25f0125a4fda", + "metadata": {}, + "outputs": [], + "source": [ + "# The sample in question\n", + "print(\"Sample:\", vx)\n", + "# Sample mean\n", + "print(\"The mean of vx :\", np.mean(vx))\n", + "# Sample variance; check help(np.var) for more information\n", + "print(\"The variance of vx:\", np.var(vx, ddof=1))\n", + "# The uncertainty on the mean\n", + "print(\"The uncertainty on the mean of vx\", np.sqrt(np.var(vx, ddof=1)/len(vx)))" + ] + }, + { + "cell_type": "markdown", + "id": "df675017-b558-465a-83e3-7bc4e965c27e", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Gewichteter Mittelwert und Unsicherheit darauf" + ] + }, + { + "cell_type": "markdown", + "id": "23a28b2d-0353-4a29-b62d-7b7574229d36", + "metadata": {}, + "source": [ + "Wenn Sie einen **Mittelwert aus Messungen bilden möchten, die bereits mit Unsicherheiten versehen sind** sollten Einzelmessungen mit großer Unsicherheit mit weniger Gewicht in den Mittelwert eingehen, als Einzelessungen mit geringer Unsicherheit. Unter der Annahme, dass alle Unsicherheiten 68% Konfidenzintervallen unter Normalverteilung entsprechen erhalten Sie eine statistisch unverzerrte und effiziente Schätzung aus dem **gewichteteten Mittelwert**. \n", "\n", - "# Berechnung eines gewichteten Mittelwerts\n", + "In der folgenden Codezelle zeigen wir Ihnen, wie man den **gewichteten mittelwert unf die Unsicherheit darauf** mit der Bibliothek *numpy* berechnet." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e581aa0-d32e-4440-9eff-4fa132362f8d", + "metadata": {}, + "outputs": [], + "source": [ + "# The weights from the uncertainties\n", "w = 1./dx**2\n", - "sumw = np.sum(w)\n", - "mean = np.sum(w*vx)/sumw\n", + "# Sum of weights\n", + "sumw = np.sum(w)\n", + "# Weighted mean\n", + "mean = np.sum(w*vx)/sumw\n", + "print(\"The weighted mean of vx :\", mean)\n", + "# weighted variance\n", "sigma = np.sqrt(1./sumw)\n", - "\n", - "print(\"Gewichteter Mittelwert:\", mean, \"+/-\", sigma)" + "print(\"The uncertainty on the weighted mean of vx:\", var)" ] } ],