"Kopieren Sie Ihre Lösung von Aufgabe 4.a. aus der Vorbereitung in das Notebook und berechnen Sie nun für die Messwerte aus Aufgabe 4 a. die Leistung $P$ und den Widerstand $R$ sowie deren Fehler. Nutzen Sie hierfür die ausführliche schrebweise der **for**-Schleife im Fall des Widerstands $R$ und den list-comprehension Syntax für die Leistung $P$. Fügen Sie die berechneten Werte als neue Spalten an die Liste *daten* an. \n",
"## Darstellung von Messdaten mittels `Matplotlib`:\n",
"Das Plotten von Daten ist eines der wichtigsten Mittel, um eine Fülle von Informationen kompakt und verständlich seinem Gegenüber darzubieten. Gute Plots zu erstellen kann eine regelrechte Kunst sein und ist für ein gutes Paper, bzw. eine gute Bachelor- bzw. Masterarbeit unverzichtbar. \n",
"Jede Programmiersprache verfügt über zusätzliche Pakete (im Englischen \"packages\"), welche die Funktionalität der verwendeten Programmiersprache erweitern. **Matplotlib** ist ein umfangreiches Package, welches das Zeichnen von 2D und 3D Grafiken ermöglicht. Alle Parameter und Einstellungen einer Grafik werden entsprechend des Python-Codes eingestellt. Dadurch wird das Erstellen der Grafik reproduzierbar und man kann schnell dieselbe Grafik mit neuen Daten füttern.\n",
"Es ist unmöglich, alle Möglichkeiten und Einstellungen, die **Matplotlib** bietet, auswendig zu kennen. Mit der Zeit werden Sie ein solides Grundwissen der gängisten Befehle haben. Für alles Weitere hilft die [Matplotlib-Dokumentation mit ihren Beispielen](http://matplotlib.org/). Des Weiteren ist insbesondere hier die **IPython-Hilfe** und die **automatische Vervollständigung von Befehlen** besonders hilfreich.\n",
"`import` läd für uns aus dem package matplotlib das Modul `pyplot`. Mit Hilfe des Zusatzes `as plt` wird ein \"alias\" (Abkürzung) erstellt. Dieser Alias erspart uns im Nachfolgenden Arbeit, wie wir im nachfolgenden Beispiel sehen können:"
"Innerhalb der Python-Community haben sich ein paar Standards etabliert, an welche man sich halten sollte. So ist für `matplotlib.pyplot` der Alias `plt` zu verwenden.\n",
"Im oberen Beispiel haben Sie nun auch bereits gesehen, wie wir einfache Liniengrafiken erstellen können. Dabei sieht der Plot noch etwas blass aus. Dies können wir mit ein paar zusätzlichen Befehlen und Argumenten ändern."
"Darüber hinaus gibt es auch noch andere nützliche Styleoptionen wie `alpha`, was die Transparenz der Linie ändert (Werte zwischen 0-1), oder die `linewidth`-Option, mit dessen Hilfe Sie die Linienbreite ändern können.\n",
"Ihr seht, das `plot` zwischen den angegebene Werte interpoliert. Möchtet ihr eine glatte Kurve zeichnen so müsst ihr die Anzahl an Punkten für die Interpolation erhöhen."
"In der Physik gehören zu jedem gemessen Wert eine Messunsicherheit / ein Messfehler. Diese Fehler sollten natürlich auch in unseren Grafiken korrekt dargestellt werden. Hierfür können wir den `errorbar`-Plot verwenden."
"Sie können die IPython-Hilfe aufrufen, indem Sie den Cursor innerhalb des Worts errorbar von plt.errorbar bewegen und die Tastenkombination **Shift + Tab** verwenden. Lesen Sie nun nach, wie Sie die x- und y-Werte und deren Fehler an die Funktion übergeben müssen."
"Leider ist diese Standardvariante des Errorbar-Plots noch nicht das, was wir möchten. Die Messwerte sind linear interpoliert und die errorbars sehen noch etwas eigenartig aus. Dies können wir jedoch im Handumdrehen ändern. Kümmern wir uns zunächst um die Plotmarker:"
"All die Optionen, welche wir hier für die Plotmarker verwendet haben, können wir auch in der normalen `plt.plot`-Anweisung verwenden. Dabei gibt es eine ganze Fülle an unterschiedlichen [Marker-Symbole](http://matplotlib.org/api/markers_api.html):\n",
"Ein weiterer Plottyp, welcher häufig Verwendung findet, ist das Histogramm. Um unser Histogramm mit Pseudozufallszahlen zu bestücken, müssen wir diese erst erzeugen. Hierfür können wir das `numpy`-Modul verwenden. `numpy` ist ein weiteres Standardmodul, welches viele nützliche Funktionen mit sich bringt. Hier wollen wir uns jedoch nur auf die Erstellung von Zufallszahlen beschränken. "
"Auch für Histogramme gibt es viele unterschiedliche Optionen, welche Sie entweder mithilfe der Help-Funktion oder anhand der Beispiele in der [Matplolib-Dokumentation](http://matplotlib.org/) herrausfinden können."
"Bei Histogrammen sollten Sie immer darauf achten, dass das \"binning\" sinnvoll gewählt ist. Weder zu viele noch zu wenige Bins führen zu einer sinnvollen Darstellung Ihrer Daten."
"Nach dem wir jetzt die verschiedenen Plottypen mit ihren unterschiedlichen Optionen kennengelernt haben, möchten wir diese natürlich auch speichern können. Dies können wir auf zwei unterschiedliche Arten machen.\n",
"Entweder Sie machen mit Ihrer Maus einen Rechtsklick auf die Grafik und wählen \"Grafik speichern als\" aus, oder Sie verwenden statt der `plt.show`- die `plt.savefig`-Anweisung dafür, wobei Letzteres empfohlen ist."
"1. Erstellen Sie 500000 pseudo-Zufallszahlen, welche einer Gaußverteilung mit $µ=5$ und $sigma=2$ folgen.\n",
"2. Tragen Sie die Zufallszahlen in ein Histogramm ein und normieren Sie dieses, sodass die Gesamtfläche 1 beträgt. **Tipp: `plt.hist` hat hierfür einen optionalen Parameter. Benutzen Sie die Help oder das Internet, um herrauszufinden, welcher es ist.**\n",
"3. Wählen Sie eine geeignete `range` und ein `binning` von 100 für das Histogram.\n",
"4. Plotten Sie anschließend die dazugehörige Gaußverteilung als Funktion. Gehen Sie dabei wie folgt vor:\n",
" 1. Erstellen Sie eine Gaußfunktion. *Erinnerung:* eine Gaußverteilung ist gegeben durch:\n",
" **Tipp:** Das Numpy-Paket beinhaltet die Zahlen $\\pi$ und die Exponentialfunktion. Sie können diese über `np.pi` und `np.exp()` verwenden. \n",
" 2. Erstellen Sie eine Liste von x-Werten in der von Ihnen gewählten range in 0.1er Schritten. Verwenden Sie hierfür die `range`-Funktion zusammen mit der list-comprehension.\n",
"Sie sehen `curve_fit` gibt uns zwei unterschiedliche Listen zurück. Die erste Liste `para` beinhaltet die berechneten Fitparameter. `pcov` hingegen ist eine [Kovarianzmatrix](https://de.wikipedia.org/wiki/Kovarianzmatrix) auf deren Diagonalen Sie die Varianzen ($\\sigma^2$) der einzelnen Parameter finden (auf der Nebendiagonalen befinden sich die Kovarianzen). D.h. bei einer Funktion mit drei Parametern `def f(x, p1, p2, p3):` würde `para` und `pcov` allgemein so aussehen:\n",
"wobei `cov_i,i` wie bereits erwähnt die einzelnen Kovarianzen bzw. Varianzen sind. Aber was genau macht jetzt curve_fit eigentlich, um auf diese Werte zu kommen? Wie bereits erklärt, basiert `curve_fit` auf der Methode der kleinsten Quadrate. D.h. die Funktion probiert etliche verschiedene Varianten Ihrer Parameter durch, bis es die Kombination gefunden hat, bei der das $\\chi^2$ klein wird. Gucken wir uns mal ein paar Zwischenschritte für unser Beispiel des ohm'schen Widerstandes an: \n",
"Das Ergebnis sieht bereits ganz gut aus, allerdings kennt hier unsere Funktion `curve_fit` die Fehler unserer Messwerte noch gar nicht. Da dies sehr unphysikalisch ist, wiederholen wir das Ganze nochmal mit Unsicherheiten:"
"Wie gut fittet unsere obige Funktion unsere Messdaten? Sehr gut? Gut? Befriedigend? Oder doch eher schlecht? Wäre es nicht gut, ein Maß für die Güte des Fits zu haben? Wie könnte ein solches Maß aussehen?\n",
"Sie haben das entscheidende Kriterium bereits kennengelernt, bei der Methode der kleinsten Quadrate geht es darum, das $\\chi^2$ zu minimieren. Gucken wir uns hierzu erst noch einmal an, wie sich das $\\chi^2$ berechnet:\n",
"Wie vergleicht sich dieses $\\chi^2$ nun mit einer Funktion, welche unsere Daten schlechter beschreibt? Zum Beispiel sofern wir die Spannung über die Funktion\n",
"Wie Sie sehen können, ist das $\\chi^2$ für unsere zweite Funktion etwas größer als für das klassische ohm'sche Gesetzt. Somit würden wir unseren zweiten Ansatz verwerfen.\n",
"Damit man für einen gegebenen Datensatz nicht hunderte von verschiedenen Funktionen durchprobieren muss, gibt es für das $\\chi^2$ eine allgemeine Faustregel, welche den berechneten $\\chi^2$-Wert mit der Anzahl unserer Freiheitsgrade vergleicht. Die Anzahl an Freiheitsgrade ist allgemeinhin gegeben als *Anzahl der Messwerte - Anzahl der Funktionsparameter* ($m - n$).\n",
"1. Sofern $\\chi^2/\\text{ndof} >> 1$: sollte die Hypothese bzw. die Fitfunktion angezweifelt werden. Sie beschreibt in diesem Fall die Messdaten nur unzureichend. (Bzw. sollte $\\chi^2/\\text{ndof} > 1$ kann dies auch bedeuten, dass die Unsicherheiten unterschätzt sind)\n",
"3. Falls $\\chi^2/\\text{ndof} << 1$ beschreibt die Hypothese bzw. die Fitfunktion die Daten wesentlich besser als erwartet. In diesem Fall heißt es nicht, dass unsere Hypothese falsch ist, aber man sollte überprüfen, ob die gemessenen Fehler nicht überschätzt worden sind (oder eine Korrelation zwischen den Messfehlern vorliegt). \n",
"Sofern Sie eine Arbeit schreiben und Ihre **Goodness-of-the-Fit** ($\\chi^2/\\text{ndof}$) angeben wollen, so geben Sie immer beides an, das $\\chi^2$ und die Anzahl an Freiheitsgraden ndof. Beide Werte getrennt haben einen größeren Informationsgehalt als der resultierende Quotient (Genaueres lernen Sie z.B. in der Vorlesung *Statistik, Datenanalyse und Simulationen* im Master)."
"Jetzt sind Sie ein letztes mal gefordert. In dieser Aufgabe wollen wir alles, was wir heute gelernt haben, nochmal reflektieren und anwenden. Erstellen Sie hierfür ein neues Jupyter-Notebook und bearbeiten Sie die Aufgaben im Skript. Sofern Sie Fragen bzw. Probleme haben, vergessen Sie nicht auf die folgenden Hilfsmöglichkeiten zurückzugreifen:\n",
"1. Verwendung der IPython-Hilfe unter Verwendung der **Shift + Tab** Tasten.\n",
"2. Die ausführliche Dokumentation von Python und das Angebot etlicher nützlicher Hilfsbeiträge in verschiedenen Foren (z.B. stackoverflow) im Internet.\n",
"3. Fragen Sie beim Assistenten nach: **`mobitar@students.uni-mainz.de`**"