{
"cells": [
{
"attachments": {},
"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 05
\n",
"Abgabe: Montag, 10.07.2023 ($A$) & Montag, 17.07.2023 ($B$)\n",
"\n",
"---"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Wichtig: Anmeldung im Campussystem\n",
"Um die Übung als erfolgreich bestanden anerkannt zu bekommen, müssen Sie sich bis zur Abgabe des letzten Blattes im [Campussytem](https://campus.studium.kit.edu/exams/registration.php) für die Leistung anmelden!\n",
"Die Voraussetzung zum Bestehen in das erfolgreiche Bearbeiten von mindestens einer Aufgabe auf den Übungsblättern 2-5 und das erfolgreiche Testat von Übungsblatt 6.
\n",
"Anmeldebeginn:\t29.06.2023 00:00
\n",
"Anmeldeschluss:\t24.07.2023 18:00\n",
"\n",
"---\n",
"\n",
"Auf dem letzten regulären Übungsblatt lernen Sie die praktischen Grundlagen für die Parameterschätzung.\n",
"Mit dem Wissen aus diesen Aufgaben können Sie jede Anpassung im Anfängerpraktikum und in Teilen darüber hinaus durchführen.\n",
"In der [ersten Aufgabe](#Aufgabe1) betrachten Sie in einer anwendungsorientierten Weise die Grundlagen jeder Parameterschätzung und führen an einem einfachen Beispiel diese durch.\n",
"Die [zweite Aufgabe](#Aufgabe2) zeigt Ihnen an einem ausführlichen Beispiel, wie Sie das Werkzeug `kafe2` verwenden können, um die Anpassung verlässlich und ohne viel Aufwand durchzuführen. \n",
"Dabei wird Ihnen die Paramaterschätzung einmal \"vorgeführt\" und anschließen haben Sie die Möglichkeit, das Ergebnis aus der ersten Aufgabe zu reproduzieren.\n",
"In der [dritten Aufgabe](#Aufgabe3) beschäftigen Sie sich mit einer typischen Herausforderung, die Ihnen bereits in der Vorlesung vorgestellt wurde: Korrelationen zwischen Anpassungsparametern.\n",
"Sie werden in dieser Aufgabe sich die Sachlage visualisieren und eine Lösung ausarbeiten."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 1: Parameterschätzung Resonanzkurve mit Daten \n",
"---\n",
"\n",
"Die Schätzung von Parametern einer Modellfunktion ist eine typische Aufgabe in der Datenanalyse.\n",
"Ziel dieser Übungsaufgabe ist es, sich mit der prinzipiellen Methodik der Parameterschätzung auseinanderzusetzen und die wesentlichen Schritte dabei kennenzulernen.\n",
"Ganz allgemein besteht die Parameterschätzung aus drei Aspekten: \n",
"1. Ein Modell, welches Sie an Ihre Daten anpassen wollen\n",
"2. Ein Maß (oder Kostenfunktion), welches die Abweichung zwischen den gemessenen Daten und Ihres Modells quantifiziert\n",
"3. Das Finden der optimalen Modellparameter durch Extremwertbetrachtung des Maßes\n",
"\n",
"In dieser Aufgabe werden Ihnen die Daten und das zugrunde liegende Modell vorgegeben.\n",
"Ihre Aufgabe wird es also sein, mit einem gegebenen Maß die Parameterschätzung durchzuführen.\n",
"Hierbei führen Sie die Parameterschätzung erst mal stark vereinfacht durch und können in den folgenden Aufgaben testen, wie Sie es im Praktikum machen können.\n",
"\n",
"Sie betrachten in dieser Aufgabe die gemessenen Daten einer Resonanzkurve, welche durch folgendes Modell beschrieben wird:\n",
"$$\n",
"A(\\eta; D)=\\frac{1}{\\sqrt{(1-\\eta^2)^2 + (2\\eta D)^2}} \\,.\n",
"$$\n",
"Gemessen wurde die Amplitude $A$ in Abhängigkeit der normierten Frequenz $\\eta$.\n",
"Die Messdaten und deren Unsicherheiten sowie Resonanzkurven für verschiedene Werte von $D$ werden in den folgenden Zellen für Sie dargestellt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Resonanzfunktion\n",
"def resonanz(eta, D):\n",
" return 1/np.sqrt((1 - eta*eta)**2 + (2*eta*D)**2)\n",
"\n",
"# Gemesse Datenpunkt\n",
"etam = np.array([0.10, 0.30, 0.50, 0.70, 0.90, 1.10, 1.30, 1.50, 1.70, 1.90, 2.10])\n",
"Am = np.array([0.97, 0.92, 1.12, 1.09, 1.36, 1.17, 0.76, 0.54, 0.47, 0.41, 0.36])\n",
"\n",
"# Unsicherheit auf die gemessene Amplitude\n",
"Aerr = 0.1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Darstellung an Funktionenschar der Resonanzkurve\n",
"etamin, etamax = 0, 3\n",
"npoints = 1000\n",
"eta = np.linspace(etamin, etamax, npoints, endpoint=True)\n",
"\n",
"# Darstellung der verschiedenen Resonanzen\n",
"for D in (0.25, 0.35, 0.5, 0.6):\n",
" plt.plot(eta, resonanz(eta, D), label=f\"$D$={D:.2f}\")\n",
"\n",
"# Darstellung der Messwerte\n",
"plt.errorbar(etam, Am, yerr=Aerr, fmt='ko')\n",
"\n",
"plt.title('Resonanzkurve')\n",
"plt.xlabel(r'$\\eta=\\omega/\\omega_0$', size='x-large')\n",
"plt.ylabel('(normierte) Amplidude $A$')\n",
"\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Sie sollen nun die Dämpfungskonstante $D$ bestimmen.\n",
"Verwenden Sie hier als Maß die von Gauß vorgeschlagene \"Summe der Residuenquadrate\", d.h. die Summe der auf die Messunsicherheit normierten Quadrate der Abweichungen der Messwerte von der Funktion:\n",
"$$\n",
"S(D)=\\sum_{i=1}^n \\frac{( A_i^\\mathrm{Messung} - A_i^\\mathrm{Modell}(\\eta; D))^2}{\\sigma_i^2} \\,.\n",
"$$\n",
"Die beste Anpassung finden Sie an der Stelle, an der $S(D)$ ein Minimum erreicht."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Berechnen Sie für 1000 verschiedene Werte $D\\in[0.35, 0.5]$ das Maß $S(D)$ und stellen Sie $S(D)$ grafisch dar.\n",
"Bestimmen Sie anschließend den besten Schätzwert von $D$ und tragen Sie die resultierende Resonanzkurve zusammen mit den Messwerten in eine Grafik ein."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Hinweis:**
\n",
"Zur Bestimmung des besten Schätzwerts für $D$ könnte [`nump.argmin`](https://numpy.org/doc/stable/reference/generated/numpy.argmin.html) hilfreich sein. \n",
"Denken Sie hierbei an die Verwendung von Indexierung."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Optional: Funktion zur Bestimmung von S(D)\n",
"\n",
"# Definition von Scanparameter D\n",
"\n",
"# Berechnung von S\n",
"\n",
"# Bestimmung des Minimums\n",
"\n",
"# Darstellung von S(D)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Darstellung der Resonanz beim besten Schätzwert\n",
"\n",
"# Darstellung der Messwerte\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 2: Anpassung von Modellen an Daten mit `kafe2` \n",
"---\n",
"Obwohl sich viele Anpassungsprobleme auch analytisch lösen lassen, setzt man in der Praxis Software-Werkzeuge ein, die die Verwaltung von Daten, Modellen und das Durchführen der eigentlichen Anpassung mit numerischen Methoden bewerkstelligen.\n",
"Ein solches Werkzeug ist [`kafe2`](http://kafe2.readthedocs.io). \n",
"Dieses Werkzeug ist hier am KIT entworfen worden und wird immer noch weiterhin hier entwickelt.\n",
"Mit der Zeit hat `kafe2` viele Funktionalitäten erhalten und bietet für die Parameterschätzung ein breites Spektrum an, welches die des Praktikums überschreittet.\n",
"Lassen Sie sich jedoch noch nicht durch das Paket abschrecken, sondern üben Sie sich in der Anwendung durch das Beispiel in dieser Aufgabe.\n",
"Bei Gelegenheit können Sie gerne durch die [Online-Dokumentation](https://kafe2.readthedocs.io/en/latest/parts/beginners_guide.html) stöbern und sich einen Überblick über die Funktionalitäten verschaffen.\n",
"\n",
"Ziel dieser Aufgabe ist, dass sie anhand des gegeben Beispiels und wenigen Veränderungen die Parameterschätzung aus [Aufgabe 1](#Aufgabe1) wiederholen können. "
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Beispiel:**
\n",
"1. `kafe2` bietet eine `Python` Klassen basiert Struktur, die es Ihnen ermöglicht, an vielen Stellen die Parameterschätzung (ab hier *Fit* genannt) zu beeinflussen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from kafe2 import XYFit, Plot"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"2. An erster Stelle steht immer das Einlesen Ihrer gemessenen Daten. \n",
"In diesem Beispiel gehen Sie den kurzen Weg und tragen \"Messpunkte\" direkt in die Sequenzen `x` und `y` ein.\n",
"In der Anwendung werden Sie hier `NumPy`, `PhyPraKit` oder Ähnliches verwenden, um die Daten direkt aus einer Datei auszulesen.\n",
"Im Beispiel nehmen Sie an, dass `x` mit unendlicher Genauigkeit gemessen wurde und nicht mit einer Unsicherheit behaftet ist.\n",
"Auf `y` nehmen Sie die Unsicherheiten in `yerr` an.\n",
"Die Sequenzen `x`, `y` und `yerr` können Sie praktisch in jeder Form (Liste, `NumPy` Array, ...) angeben oder einen `kafe2.XYContainer` verwenden.\n",
"Mehr dazu finden Sie in der Dokumentation."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# \"Einlesen\" der Daten\n",
"x = [.05, 0.36, 0.68, 0.80, 1.09, 1.46, 1.71, 1.83, 2.44, 2.09, 3.72, 4.36, 4.60]\n",
"y = [0.35, 0.26, 0.52, 0.44, 0.48, 0.55, 0.66, 0.48, 0.75, 0.70, 0.75, 0.80, 0.90]\n",
"yerr = [0.06, 0.07, 0.05, 0.05, 0.07, 0.07, 0.09, 0.1, 0.11, 0.1, 0.11, 0.12, 0.1]"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"3. Das Modell, welches Sie an die Daten anpassen (oder *fitten*) wollen, können Sie selbstständig als Funktion definieren.\n",
"Es bietet sich an, dass das erste Argument den $x$ Werten entspricht, die Sie vorgeben und fitten wollen.\n",
"Alle weiteren Argumente der Funktionen sind die freien Parameter, die Sie fitten.\n",
"In diesem Beispiel passen Sie den vorgegebenen Daten ein Polynom zweiten Grades an, welches Sie in `poly2` definieren.\n",
"Alternativ bietet `kafe2` selbst einige einfache Funktionen (wie die Polynome), die im nächsten Schritt übergeben können.\n",
"Zur besseren Veranschaulichung definieren Sie hier jedoch die Funktion selbst."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition des zu anpassenden Modells\n",
"def poly2(x, a=1.0, b=0.0, c=0.0):\n",
" return a * x**2 + b * x + c"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"4. Jetzt können Sie den Fit selbst zusammenstellen, indem Sie ein `XYFit` Objekt erzeugen, welches auf jeden Fall zwei Argumente benötigt.\n",
" - Sie müssen dem `xy_data` Argument die Daten, die Sie fitten wollen, übergeben.\n",
" An dieser Stelle, da Sie nicht den `XYContainer` verwenden, übergeben Sie direkt in der Reihenfolge $x$, $y$ die Daten als verschachtelte Liste.\n",
" - Dem `model_function` Argument übergeben Sie die Funktion (ohne Argumente), die das Modell beschreibt, welches gefittet werden soll.\n",
"\n",
" Das `XYFit` weisen Sie hier der Variable `fit` zu, da Sie daran noch weitere Anpassungen vornehmen wollen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition des Fits\n",
"fit = XYFit(xy_data=[x, y], model_function=poly2)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"5. An dieser Stelle können Sie nun die Unsicherheiten der Messungen an das `Fit` Objekt übergeben.\n",
"Dazu können sie `add_error` Methode von `XYFit` verwenden.\n",
"(Anmerkung: Sie hätten diesen Schritt auch direkt mit dem `XYContainer` durchführen können.)\n",
"Die `add_error` Methode übernimmt mit dem Argument `axis` die Achse, an der die Unsicherheiten angenommen werden.\n",
"Sie können also `x` (oder 0) oder `y` (oder 1) angeben.\n",
"Dem Argument `err_val` übergeben Sie die tatsächliche Unsicherheit.\n",
"Sie können hier entweder eine Zahl angeben, wenn Sie davon ausgehen, dass an jeder Stelle die gleiche Unsicherheit vorliegt, oder eine Sequenz mit der gleichen Länge wie die Achse, an der die Unsicherheit anliegt.\n",
"Weitere praktische Argumente an dieser Stelle sind auch `correlation` (Zahl) und `relative` (`True` oder `False`).\n",
"Im Praktikum werden Sie häufiger vorfinden, dass an Geräten ein relativer Fehler (z. B. 10%) (dann können Sie `err_val=0.1, relative=True` setzen) oder auch direkt eine Korrelation zwischen bspw. Strom- und Spannungsmessung angegeben wird.\n",
"(Anmerkung: Sie können einer Achse auch mehrere, verschiedene Unsicherheiten mit `add_error` hinzufügen.)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Hinzufügen der Fehler\n",
"fit.add_error(axis='y', err_val=yerr)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"6. Der nächste Schritt im Beispiel ist rein optional und setzt einen schönen Ausdruck für die Darstellung der Modellfunktion im späteren Plot."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Optional: LaTeX Ausdrücke für den Plot festlegen\n",
"fit.assign_parameter_latex_names(a='A', b='B', c=\"C\")\n",
"fit.assign_model_function_latex_expression(\"{a}\\,x^2 + {b}\\,x+{c}\")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"7. Mit der `XYFit.do_fit()` Methode führen Sie nun den Fit selbst durch.\n",
"Sie müssen sich an dieser Stelle keine Gedanken über den Minimierungsprozess des Maßes oder der Berechnung und Propagation der Unsicherheiten machen.\n",
"Diese Schritte werden für Sie im Hintergrund erledigt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Fit ausführen\n",
"fit.do_fit()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"8. Die `XYFit.report()` Methode gibt Ihnen ausführliche Informationen darüber, wie der Fit durchgelaufen ist. \n",
"Dieser Schritt ist optional aber sehr hilfreich, wenn Sie herausfinden wollen, warum Ihr Fit gerade nicht funktioniert hat."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Optional: Ausführlicher Bericht über den Fit\n",
"fit.report()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"9. Der letzte Schritt ist das Darstellen des Ergebnisses und ist auch optional.\n",
"Sie erzeugen hier ein `Plot` Objekt und übergeben den durchgelaufenen Fit. \n",
"Mit der `Plot.plot` Methode führen Sie die Darstellung des Ergebnisses aus.\n",
"An dieser Stelle können Sie viele visuelle Optionen übergeben, lesen Sie dazu auch gerne in der Dokumentation weiter."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Optional: Darstellung des Fits im kafe2 Stil\n",
"plot = Plot(fit)\n",
"plot.y_label = \"$y$\"\n",
"plot.x_label = \"$x$\"\n",
"plot.plot()\n",
"\n",
"plt.show()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Wiederholung (Güte der Anpassung):**
\n",
"In der grafischen Darstellung von `kafe2` und in der Ausgabe von `XYFit.do_fit()` finden Sie die Begriffe $\\chi^2/\\mathrm{ndf}$ (`gof/ndf`) und $\\chi^2\\ \\mathrm{probability}$ (`chi2_probability`).\n",
"Diese Größen geben Ihnen ein Maß, wie gut ihr Fit funktioniert hat und wie einfach Sie ihn mit einem anderen Datensatz aus der gleichen Grundmenge wiederholen können.\n",
"Dabei gelten folgende Faustregeln:\n",
"- $\\chi^2/\\mathrm{ndf}\\approx 1$ ($\\chi^2\\ \\mathrm{probability}\\sim 0.4$) ist ein sehr guter Fit.\n",
"- $\\chi^2/\\mathrm{ndf}\\ll 1$ ($\\chi^2\\ \\mathrm{probability}\\to 1$) das Modell hat sich sehr stark an die gegebenen Daten angepasst. Geben Sie andere Daten aus der gleichen Grundmenge dem Fit wieder, wird dieser kein gutes Ergebis erzielen können. Mögliche Lösungen:\n",
" - Vielleicht haben Sie die Unsicherheit zu groß geschätzt - Überprüfen Sie nochmal Ihre Berechnungen.\n",
" - Das Modell hat zu viele Freiheitsgrade und kann sich einzelnen Abweichungen anpassen. Wählen Sie ein einfacheres Modell.\n",
"- $\\chi^2/\\mathrm{ndf}\\gg 1$ ($\\chi^2\\ \\mathrm{probability}\\to 0$) das Modell kann die Daten nicht genügend beschreiben. Sie werden quasi keine Aussage können mit diesem Modell über die Daten treffen. Mögliche Lösungen:\n",
" - Vielleicht haben Sie die Unsicherheit zu klein geschätzt - Überprüfen Sie nochmal Ihre Berechnungen.\n",
" - Das Modell hat zu wenige Freiheitsgrade und kann sich den Daten nur schlecht anpassen. Wählen Sie ein anderes Modell."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Führen Sie die Parameterschätzung der Dämpfungskonstante $D$ der gemessenen Resonanzkurve aus [Aufgabe 1](#Aufgabe1) hier nochmal durch.\n",
"Verwenden Sie hierfür `kafe2`, indem Sie das Beispiel von oben an wenigen Stellen anpassen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Resonanzfunktion\n",
"def resonanz(eta, D):\n",
" return 1/np.sqrt((1 - eta*eta)**2 + (2*eta*D)**2)\n",
"\n",
"# Gemesse Datenpunkt\n",
"etam = np.array([0.10, 0.30, 0.50, 0.70, 0.90, 1.10, 1.30, 1.50, 1.70, 1.90, 2.10])\n",
"Am = np.array([0.97, 0.92, 1.12, 1.09, 1.36, 1.17, 0.76, 0.54, 0.47, 0.41, 0.36])\n",
"\n",
"# Absolute Unsicherheit auf die gemessene Amplitude\n",
"Aerr = 0.1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition des Fits\n",
"\n",
"# Hinzufügen der Fehler\n",
"\n",
"# Fit ausführen\n",
"\n",
"# Optional: Ausführlicher Bericht über den Fit\n",
"\n",
"# Darstellung des Fits im kafe2 Stil\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 3: Korrelation von Fit-Parametern \n",
"---\n",
"\n",
"In der Vorlesung haben Sie analytisch die Parameterschätzung für eine Ausgleichsgerade $\\lambda(\\mathbf{x};\\mathbf{a})=a_0+a_1 \\mathbf{x}$ ausgerechnet.\n",
"Im letzten Schritt ist Ihnen dabei aufgefallen, dass die Parameter $a_0$ und $a_1$ stark antikorreliert sind.\n",
"Sie können sich das veranschaulichen, indem Sie sich vorstellen, dass Sie die Gerade, die bei $x=0$ beginnt und zu positiven $x$ Werten läuft, an der Stelle $x=0$ festhalten und wie einen Stab bewegen können.\n",
"Wenn Sie nun die Steigung anpassen (den Stab also kippen), bewegt sich auch gleichzeitig der Ordniatenabschnitt (Ihre Hand), wenn Sie dieselben Datenpunkte durchlaufen möchten.\n",
"\n",
"\n",
"\n",
"Um dies näher zu studieren, schauen Sie sich in dieser Aufgabe eine grafische Darstellung der Korrelationen in Form von Kovarianz-Ellipsen an."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Lesen Sie Daten aus der Datei `data.txt` ein und fitten Sie eine Gerade der Form $\\lambda(\\mathbf{x};\\mathbf{a})=a_0+a_1 \\mathbf{x}$ an die Daten.\n",
"Beachten Sie dabei die Angabe der Unsicherheit der Messwerte in der Datei.\n",
"Stellen Sie die Kovarianz-Ellipse mithilfe von `kafe2` grafisch dar.\n",
"\n",
"**Hinweis:**
\n",
"Sie können zur Darstellung der Kovarianz-Ellipse die Methode `kafe2.ContoursProfiler()`, welche als Parameter das `XYFit` Objekt von `kafe2` benötigt, nutzen.\n",
"Das aus `ContoursProfiler` resultierende Objekt besitzt die `plot_profiles_contours_matrix()` Methode, mit der Sie das Ergebnis grafisch darstellen können."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from kafe2 import XYContainer, XYFit, Plot,ContoursProfiler"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition des einfachen linearen Modells\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Einlesen der Daten\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Durchführung des Fits\n",
"\n",
"\n",
"# Darstellen des Ergebnisses\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"In der Vorlesung wurde Ihnen auch direkt verraten, wie Sie diese Korrelation behandeln können: Sie verschieben die $x$ Werte um ihren Mittelwert: $\\epsilon(\\mathbf{x};\\mathbf{s})=s_0+s_1 (\\mathbf{x}-\\hat{x})$.\n",
"\n",
"**Arbeitsanweisung:**
\n",
"Führen Sie den Fit noch mal durch, verwenden Sie jedoch $\\epsilon(\\mathbf{x};\\mathbf{s})=s_0+s_1 (\\mathbf{x}-\\hat{x})$ als lineares Modell.\n",
"Betrachten Sie erneut die Kovarianz-Ellipse der freien Fitparameter.\n",
"Welche Korrelation der Parameter $s_0$ und $s_1$ beobachten Sie und warum?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Definition des neuen linearen Modells\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Durchführung des Fits\n",
"\n",
"\n",
"# Darstellen des Ergebnisses\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.12"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}