1
0
Fork 0
mirror of https://gitlab.rlp.net/pgp/pgp1-python-einfuehrung synced 2024-10-12 13:24:22 +00:00
pgp1-python-einfuehrung/Erweiterete_Musterloesung_Fitten_mit_der_Schiefenebene.ipynb

1804 lines
399 KiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Musterlösung:\n",
"\n",
"Die Musterlösugen der einzelnen Aufgaben befindet sich direkt in den entsprechenden Jupyter-Notebooks. In diesem Notebook wird auf einige beliebte Fehler so wie die Auswertungsaufgabe zum Thema Fitten eingegangen. \n",
"\n",
"## Fehlermeldungen in Python:\n",
"Einige von Ihnen sind bestimmt über ein paar Fehlermeldungen gestolpert und wussten nicht genau wie diese zu beheben sind. Im Grunde sind Fehlermeldungen in Python sehr einfach zu verstehen und es bedarf lediglich ein wenig Übung. Schauen wir uns zunächst einmal eine typische Fehlermeldung in Python an:\n",
"\n",
"<img src=\"images/ExampleTraceback.png\" alt=\"Tab-Taste\" width=\"1000\"/>\n",
"\n",
"Diese sieht erst einmal schrecklich kompliziert aus, die wichtigsten Informationen sind jedoch farbig hervorgehoben. Gehen wir diese doch einmal Schritt für Schritt durch:\n",
"\n",
"1. Art der Fehlermeldung. Meistens ist dies ein erster guter Indikator, wie der Fehler zustande gekommen ist.\n",
"2. Beschreibung des Fehlers, hier steht meistens etwas ausführlicher, was genau das Problem ist. Wir werde uns im Nachfolgenden noch ein paar Beispiele angucken.\n",
"3. Ort in Ihrem Hauptprogramm, an dem der Fehler aufgetreten ist.\n",
"4. Exakte Position, an welcher der Fehler aufgetreten ist. Dies kann gleich sein mit Punkt 3., sofern Ihre Funktion nicht innerhalb einer weiteren Funktion (hier `curve_fit`) verwendet wird. \n",
"\n",
"Der schwarz umrandete Teil kann bei sehr komplexen Funktionen sehr länglich ausfallen. In der Regel können wir dies jedoch ignorieren und uns nur auf den Anfang und das Ende der Fehlermeldung konzentrieren.\n",
"\n",
"### Beispiele:\n",
"\n",
"Im Folgenden werden ein paar beliebte Fehler vorgestellt. Führen Sie einfach die entsprechenden Zellen aus, um die Fehlermeldung zu sehen.\n",
"\n",
"Fangen wir einfach an:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'nicht_definiert' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_5876/3008136902.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnicht_definiert\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'nicht_definiert' is not defined"
]
}
],
"source": [
"nicht_definiert"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Diese Fehlermeldung ist relativ selbsterklärend. Der Fehlertyp ist ein `NameError` und der dazugehörige Fehlertext sagt uns, dass die Variable `nicht_definiert` noch nicht definiert wurde. \n",
"\n",
"Außerdem verrät uns Python, dass `nicht_definiert` in Zeile 1 unserer Zelle ausgeführt wird. Um die Zellennummerierung angezeigt zu bekommen, müssen Sie die Zelle anwählen und mit Esc in den Editiermodus wechseln. Nun können Sie mit dem Buchstaben \"L\" die Zeilennummerierung aktivieren. Dies kann bei längeren Code-Blöcken sehr hilfreich sein. \n",
"\n",
"Ein ähnlicher Fehler tritt auf, wenn man versucht, eine Funktion aus einem Package zu laden, welche nicht existiert. Zum Beispiel, weil man sich vertippt hat:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "module 'matplotlib.pyplot' has no attribute 'plott'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_5876/3467793535.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplott\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# vertippt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m: module 'matplotlib.pyplot' has no attribute 'plott'"
]
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.plott([1,2,3,4]) # vertippt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Da es sich hierbei jedoch um eine Funktion innerhalb eins Packages handelt, spricht man von einem `AttributeError` (Warum es sich um ein Attribut handelt lernt man ausführlicher in anderen Programmierveranstaltungen).\n",
"\n",
"Richtig wäre:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fb229fc4e50>]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot([1,2,3,4]) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ein weiterer beliebter Fehler ist der folgende:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "unexpected EOF while parsing (3139088544.py, line 3)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_5876/3139088544.py\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m [[1,a,b,4] # Beispiel verschachtelte Liste\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m unexpected EOF while parsing\n"
]
}
],
"source": [
"a = 1+1\n",
"b = 2\n",
"[[1,a,b,4] # Beispiel verschachtelte Liste"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bei diesem Fehler handelt es sich um einen Syntaxfehler, der besagt, dass Python das Ende Ihres Codes erreicht hat (end of file EOF), jedoch nicht alle Code-Blöcke abgeschlossen sind. In diesem konkreten Beispiel liegt es daran, dass wir vergessen haben, die Klammer der zweiten Liste zu schließen. Korrigiert sieht die Zelle wie folgt aus:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[1, 2, 2, 4]]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = 1+1\n",
"b = 2\n",
"[[1,a,b,4]] # Beispiel verschachtelte Liste"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dieser Fehler kann auch vorkommen, wenn man Code-Blöcke in for-Schleifen vergisst:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"ename": "IndentationError",
"evalue": "expected an indented block (2543293741.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_5876/2543293741.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m for i in range(4):\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
]
}
],
"source": [
"for i in range(4):"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Manche von Ihnen haben versehentlich einen Zeilenumbruch innerhalb eines string verwendet. Hier bekommt man eine ähnliche Fehlermeldung."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "EOL while scanning string literal (985735555.py, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_5876/985735555.py\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m print(\"String mit\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m EOL while scanning string literal\n"
]
}
],
"source": [
"print(\"String mit \n",
" Zeilenumbruch\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So wäre es richtig:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"String mit Zeilenumbruch\n"
]
}
],
"source": [
"print(\"String mit \" \n",
" \"Zeilenumbruch\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ein anderer Fehler, welcher mal leicht durch das überdefinieren von Variablen passieren kann, ist der folgende:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'list' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_5876/454878668.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mquadrat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mquadrat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: 'list' object is not callable"
]
}
],
"source": [
"def quadrat(x):\n",
" return x**2\n",
"\n",
"quadrat = [1**2, 2**2, 3**2]\n",
"\n",
"quadrat(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"oder"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'int' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_5876/2306426342.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mquadrat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mquadrat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: 'int' object is not callable"
]
}
],
"source": [
"quadrat = 2\n",
"quadrat(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bei dieser Art von Fehlern handelt es sich um einen TypeError. Ein TypeError besagt, dass ein Objekt (hier `quadrat`) nicht mit dem von Python erwartenden Typ übereinstimmt. In unserem obigen Beispiel erwarten wir ein Objekt vom Typ `callable`, was im Allgemeinen eine Funktion represntiert z.B. unsere Funktion:\n",
"\n",
"```python\n",
"def quadrat(x):\n",
" return x**2\n",
"```\n",
"\n",
"Leider haben wir diese jedoch versehentlich einmal mit einer Liste und einmal mit einem Integer überdefiniert. Python weiß hierdurch leider nicht, was `[1**2, 2**2, 3**2](3)` bzw. `3(3)` bedeuten soll. Versuchen Sie daher, eindeutige Variablennamen zu benutzen.\n",
"\n",
"Als Letztes hier noch ein Fehler, welcher Ihnen beim Plotten und Fitten unterlaufen kann:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "x and y must have same first dimension, but have shapes (4,) and (3,)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_5876/3379473311.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0myWerte\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxWerte\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0myWerte\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/.cache/pypoetry/virtualenvs/pgp1-python-einfuehrung-uZxcWp5O-py3.9/lib64/python3.9/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(scalex, scaley, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 3017\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0m_copy_docstring_and_deprecators\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mAxes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3018\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscalex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscaley\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3019\u001b[0;31m return gca().plot(\n\u001b[0m\u001b[1;32m 3020\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscalex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mscalex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscaley\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mscaley\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3021\u001b[0m **({\"data\": data} if data is not None else {}), **kwargs)\n",
"\u001b[0;32m~/.cache/pypoetry/virtualenvs/pgp1-python-einfuehrung-uZxcWp5O-py3.9/lib64/python3.9/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(self, scalex, scaley, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1603\u001b[0m \"\"\"\n\u001b[1;32m 1604\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmlines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mLine2D\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1605\u001b[0;31m \u001b[0mlines\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1606\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1607\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.cache/pypoetry/virtualenvs/pgp1-python-einfuehrung-uZxcWp5O-py3.9/lib64/python3.9/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 313\u001b[0m \u001b[0mthis\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 314\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 315\u001b[0;31m \u001b[0;32myield\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 316\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 317\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_next_color\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.cache/pypoetry/virtualenvs/pgp1-python-einfuehrung-uZxcWp5O-py3.9/lib64/python3.9/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[0;34m(self, tup, kwargs, return_kwargs)\u001b[0m\n\u001b[1;32m 499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 500\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 501\u001b[0;31m raise ValueError(f\"x and y must have same first dimension, but \"\n\u001b[0m\u001b[1;32m 502\u001b[0m f\"have shapes {x.shape} and {y.shape}\")\n\u001b[1;32m 503\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: x and y must have same first dimension, but have shapes (4,) and (3,)"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"xWerte = [1, 2, 3, 4]\n",
"yWerte = [1, 2, 4]\n",
"\n",
"plt.plot(xWerte, yWerte)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dieser Fehler besagt, dass die Liste für die x-Werte und die Liste für die y-Werte nicht die gleiche Länge haben. Dies kann leicht beim Abtippen von Messdaten passieren.\n",
"\n",
"Ich hoffe, dass diese Beispiele Ihnen helfen werden, in Zukunft besser mit Fehlermeldungen umzugehen. Hier noch drei allgemeine Tipps zum Programmieren und Fehlerbeheben in Jupyter-Notebooks:\n",
"\n",
"1. Wenn Sie Ihren Code schreiben, führen Sie nach jeder neuen Zeile/Funktion Ihren Code aus und überprüfen Sie, ob das Resultat mit Ihren Erwartungen übereinstimmt.\n",
"2. Sollten Sie eine Fehlermeldung bekommen und Sie sehen nicht genau, wie dieser Fehler zu beheben ist. Dann kopieren Sie Zeile für Zeile (bzw. Funktion) den Code in eine neue Zelle und führen Sie diesen aus. Meistens findet man hierdurch sehr schnell, wo das Problem liegt. \n",
"3. Da Sie in einem Notebook Zellen in willkürlicher Reihenfolge ausführen können, kann es leicht passieren, dass Sie Variablen überdefinieren. Sollten Sie also mal komplett verloren sein, dann kann es hilfreich sein, den Kernel neuzustarten, um alle Variablen zu löschen.\n",
" * Gehen Sie hierfür in der Menüleiste auf Kernel.\n",
" * Klicken Sie anschließend auf Restart.\n",
" * Anschließend müssen Sie erneut alle Zellen (in der richtigen Reihenfolge) ausführen."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lösungen zum Thema Fitten:\n",
"\n",
"In diesem Abschnitt wollen wir uns den Lösungen zum Thema Fitten widmen. Neben den Musterlösungen zu den Aufgaben befindet sich am Ende nochmal ein weiteres Beispiel zur Illustration.\n",
"\n",
"## Bestimmen der Fallbeschleunigung des Planeten X:\n",
"\n",
"\n",
"**Versuchsbeschreibung:**\n",
"Stellen Sie sich den folgenden Versuch vor: Jahr 2132, die Firma SpaceY hat Sie auf eine Außenmission auf den Planeten X geschickt. Hier sollen Sie zusammen mit Ihrem Versuchspartner die Fallbeschleunigung $g_X$ des Planeten bestimmen. Als Versuch lassen Sie eine Kugel aus unterschiedlichen Fallhöhen innerhalb einer evakuierten Glasröhre fallen. Sie lassen die Kugel insgesamt aus 10 unterschiedlichen Höhen Fallen.\n",
"\n",
"Basierend auf der Versuchsbeschreibung wissen wir, dass es sich bei dem Versuch um einen freien Fall handelt, welcher als eine gleichförmig beschleunigte Bewegung beschrieben werden kann. D.h. es liegt der folgende Zusammenhang zwischen den gemessenen Höhen und Fallzeiten vor:\n",
"\n",
"$$h(t, g) = 1/2 \\cdot g \\cdot t^2$$ \n",
"\n",
"### Aufgabenstellung:\n",
"\n",
"Bestimmen Sie mithilfe Ihrer Vorbereitungsaufgabe 1 und der entsprechenden Funktion die Fallbeschleunigung $g_X$ mittels eines $\\chi^2$-Fits. Diskutieren Sie anschließend mittels der Güte Ihres Fits, ob Ihre Fitfunktion die gemessenen Daten gut widerspiegelt. Auf welchem Planeten in unserem Sonnensystem befinden Sie sich?\n",
"Testen Sie anschließend, ob nicht ein linearerer Fit besser geeignet wäre. Begründen Sie Ihre Antwort."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:22.218156Z",
"start_time": "2020-08-26T06:33:19.532136Z"
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from scipy.optimize import curve_fit\n",
"height = [1, 1.2, 1.4, 1.6, 2, 2.2, 2.4, 2.6, 2.8] # in m\n",
"dheight = [0.01]*len(height) # in m\n",
"time = [0.74, 0.8, 0.87, 0.94, 1.03, 1.1, 1.15, 1.17, 1.24] # in s\n",
"dtime = [12, 11, 9, 8, 11, 12, 13, 80, 10] # in ms\n",
"\n",
"# Achtung: Zeitfehler in s umrechnen, da in ms angegeben.\n",
"dtime = [i/1000 for i in dtime]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Beim Fitten von Messdaten versuchen wir immer eine Funktion $y$ \n",
"\n",
"$$y(x, p1, p2, p3) = ... $$\n",
"\n",
"mit den Parameter $p_i$ an unsere Messdaten anzupassen. Genau nach diesem Schema muss man auch die Funktion in Python definieren:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def fallhoehe(t, g):\n",
" return 0.5 * g * t**2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ein paar von Ihnen haben leider die Funktion als $h(g, t)$ oder $g(t, h)$ definiert statt $h(t, g)$. Dies funktioniert leider nicht."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Anschließend können wir uns die Daten erstmal angucken:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:22.513340Z",
"start_time": "2020-08-26T06:33:22.220084Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plotten der Messdaten:\n",
"plt.figure(dpi=100)\n",
"plt.errorbar(time, \n",
" height, \n",
" xerr=dtime, \n",
" yerr=dheight, \n",
" ls='', \n",
" marker='.')\n",
"\n",
"plt.xlabel('Zeit [s]')\n",
"plt.ylabel('Fallhöhe [m]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die Messdaten sehen bereits leicht parabelförmig aus. Als Nächstes wollen wir unser Model `fallhoehe` an unsere Daten fitten:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:24.562437Z",
"start_time": "2020-08-26T06:33:24.550504Z"
}
},
"outputs": [],
"source": [
"para, pcov = curve_fit(fallhoehe, \n",
" time,\n",
" height,\n",
" sigma=dheight,\n",
" absolute_sigma=True\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Der Fit hat funktioniert. Gucken wir uns also doch mal die Fitgüte und den Wert für $g$ an:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:25.833057Z",
"start_time": "2020-08-26T06:33:25.823083Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Das die Fitgüte Chi²/ndof lautet 127.31/8\n",
"und der Wert für g ist 3.69 +/- 0.00 m/s\n",
"\n"
]
}
],
"source": [
"chi = sum([(fallhoehe(t, para[0]) - h)**2/dh**2 for t, h, dh in zip(time, height, dheight)])\n",
"\n",
"print(f'''\n",
2021-09-01 21:15:12 +00:00
"Das die Fitgüte Chi²/ndof lautet {chi:.2f}/{len(height) - 1}\n",
"und der Wert für g ist {para[0]:.2f} +/- {pcov[0,0]:.2f} m/s\n",
"''')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unser $\\chi^2$/ndof (wobei ndof die Anzahl der Freiheitsgrade ist) ist nicht schlecht. Darüber hinaus scheint der Fehler des Wertes kleiner zu sein als die Anazahl an signifikanten Stellen, die uns zur Verfügung stehen. \n",
"\n",
"Als Zweites sollen wir das Ganze nochmal wiederholen, um zu testen, ob ein linearer Fit nicht besser an die Daten passt."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:27.412181Z",
"start_time": "2020-08-26T06:33:27.398218Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Das die Fitgüte Chi²/ndof lautet 236.44/7\n",
"und der Wert für g ist 3.63 +/- 0.00 m/s\n",
"\n"
]
}
],
"source": [
"def fallhoehe2(t, v, h0):\n",
" return t * v + h0\n",
"\n",
"para2, pcov2 = curve_fit(fallhoehe2, \n",
" time,\n",
" height,\n",
" sigma=dheight,\n",
" absolute_sigma=True\n",
" )\n",
"\n",
"chi = sum([(fallhoehe2(t, para2[0], para2[1]) - h)**2/dh**2 for t, h, dh in zip(time, height, dheight)])\n",
"\n",
"print(f'''\n",
2021-09-01 21:15:12 +00:00
"Das die Fitgüte Chi²/ndof lautet {chi:.2f}/{len(height) - 2}\n",
"und der Wert für g ist {para2[0]:.2f} +/- {pcov2[0,0]:.2f} m/s\n",
"''')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hier ist das $\\chi^2$ wesentlich schlechter und somit ist die Hypothese, dass es sich um ein lineares Model handeln könnte, abgelehnt. Zuletzt können wir noch unsere beiden Ergebnisse gemeinsam mit den Daten plotten:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:29.443916Z",
"start_time": "2020-08-26T06:33:29.222481Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plotten der Messdaten:\n",
"plt.figure(dpi=100)\n",
"plt.errorbar(time, \n",
" height, \n",
" xerr=dtime, \n",
" yerr=dheight, \n",
" ls='', \n",
" marker='.')\n",
"\n",
"times2 = [i/100 for i in range(70, 130)]\n",
"\n",
"plt.plot(times2, \n",
" [fallhoehe(t, para[0]) for t in times2],\n",
" label='Gleichförmig Beschleunigte Bewegung')\n",
"\n",
"plt.plot(times2, \n",
" [fallhoehe2(t, para2[0], para2[1]) for t in times2],\n",
" label='Bewegung konstanter Geschwindigkeit')\n",
"\n",
"plt.legend()\n",
"plt.xlabel('Zeit [s]')\n",
"plt.ylabel('Fallhöhe [m]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Zusatz:\n",
"\n",
"Wie wir bereits am Versuchstag selbst festgestellt haben, können bei einem einfachen $\\chi^2$-Fit lediglich die Fehler des Funktionswertes berücksichtigt werden. Da in unseren obigen Messdaten der Zeitfehler dominiert, wollen wir uns angucken, was passiert, wenn wir die beiden Achsen vertauschen. D.h. dieses mal wollen wir eine Funktion $t(h, g)$ an unsere Messdaten anpassen:\n",
"\n",
"$$t(h, g) = \\sqrt{2 \\cdot h/g}$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Gucken wir uns zunächst wieder die Messdaten an:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:37.852532Z",
"start_time": "2020-08-26T06:33:37.655061Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plotten der Messdaten:\n",
"plt.figure(dpi=100)\n",
"plt.errorbar(height, \n",
" time, \n",
" xerr=dheight, \n",
" yerr=dtime, \n",
" ls='', \n",
" marker='.')\n",
"\n",
"plt.xlabel('Fallhöhe [m]')\n",
"plt.ylabel('Fallzeit [s]')\n",
"plt.grid()\n",
"plt.show()\n",
"\n",
"def fallzeit(h, g):\n",
" return (2 * h/g)**0.5"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:39.764472Z",
"start_time": "2020-08-26T06:33:39.757481Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Das die Fitgüte Chi²/ndof lautet 4.17/8\n",
"und der Wert für g ist 3.67 +/- 0.00 m/s\n",
"\n"
]
}
],
"source": [
"parat, pcovt = curve_fit(fallzeit, \n",
" height,\n",
" time,\n",
" sigma=dtime,\n",
" absolute_sigma=True\n",
" )\n",
"\n",
"chit = sum([(fallzeit(h, para[0]) - t)**2/dt**2 for t, h, dt in zip(time, height, dtime)])\n",
"\n",
"print(f'''\n",
2021-09-01 21:15:12 +00:00
"Das die Fitgüte Chi²/ndof lautet {chit:.2f}/{len(height) - 1}\n",
"und der Wert für g ist {parat[0]:.2f} +/- {pcovt[0,0]:.2f} m/s\n",
"''')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Jetzt sind die Werte für $g$ fast identisch mit den Werten des vorherigen Fits, jedoch sieht das $\\chi^2$ dieses mal aufgrund der größeren Fehler besser aus. Dies spricht dafür, dass die Fehler von der Fallhöhe unterschätzt worden sind."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:33:48.115891Z",
"start_time": "2020-08-26T06:33:47.902422Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAFtCAYAAABFgxP/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJ3klEQVR4nO3dd3xUVfrH8c+TTiAJIiBBCEWKIjYsK6g0pdgRVBQbutZV18baEVAULKurP3vFdUV0WcUCimABFMSOBbFQBAQEBBIgCZlkzu+PO4lJCCEJM7mZyff9euXFnDPn3vscbpJ5cu+555hzDhEREZFwivM7ABEREYk9SjBEREQk7JRgiIiISNgpwRAREZGwU4IhIiIiYacEQ0RERMJOCYaIiIiEnRIMERERCbsEvwOobWZmQEtgs9+xiIiIRKE0YJXbyUyd9S7BwEsuVvodhIiISBRrBfxWWYP6mGBsBlixYgXp6elh33kgEODdd9+lf//+JCYmhn3/flLfolcs9099i16x3L9Y7VtOTg6tW7eGKtwFqI8JBgDp6ekRSzBSU1NJT0+PqW8qUN+iWSz3T32LXrHcv1juW1VpkKeIiIiEnRIMERERCTslGCIiIhJ29XYMRmWccxQWFlJUVFTtbQOBAAkJCeTn59do+7osFvuWmJhIfHy832GIiMQcJRjlFBQUsHr1anJzc2u0vXOOFi1asGLFCrwpN2JHLPbNzGjVqhXJycl+hyIiElOUYJQSDAZZunQp8fHxtGzZkqSkpGp/kAaDQbZs2UKjRo2Ii4utO1Cx1jfnHOvWrWPlypW0bdvW73BERGKKEoxSCgoKCAaDtG7dmtTU1BrtIxgMUlBQQEpKSkx8CJcWi31r1qwZy5Yto7Cw0O9QRERiSmx8SoRZrHx4ys4VX6HayYy3IiJSTfokFRERkbBTgiEiIhJrgkH4/jWYcAIUbPUlBCUY9cDIkSO5+OKLS8q9e/fm6quvjvhx33nnHQ488ECCwWDEjyUiIoBzsGgqPHEU/Hc4LJsDnz/rSyhKMGLEjpKGNWvW8OCDD3LLLbfUekwDBw4kMTGRF198sdaPLSJSrzgHP8+Ap/rApGHw+3eQnA69boRu5/oSkp4iiXFPP/00PXr0oE2bNr4cf/jw4Tz00EOcc845vhxfRCTmLZkFH9wJK+Z75cSG8JdLoMeVkNrEt7B0BWNnnPPuX1XnK5Bb/W0q+qrikw3Dhw9n1qxZPPjgg5gZZsayZcsAmDRpEieeeOJ22wSDQa6//nqaNGlCixYtGD16dLX/a9544w06duxISkoKffr04fnnn8fM2LRpU0mbE088kc8//5zFixdXe/8iIlKJX+d5Yyz+fZKXXCSkQPcr4KoFcMwoX5ML0BWMnQvkwl0tq9w8DmgcrmPfvAqSGu602YMPPshPP/1E165duf322wFvfocNGzawcOFCDjnkkO22ef7557n22muZP38+8+bNY/jw4RxxxBH069evSqEtXbqUU089lauuuooLL7yQr776ihEjRmzXLisriz322IM5c+aw1157VWnfIiI1lVtQSJfbpgOw8PYBpCbV7Y+5GsW78gv4YCwsft8rxyfBwcPhyGshPTNywVZT3f6flyrJyMggKSmJ1NRUWrRoUVK/fPlynHO0bLl9grT//vszatQoADp27MjDDz/Me++9V+UE44knnqBz587ce++9AHTu3JnvvvuOO++8c7u2LVu25Ndff61J10REpNjqBfDBXfDTO145LgEOOhuOGgGNW/sbWwWUYOxMYqp3JaGKgsEgOZs3k56WtusTdiXWbDbRYnl5eQCkpKRs997+++9fppyZmcnatWurvO8ff/yRQw89tEzdYYcdVmHbBg0a1HhtFxGRem/tD15i8cMbXtniYP8zoNf10KSdv7FVQgnGzphV6TZFiWAQEou8bXyeEbRp06YAbNy4kWbNmpV5LzExsUzZzCL2OOmGDRu2O76IiJS1Jjuf9s0a/Vmx/hf4cBx89z/AAQZdh0DvG6FpR7/CrDIN8owRSUlJ2y2hvtdee5Gens7ChQvDfrzOnTvz+eefl6n77LPPtmuXn5/P4sWLOeigg8Ieg4hItJs4f3nJ62Pun8XLny2HDUvhtcvgkUPhu8mAg31OgsvmwqnPREVyAUowYkbbtm2ZP38+y5YtY/369QSDQeLi4jjmmGP46KOPwn68Sy65hEWLFnHDDTfw008/8corrzBhwgSAMivQfvLJJyQnJ9O9e/ewxyAiEs1WZ+cxduoPJeWgg5v/9w2rH+oHCyaCC0KngXDJbBj6AuzRxcdoq08JRowYMWIE8fHxdOnShWbNmrF8uZcVX3jhhUyaNKnatz+GDx9O7969d/h+u3btmDx5Mq+++ir7778/jz32WMlkXsnJySXtXnrpJc4666war04rIhKrlq7ffgrvIoxlRU1hr75w4Xsw7GXIPMCH6HadxmDEiE6dOjFv3rzt6gcOHEjLli15+eWXOfPMMwH48MMPt2s3ZcqUMuWlS5fSp0+fSo950kkncdJJJ5WU77zzTlq1alUyqHT9+vVMnjx5u1spIiIC7RoGiMMR5M+rvvEEaXvGP2HfI3yMLDx0BSPGmRlPPvkkhYWFVd4mOzubxYsXVzivRWmPPvoon332GUuWLOGFF17g3nvv5bzzzit5f9myZTz66KO0a1d3RzmLiNS6/Bz48G4ynzuMcQlPEY83fi7O4K7BB5AZA8kF6ApGvXDggQdy4IEHVrl9RkYGK1eu3Gm7n3/+mbFjx7JhwwaysrK47rrruOmmm0reP+SQQyqc5EtEpF4K5MFnT8Oc+yFvAwCntVzPlBU/MM/ty8xre5d9iiTKKcGQGnvggQd44IEH/A5DRKRuKyyAr16A2ffC5tVe3e4doM8t5Hc8gXmjZgDQImP7OYuimRIMERGRSHBB7NtXYPbdsCk0m3FGa28ei/3PgPgEUoFl44/3NcxIUYIhIiISTs5hi96iz6JbSPj6N6+uYXPoOcJbMyQhudLNY4USDBERkXBwDha/B+/dQcLqr0kHXEpj7IirvOXTqzMrdAxQgiEiIrKrfp0H798Bv34MgEtsyE9Njqb92Q+QmNbU5+D8oQQjQnILCuk62hu4Ew1LBouISA2s+hreHwu/eL/viU+GQy+k8PArWDTrM9qnZPganp/0qScRZ2a89tprDBo0yO9QRETCY92P8MGdsPB1r2zx0O0c6Hk9ZOwJgYC/8dUBmmgrRgwfPhwz49JLL93uvcsvvxwzY/jw4bUfWA2MHj26WvN2iIjUmo3LvIXIHj08lFwY7Hc6XPEZnPigl1wIoAQjprRu3ZpJkyaRl5dXUpefn8/EiRPJysryMTIRkSi3+XeYOgL+75A/FyLb+wRvhdMhT8Hue/kdYZ2jBKMWrMnOr5XjdOvWjdatW/Pqq6+W1L366qtkZWWVWS49GAwybtw42rVrR4MGDTjggAOYPHlyyfsbN27krLPOolmzZjRo0ICOHTvy3HPPAVBQUMCVV15JZmYmKSkptGnThnHjxpVs+/PPP9OzZ09SUlLo0qULM2bM2C7OG264gU6dOpGamkr79u0ZOXIkgdDlxAkTJjBmzBgWLFiAmWFmJau0btq0iQsvvJBmzZqRnp5O3759WbBgQcl+i698vPDCC7Rt25aMjAzOOOMMNm/eHJ7/YBGpf/I2wXu3w0MHwmdPQTAA7fvAhe/DGS9G3QqntUljMMIgt+DPdT6CwSB5BUW89c2Kkrpj7p/FmJP2ZcjBrcpsF4mBnxdccAHPPfccZ511FgDPPvss559/fpkFzsaNG8d//vMfHn/8cTp27Mjs2bM5++yzadasGb169WLkyJEsXLiQt99+m6ZNm/LLL7+UXBV54oknePPNN3nllVfIyspixYoVrFixoqTvgwcPZo899mD+/PlkZ2dz9dVXbxdjWloaEyZMoGXLlnz77bdcdNFFpKWlcf311zN06FC+++473nnnHWbOnAl4U5cDnHbaaTRo0IC3336bjIwMnnjiCY4++mh++uknmjRpAsDixYuZMmUKb731Fhs3buT0009n/Pjx3HnnnWH
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(dpi=100)\n",
"plt.errorbar(height, \n",
" time, \n",
" xerr=dheight, \n",
" yerr=dtime, \n",
" ls='', \n",
" marker='.',\n",
" label='Messdaten')\n",
"\n",
"x = [i/10 for i in range(10, 30)]\n",
"\n",
"plt.plot(x, \n",
" [fallzeit(i, parat[0]) for i in x],\n",
" label='t(h, g)')\n",
"\n",
"plt.legend()\n",
"plt.xlabel('Fallhöhe [m]')\n",
"plt.ylabel('Fallzeit [s]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bestimmen der Erdbeschleunigung mittels curve_fit und einer schiefen Ebene:\n",
"\n",
"Der Zusammenhang der zurückgelegten Strecke $s$ einer Vollkugel auf einer schiefen Ebene ist gegeben durch:\n",
"\n",
"$$s(t) = \\frac{5}{14} \\cdot g \\cdot \\sin(\\alpha) \\cdot t^2$$\n",
"\n",
"Während des Versuchs wurden jedoch die Startfallhöhe $h$ und die benötigte Zeit $t_\\text{i}$ gemessen (wobei $i$ der Index für die drei Messversuche ist.). Dies bedeutet, dass wir unsere obige Formel in Abhängigkeit dieser beiden Parameter ausdrücken müssen, um $g$ mittels eines Fits bestimmen zu können. Das können wir erreichen, indem wir den folgenden Zusammenhang verwenden:\n",
"\n",
"$$\\sin(\\alpha) = \\frac{h}{l}$$\n",
"\n",
"wobei $l$ die Länge unserer schiefen Ebene ist. Setzen wir dies in unsere obige Formel ein und lösen die Gleichung nach $h$ auf, dann erhalten wir:\n",
"\n",
"$$h = \\frac{14 \\cdot l^2}{5} \\cdot \\frac{1}{g} \\cdot \\frac{1}{t_\\text{i}^2}$$\n",
"\n",
"wobei wir hier noch verwendet haben, dass die maximal zurückgelegte Strecke der Kugel nach einer Zeit $t_\\text{i}$ der Gesammtlänge der schiefen Ebene entspricht. Diese Formel für $h$ können wir nun auf unterschiedliche Arten und Weisen in Abhängigkeit der Zeit setzen, wobei die bereits gezeigte Variante die erste ist:\n",
"\n",
"**Variante 2. Parabel:**\n",
"$$h(x=\\frac{1}{t_\\text{i}}) = \\frac{14 \\cdot l^2}{5} \\cdot \\frac{1}{g} \\cdot x^2$$\n",
"\n",
"**Variante 3. Ursprungsgerade:**\n",
"$$h(x=\\frac{1}{t_\\text{i}^2}) = \\frac{14 \\cdot l^2}{5} \\cdot \\frac{1}{g} \\cdot x$$\n",
"\n",
"\n",
"Da die erste Variante von uns am wenigsten Arbeit verlangt, werden wir im folgenden diese Verwenden.\n",
"\n",
"Die Messwerte sollten so oder so ähnlich aussehen. Es wurden für verschiedene Fallhöhen jeweils dreimal die Zeit gemessen:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:01.100071Z",
"start_time": "2020-08-26T06:35:01.090098Z"
}
},
"outputs": [],
"source": [
"# Eingelesene Messwerte:\n",
"h = [0.095, 0.112, 0.134, 0.148, 0.17, 0.188, 0.21, 0.235, 0.25, 0.276] # [m]\n",
"t1 = [2.65, 2.4, 2.17, 2.06, 1.91, 1.8, 1.68, 1.6, 1.52, 1.46] # [s]\n",
"t2 = [2.71, 2.36, 2.19, 2.06, 1.9, 1.78, 1.69, 1.69, 1.53, 1.44] # [s]\n",
"t3 = [2.66, 2.36, 2.19, 2.06, 1.9, 1.8, 1.68, 1.59, 1.52, 1.44] # [s]\n",
"delta_t = [0.1]*len(h) # [s]\n",
"delta_h = [0.005]*len(h) # [m]\n",
"\n",
"l = 1.507 # [m]\n",
"delta_l = 0.005 # [m]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun müssen wir uns unsere Formel definieren, um unsere Messdaten fitten zu können. Hierbei ist es wichtig, dass eine Fitfunktion $\\lambda$ von dieser Form ist $\\lambda(x, \\Theta)$, woebei $\\Theta$ unsere Parameter sind. In unserem Fall entspricht dies einer Funktion $h(t, g)$ bzw. in den anderen beiden Varianten $h(x, g)$ wobei $x=1/t$ und $x=1/t^2$ in den Varianten 2 und 3 ist."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:12.883418Z",
"start_time": "2020-08-26T06:35:12.878431Z"
}
},
"outputs": [],
"source": [
"def fallhoehe(t, g):\n",
" l = 1.507\n",
" return 14/5 *l**2 * 1/g * 1/t**2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Als nächstes sollten wir zu jeder Fallhöhe den Mittelwert unserer drei Zeitmessungen bilden und den entsprechenden Fehler berechnen. Hierdurch erhalten wir ein genaueres Ergebnis für die gesuchte Zahl von $g$.\n",
"\n",
"D.h. wir müssen uns zunächst eine Funktion definieren, welche den Mittelwert für die Messwerte berechnet\n",
"\n",
"$$\\bar{x} = \\frac{1}{n} \\sum_i^n x_i$$\n",
"\n",
"sowie dessen Standardabweichung\n",
"\n",
"$$\\sigma_\\text{n-1} = \\sqrt{\\frac{1}{n-1} \\sum_\\text{i}^\\text{n} (\\bar{x} - x_\\text{i})^2}$$"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:17.670513Z",
"start_time": "2020-08-26T06:35:17.662534Z"
}
},
"outputs": [],
"source": [
"# Mittelwert:\n",
"def mittelwert(l1, l2, l3):\n",
" '''\n",
" Funktion, welche den Mittelwert für drei Messspalten \n",
" berechnet.\n",
" '''\n",
" result = []\n",
" for i,j,k in zip(l1, l2, l3):\n",
" result.append((i + j + k)/3)\n",
" \n",
" return result\n",
"\n",
"# Standardabweichung\n",
"def standardabweichung(l1, l2, l3):\n",
" '''\n",
" Funktion, welche die Standardabweichung für drei Messspalten \n",
" berechnet. \n",
" '''\n",
" mean = mittelwert(l1, l2, l3) # <-- hier rufen wir unsere Funktion des \n",
" # Mittelwertes in einer weiteren Funktion\n",
" # auf.\n",
" result = []\n",
" for m, i,j,k in zip(mean, l1, l2, l3):\n",
" result.append( (1/2 *(m-i)**2 + (m-j)**2 + (m-k)**2 )**(1/2))\n",
" \n",
" return result\n",
" \n",
"t_mean = mittelwert(t1, t2, t3)\n",
"t_std = standardabweichung(t1, t2, t3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun können wir unsere Messwerte plotten:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:20.098903Z",
"start_time": "2020-08-26T06:35:20.094915Z"
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:20.926337Z",
"start_time": "2020-08-26T06:35:20.456594Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEKCAYAAAA4t9PUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAo30lEQVR4nO3de5zVdb3v8ddbHB2USVETSYzL1rykBc2o2EWhNLGOaI8kYG9T23loZ3Y9dtLTediO2udkdtM2Jpw22y4WpnahxO0uY7QT4MFRlItahGJDlJdAZoTBGeZz/vj9oMWw1sxas2bWWj/m/Xw81mN+v+/v9l4Daz7rd/0qIjAzM+uvA6odwMzMss2FxMzMyuJCYmZmZXEhMTOzsriQmJlZWVxIzMysLAdWO0A1HHXUUTFu3Li8015++WUOPfTQygYaIFnODtnOn+XskO38Wc4O2cnf0tLyQkS8Ot+0IVlIxo0bx8MPP5x3WnNzM1OmTKlsoAGS5eyQ7fxZzg7Zzp/l7JCd/JI2FprmQ1tmZlYWFxIzMyuLC4mZmZVlSJ4jMbPydHZ20traSkdHR7WjcNhhh/HEE09UO0a/1Vr++vp6xowZQ11dXdHLuJCYWclaW1tpaGhg3LhxSKpqlra2NhoaGqqaoRy1lD8iePHFF2ltbWX8+PFFL+dDW2ZWso6ODo488siqFxEbWJI48sgjS97TdCExs34ptYjMnL+cmfOXD1IaGyj9+XLgQtJP/lCYVdewYcOYOHEiZ555JhdeeCFbt27tdf4rrriCu+66C4ApU6YUvJesN9dffz2/+tWvAPjGN77B9u3b95nn85//PNddd91ebatWreLkk08uOduIESNKzliKf/7nf+YrX/lK2etxITGzTBo+fDirVq3ioYce4ogjjmDevHmDvs25c+dy7rnnAoULyezZs7njjjv2alu0aBGzZ88e9HzV4kJiZhXR1tHJpq07aNm4ZcDXfdZZZ7Fp0yYg+fY/efJk3vCGN/Ce97yHLVsKb2/x4sVMnDiRiRMncuKJJ+45wdzS0sI555xDY2Mj559/Pps3bwb+tudw880386c//YmpU6cyderUvdb5ute9jpEjR/LQQw/tafvRj37E7NmzS8qW64UXXuCss87innvu2Wcv4tRTT+WZZ54B4Atf+AInnngib33rW5k9e/ae+f7whz8wbdo0Ghsbedvb3saTTz5Z1HaLVdFCImmapKckrZd0bZ7pn5K0TtLjku6XNDZtnyppVc6rQ9LF6bTbJD2dM21iJd+TmeW3+/DvzPnLeddND7JucxutW3Yw49ZlvOumBwfs8PCuXbu4//77mT59OgCXXXYZN9xwA48//jinnXYan//85wsuO336dFatWsWqVat44xvfyDXXXENnZycf/ehHueuuu2hpaeEf//Ef+exnP7vXch/72Md4zWtew9KlS1m6dOk+6509ezaLFi0CYMWKFRxxxBGccMIJJWXb7S9/+Qvvfve7mTt3Lu9+97sLzrdy5UruvvtuHnvsMe699969Dt3NmTOHb37zm7S0tPCVr3yFq666qs/tlqJil/9KGgbMA84DWoGVkhZHxLqc2R4FmiJiu6QPA18GZkbEUmBiup4jgPXAf+Ys9+mIuKsCb2OPto5OtnV00bJxC41jR1Zy02aZs62ja89wdyTjDfXF36eQz44dO5g4cSKtra2ccsopnHfeebz00kts3bqVc845B4DLL7+cGTNm9LmuL3/5ywwfPpyPfOQjrFmzhjVr1nDeeecBSaEaPXp0SdlmzpzJm9/8Zr761a/uOazVn2ydnZ284x3vYN68eXuWK+S3v/0tF110EfX19dTX13PhhRcC0N7ezrJly/ba1s6dO0t6P32p5H0kZwDrI2IDgKRFwEXAnkKSFozdVgCX5lnPJcC9EbHvwckKmDl/OW0dnazb3AbAjFuXcdIxDSz5+NnViGNWs+740Fl7hls2bmHGrcvoDqivO4CbZk0q+wvY7nMkf/nLX7jkkkuYN28el19+ecnr+dWvfsWdd97Jgw8+CCT3Urz+9a9n+fL+7y0dd9xxjB8/ngceeIC777673+s68MADaWxs5L777ttTSA488EC6u7v3zNPXpbrd3d0cfvjhrFq1ql8ZilHJQ1vHAn/MGW9N2wr5IHBvnvZZwA97tP1Lejjs65IOLi9m3/J9uzKzwhrHjuSkYxoYM3I4t185eUD34g855BBuvvlmvvrVr3LooYcycuRIfvOb3wDwve99r9dv8hs3buQjH/kId955J8OHDwfgxBNP5Pnnn9/zx7+zs5O1a9fus2xDQwNtbW0F1z179mw++clPMmHCBMaMGcNhhx1WUjZILsVduHAhTz75JDfccAOQPL38kUceAeCRRx7h6aefBuAtb3kLP//5z+no6KC9vZ1f/OIXALzqVa9i/Pjx3HnnnUBSKB977LFet1uqmryzXdKlQBNwTo/20cBpwH05zdcBfwYOAhYAnwHm5lnnHGAOwKhRo2hubs677fb29oLTAD58IqzfEvzLQxDAQQfAFa+LXpeplL6y17os589ydig9/2GHHdbrH9F8Dqk7gEPqDuJ1RxxY8rKFtLW1sWvXLo4//nhOOeUUFi5cyC233MInPvEJduzYwbhx47jllltoa2ujs7OTHTt27Fnm5Zdf5sc//jEvvPDCnvMrxxxzDHfffTff+c53uOaaa9i2bRtdXV1cddVVvPa1r91rHZdddhnvfOc7GT16NPfcc88+2S644AI+9rGPceONN+55v/my7dq1K2+23cts376dBQsWMHPmTOrq6rj00ktZuHAhJ598Mk1NTRx//PG0t7dz0kkncf7553Pqqady9NFHc/LJJ3PwwQfT1tbG/Pnz+eQnP8ncuXPp7Ozkve99LxMmTGDnzp3U1dXt8+/R0dFR2v/niKjICzgLuC9n/DrgujzznQs8ARydZ9rHgQW9bGMK8Iu+sjQ2NkYhS5cuLTgt1wXfeCDe8qX74+Fn/lrU/JVQbPZaleX8Wc4eUXr+devWlbyN9926LN5367KSl+vLtm3bBnydlTSQ+dva2iIi4uWXX47GxsZoaWnp13ry/fsCD0eBv6mV3CNZCZwgaTywieQQ1d/nziBpEjAfmBYRz+VZx2ySApS7zOiI2KzkdsyLgTWDkH0fDfV1NNTX+US7WZFyz5nY4JgzZw7r1q2jo6ODyy+/nDe96U0V2W7FCklEdEm6muSw1DBgYUSslTSXpNItBm4ERgB3prfpPxsR0wEkjQOOAx7oserbJb0aELAK+KcKvB0zs5rzgx/8oCrbreg5kohYAizp0XZ9zvC5vSz7DHlOzkfE2wcwYtH87crMLOE7282sX5LD5ra/6c+/qwuJmZWsvr6eF1980cVkPxNpfyT19fUlLVeTl/+aWW0bM2YMra2tPP/889WOQkdHR8l/+GpJreXf3UNiKVxIzKxkdXV1JfWgN5iam5uZNGlStWP0W9bzgw9tmZlZmVxIzMysLC4kZmZWFhcSMzMriwuJmZmVxYXEzMzK4kJiZmZlcSExM7OyuJCYmVlZXEjMzKwsLiRmZlYWF5Iqmzl/OTPnL692DDOzfnMhMTOzslS0kEiaJukpSeslXZtn+qckrZP0uKT7JY3NmbZL0qr0tTinfbykh9J13iHpoEq9HzMzq2AhkTQMmAdcAJwCzJZ0So/ZHgWaIuINwF3Al3Om7YiIielrek77DcDXI+J4YAvwwUF7E2Zmto9K7pGcAayPiA0R8QqwCLgod4aIWBoR29PRFUCvvatIEvB2kqID8B3g4oEMPdjaOjrZtHUHLRu3VDuKmVm/VLKQHAv8MWe8NW0r5IPAvTnj9ZIelrRC0sVp25HA1ojoKnKdNeVdNz3Ius1ttG7ZwYxbl7mYmFkm1WQPiZIuBZqAc3Kax0bEJkkTgF9LWg28VMI65wBzAEaNGkVzc3Pe+drb2wtOG2jPbdm+Z7g74Ie/Wknb3/X/FE8lsw+GLOfPcnbIdv4sZ4fs54fKFpJNwHE542PStr1IOhf4LHBOROzc3R4Rm9KfGyQ1A5OAu4HDJR2Y7pXkXWe63AJ
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.errorbar(t_mean, \n",
" h, \n",
" xerr=t_std,\n",
" yerr=delta_h,\n",
" ls='',\n",
" marker='.',\n",
" label='Rollzeit Vollkugel')\n",
"\n",
"plt.grid()\n",
"plt.xlabel('Gemessene Rollzeit $t$ [s]')\n",
"plt.ylabel('Starthöhe $h$ [m]')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Man kann anhand des Plots bereits schön den nicht linearen Zusammenhang zwischen der Starthöhe $h$ und der Rollzeit $t$ erkennen. Als Nächstes wollen wir nun aus diesen Daten unsere Erdbeschleunigung $g$ bestimmen. Hierzu verwenden wir wieder unsere Funktion `curve_fit`. Im folgenden wird jedoch nochmal anhand dieses Datensatzes illustriert, was `curve_fit` genau macht. Hierzu gucken wir uns die nachfolgenden Plots an (ignoriert zunächst einmal den Code)."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:35:34.756775Z",
"start_time": "2020-08-26T06:35:33.818248Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEOCAYAAACaQSCZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA6H0lEQVR4nO3dd3hVVfbw8e9KCIQSIYQASq+hCwakCQZFBRsWEFBHZFTEMuo444y+4zhj+1lm7IMCKnZFEccBxXEUjaIUAUWQpoDSBEsIkACBhKz3j30SLiHl3JR7by7r8zznyT1ln7M20bty2tqiqhhjjDFliQl3AMYYY6oHSxjGGGN8sYRhjDHGF0sYxhhjfLGEYYwxxhdLGMYYY3wJacIQkWEislZE1onIraVsd6GIqIj0Dlh2m9durYicEZqIjTHGFKgRqgOJSCwwCTgN2AIsFpFZqrqqyHYJwI3AooBlXYAxQFfgOOBDEemoqgdDFb8xxhztQnmGcSKwTlU3qOoBYDowopjt7gYeAHIClo0ApqvqflX9Hljn7c8YY0yIhDJhNAM2B8xv8ZYVEpETgBaq+m6wbY0xxlStkF2SKouIxAAPA5dXYB8TgAkA8fHxqS1btqyc4CJAfn4+MTHR8YxCNPUFoqs/0dQXiK7+hKov33777a+qmlzculAmjK1Ai4D55t6yAglANyBdRACaArNE5FwfbQFQ1anAVICUlBRdu3ZtZcYfVunp6aSlpYU7jEoRTX2B6OpPNPUFoqs/oeqLiGwsaV0oU+9ioIOItBGRmrib2LMKVqrqLlVtpKqtVbU1sBA4V1WXeNuNEZFaItIG6AB8EcLYjTHmqBeyMwxVzROR64H3gVhgmqquFJG7gCWqOquUtitF5A1gFZAHXGdPSBljTGiF9B6Gqs4B5hRZdkcJ26YVmb8XuLfKgjPGGFOqiLnpbYyJPLm5uWzZsoWcnJyyN45A9evXZ/Xq1eEOo1JUdl/i4+Np3rw5cXFxvttYwjDGlGjLli0kJCTQunVrvIdRqpWsrCwSEhLCHUalqMy+qCoZGRls2bKFNm3a+G4XHc+bGWOqRE5ODklJSdUyWZiSiQhJSUlBnzlawjDGlMqSRXQqz+/VEoYxJmL98MMPdOvWrcT1N910E59++ikAjz76KHv37q3SeF5//XV69OhB165d+fOf/1zsNrm5uYwbN47u3bvTuXNn7rvvvsJ1v/3tb2ncuPERffrjH//IRx99VKWxVwZLGMaYaikjI4OFCxcyePBgoOoTRkZGBrfccgtz585l5cqVbN++nblz5x6x3YwZM9i/fz8rVqxg6dKlTJkyhR9++AGAyy+/nP/+979HtPnd737H/fffX2WxVxZLGMaYiHbw4EGuuuoqunbtyumnn86+ffsAmDlzJsOGDQPg8ccf58cff2TIkCEMGTKk1P0tXryYHj160LNnT2655ZZSz2ACbdiwgQ4dOpCc7KpmDB06lJkzZx6xnYiwZ88e8vLy2LdvHzVr1uSYY44BYPDgwTRs2PCINq1atSIjI4Pt27f7iiVc7CkpY4w/790K21dU7j6bdofhpf9l/d133/Haa6/x9NNPc9FFFzFz5kwuvfRSPv/8c0aOHAnADTfcwMMPP8zHH39Mo0aNSt3f+PHjefrpp+nfvz+33npoWJ61a9cyevToYtukp6fTvn171q5dyw8//EDz5s15++23OXDgwBHbjhw5kv/85z8ce+yx7N27l0ceeaTYJFHUCSecwOeff86FF15Y5rbhYgnDGBPR2rRpQ8+ePQFITU0tvLyzbdu2wr/2/dq5cydZWVn0798fgIsvvph33nkHgJSUFJYtW1Zq+6eeeorRo0cTExPDgAEDWL9+/RHbfPHFF8TGxvLjjz+SmZnJoEGDGDp0KG3bti11340bN+bHH38Mqj+hZgnDGONPGWcCVaVWrVqFn2NjYwsvSdWuXbtSXygs6wyjQYMGnHPOOZxzzjkATJ06ldjY2CO2ffXVVxk2bBhxcXE0btyYgQMHsmTJkjITRk5ODrVr1654R6qQ3cMwxlRLnTt3Zt26dYXzCQkJZGVlFc5fdtllLFmy5LA2DRo0ICEhgUWL3ICe06dPL1xXcIZR3NSgQQMAfv75ZwAyMzN58sknufLKK4+Iq2XLloVPPO3Zs4eFCxfSqVOnMvvz7bff+r6fEi6WMIwx1dJZZ51Fenp64fyECRMYNmxY4U3v5cuXc+yxxx7R7tlnn+Wqq66iZ8+e7Nmzh/r16/s+5o033kiXLl0YOHAgt956Kx07dgRg1qxZ3HGHK4t33XXXkZ2dTdeuXenTpw/jx4+nR48eAIwdO5b+/fuzdu1amjdvzrPPPgu4R3HXrVtH7969y/VvETKqGpVTx44dNZp8/PHH4Q6h0kRTX1Sjqz9F+7Jq1arwBOLTwIEDNTMz84jlu3bt0pEjR+ru3buPWJeVlVX4+b777tMbbrihKkP05a233tLbb7+91G2K60tFFff7xVUPL/Z71c4wjDHV1kMPPcSmTZuOWH7MMccwY8aMYtu8++679OzZk27dujFv3jxuv/32qg6zTHl5efzhD38Idxhlspvexphqq2/fvkG3GT16dIk3t8Nl1KhR4Q7BFzvDMMYY44slDGOMMb5YwjDGGONLSBOGiAwTkbUisk5Ebi1m/UQRWSEiy0TkMxHp4i1vLSL7vOXLRGRyKOM2xvg3esoCRk9ZEO4wTBUIWcIQkVhgEjAc6AKMLUgIAV5V1e6q2hN4EHg4YN16Ve3pTRNDErQxJuxiY2MLn2o655xz2LlzZ6nbX3755bz55psAnHnmmUe8vOfHHXfcwYcffgiUXAX3zjvv5Lbbbjts2bJly+jcubOv2NLS0gpjq1evXtAxBuPvf/87//znPyu8n1CeYZwIrFPVDap6AJgOjAjcQFV3B8zWBTSE8RljIlDt2rVZtmwZ33zzDQ0bNmTSpElVfsy77rqLoUOHAiUnjLFjx/L6668ftmz69OmMHTu2yuMLl1AmjGbA5oD5Ld6yw4jIdSKyHneGcUPAqjYi8pWIfCIig6o2VGNMeWXl5LJ15z6Wbsys9H3379+frVu3Au6v+X79+tGjRw/OP/98MjNLPt6sWbPo2bMnPXv2JCUlpXAc66VLl3LyySeTmprKGWecwbZt24BDZwKllU3v2LEjiYmJhWVGAN544w3Gjh0bVGyBfv31V/r378+77757xFlB3759Cwsv3n333aSkpHDSSScxduzYwu3Wr1/PsGHDSE1NZdCgQaxZs8bXcf2KuPcwVHUSMElELgZuB8YB24CWqpohIqnA2yLStcgZCSIyAZgAkJycfFjZgOouOzs7avoTTX2B6OpP0b7Ur1//sPpMxRn/0teH2u/PY81PewAYOXk+KY3rUq+W+5p57jfHlzuurKwsDh48yPvvv89vfvMbsrKyuPTSS/nHP/7BSSedxD333MNf/vIXHnjgAXJzc9m3bx9ZWVmoKnv27GHIkCHMmzcPgHHjxjFw4EB27NjBtddey/Tp02nUqBEzZ87kT3/6E08++WThPsaPH89DDz3E7NmzSUpKOuLf4oILLuDFF1+kS5cufPHFFzRo0ICmTZvSv3//MmM7ePAge/bsKdzn+vXrGT16NH/9618ZPHgwn332GXFxcYXrVbXw9zNjxgw+++wzcnNzGTRoEN26dSMrK4srrriCRx55hPbt27N48WKuvvpq3nnnHfbv33/Yvgrk5OQE9d9uKBPGVqBFwHxzb1lJpgNPAajqfmC/93mpdwbSETjs4qSqTgWmAqSkpGhaWlplxR526enpREt/oqkvEF39KdqX1atXk5CQUGqbwIqt2QHjQ6hC9oF86tdx68vaT0n27dvHoEGD2Lp1K507d2bEiBFkZ2eze/duhg8fDrg6UqNGjSIhIYG4uDhq165NQkICIkLdunULj/3ggw+SkJDAH/7wB7755htWr17N+eefD7iBmo499thi91GvXr1i47/ssssYMGAATzzxBLNnz+aSSy4hPz/fV2yxsbGFseXm5jJixAgmTZrEySefDLgqvbVq1So8bkEcH374Ieeff35
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEOCAYAAACaQSCZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAA5BElEQVR4nO3dd3gVVfrA8e+bAqHEECAgEkoQCE0MBClSDBYMuoKuIODaWBV72XXXsrquorura9cfLqDiqqsgxYKKYiMqIkgRpWMAkbaW0BIgkPL+/phJcgkpc0Ny783l/TzPPLkzc87Me4jeNzNn5hxRVYwxxpjKRAQ7AGOMMbWDJQxjjDGeWMIwxhjjiSUMY4wxnljCMMYY44klDGOMMZ4ENGGISLqIrBORTBG5s4JyF4qIikgvn213ufXWicjZgYnYGGNMkahAnUhEIoEJwFnAVmCxiMxW1dWlysUCtwCLfLZ1AUYDXYETgI9FpKOqFgQqfmOMOdYF8gqjN5CpqhtV9RAwDRheRrkHgIeBXJ9tw4FpqnpQVTcBme7xjDHGBEggE0ZLYIvP+lZ3WzER6Qm0UtX3/K1rjDGmZgXsllRlRCQCeBy44iiOMQ4YBxATE5PaunXr6gkuBBQWFhIRER7PKIRTWyC82hNObYHwak+g2rJ+/fpfVTWhrH2BTBjbgFY+64nutiKxQDcgQ0QAjgdmi8gwD3UBUNXJwGSA5ORkXbduXXXGH1QZGRmkpaUFO4xqEU5tgfBqTzi1BcKrPYFqi4hsLm9fIFPvYqCDiCSJSB2cTuzZRTtVdY+qNlXVtqraFlgIDFPVJW650SJSV0SSgA7A1wGM3RhjjnkBu8JQ1XwRuRGYC0QCU1R1lYiMB5ao6uwK6q4SkenAaiAfuMGekDLGmMAKaB+Gqs4B5pTadm85ZdNKrf8d+HuNBWeMMaZCIdPpbYwJPXl5eWzdupXc3NzKC4eguLg41qxZE+wwqkV1tyUmJobExESio6M917GEYYwp19atW4mNjaVt27a4D6PUKtnZ2cTGxgY7jGpRnW1RVbKysti6dStJSUme64XH82bGmBqRm5tLkyZNamWyMOUTEZo0aeL3laMlDGNMhSxZhKeq/F4tYRhjQtYPP/xAt27dyt1/66238vnnnwPw5JNPsn///hqN5+6776ZVq1Y0bNjwsO0HDx5k1KhRtG/fnj59+vDDDz+UWb9t27acdNJJpKSk0KtX8diq/OlPf+LTTz+tydCrhSUMY0ytlJWVxcKFCxk0aBAQmIRx3nnn8fXXR74C9sILLxAfH09mZiZ/+MMfuOOOO8o9xrx581i+fDlLliwp3nbTTTfx0EMP1UjM1ckShjEmpBUUFHD11VfTtWtXhgwZwoEDBwCYNWsW6enpADz99NNs376dwYMHM3jw4AqPt3jxYrp3705KSgp//vOfK7yCKa1v3760aNHiiO1vv/02l19+OQAjRozgk08+QVU9H7dNmzZkZWXxv//9z3OdYLCnpIwx3rx/J/xvRfUe8/iTYGjFf1l///33TJ06leeee46LLrqIWbNmcckll/Dll18yYsQIAG6++WYef/xx5s2bR9OmTSs83tixY3nuuefo168fd95ZMi3PunXrGDVqVJl1MjIyaNSoUbnH3LZtG61aOaMXRUVFERcXR1ZW1hGxiAhDhgxBRLjmmmsYN25c8b6ePXvy5ZdfcuGFF1YYfzBZwjDGhLSkpCRSUlIASE1NLe4f2LFjBwkJZY6RV67du3eTnZ1Nv379ALj44ot59913AUhOTmb58uXVFXaZ5s+fT8uWLfn5558566yz6NSpU/EttWbNmrF9+/YaPf/RsoRhjPGmkiuBmlK3bt3iz5GRkcW3pOrVq1etLxQezRVGy5Yt2bJlC4mJieTn57Nnzx6aNGlSZjlwksMFF1zA119/XZwwcnNzqVev3tE3pAZZH4Yxplbq3LkzmZmZxeuxsbFkZ2cXr1922WWHdSwDNGrUiNjYWBYtcib0nDZtWvG+oiuMspaKkgXAsGHDeOmllwCYOXMmp59++hGPre7bt684vn379vHhhx8e1n+yfv16v/pTgsEShjGmVjr33HPJyMgoXh83bhzp6enFnd7fffddmR3UL7zwAldffTUpKSns27ePuLg4z+e8/fbbSUxMZP/+/SQmJnLfffcBcOWVV5KVlUX79u15/PHHi5942r59O+eccw4AP/30EwMGDODkk0+md+/enHvuucWd9nl5eWRmZh72qG1IUtWwXDp27KjhZN68ecEOodqEU1tUw6s9pduyevXq4ATiUf/+/XXXrl1HbN+zZ4+OGDFC9+7de8S+7Ozs4s///Oc/9eabb67JED1544039J577qmwTFltOVpl/X5xRg8v83vVrjCMMbXWY489xo8//njE9uOOO44ZM2aUWee9994jJSWFbt268cUXX3DPPffUdJiVys/P57bbbgt2GJWyTm9jTK3Vp08fv+uMGjWq3M7tYBk5cmSwQ/DErjCMMcZ4YgnDGGOMJ5YwjDHGeBLQhCEi6SKyTkQyReTOMvZfKyIrRGS5iMwXkS7u9rYicsDdvlxEJgYybmOMd6MmfcWoSV8FOwxTAwKWMEQkEpgADAW6AGOKEoKP11T1JFVNAf4FPO6zb4OqprjLtQEJ2hgTdJGRkcVPNZ133nns3r27wvJXXHEFM2fOBOCcc8454uU9L+69914+/vhjoPxRcO+//37uuuuuw7YtX76czp07e4otLS2tOLbSw6VXt/vuu49HH330qI8TyCuM3kCmqm5U1UPANGC4bwFV3euz2gDwPtyjMSYs1atXj+XLl7Ny5UoaN27MhAkTavyc48eP58wzzwTKTxhjxozh9ddfP2zbtGnTGDNmTI3HFyyBTBgtgS0+61vdbYcRkRtEZAPOFcbNPruSROQbEflMRAbWbKjGmKrKzs1j2+4DLN28q9qP3a9fP7Zt2wY4f8337duX7t27c8EFF7BrV/nnmz17NikpKaSkpJCcnFw8j/XSpUs57bTTSE1N5eyzz2bHjh1AyZVARcOmd+zYkfj4+OJhRgCmT5/OmDFj/IrN16+//kq/fv147733jrgq8J2Y6YEHHiA5OZkBAwYwZsyY4nIbNmwgPT2d1NRUBg4cyNq1az2d16uQew9DVScAE0TkYuAe4HJgB9BaVbNEJBV4S0S6lroiQUTGAeMAEhISDhs2oLbLyckJm/aEU1sgvNpTui1xcXGHjc9UlrGvfFtS/2A+a3/aB8CIiQtIbtaAhnWdr5kXLz25ynFlZ2dTUFDA3LlzufTSS8nOzuaSSy7hkUceYcCAATz44IPcfffdPPzww+Tl5XHgwAGys7NRVfbt28fgwYP54osvALj88svp378/O3fu5Prrr2fatGk0bdqUWbNmcfvtt/Pss88WH2Ps2LE89thjvPPOOzRp0uSIf4vf/va3vPzyy3Tp0oWvv/6aRo0acfzxx9OvX79KYysoKDhsfKkNGzYwatQo/vrXvzJo0CDmz59PdHR08X5VLf79zJgxg/nz55OXl8fAgQPp1q0b2dnZXHnllTzxxBO0b9+exYsXc8011/Duu+9y8ODBw45VJDc316//dgOZMLYBrXzWE91t5ZkG/BtAVQ8CB93PS90rkI7AYTcnVXUyMBkgOTlZ09LSqiv2oMvIyCBc2hNObYHwak/ptqxZs4bY2NgK60RGRhZ/zjl0qPizKuQcKiSuvrO/suOU58CBAwwcOJBt27bRuXNnhg8fTk5ODnv37mXo0KGAM47UyJEjiY2NJTo6mnr16hEbG4uI0KBBg+Jz/+tf/yI2NpbbbruNlStXsmbNGi644ALAmaipRYsWZR6jYcOGZcZ/2WWXceqpp/LMM8/wzjvv8Lvf/Y7CwkJPsUVGRhbHlpeXx/Dhw5kwYQKnnXYa4IzSW7du3eLzFsXx8ccfc8EFFxQP7T58+HDq1q2LiLBo0SLGjh1bHN/BgweJjY094lhFYmJi6NGjh+ffRSATxmKgg4gk4SSK0cDFvgVEpIOqfu+ungt8725PAHaqaoGItAM6ABsDFrkxplyvX9Ov+PPSzbs
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"for g in [7.1, 14.3, 9.81, 10.5,]:\n",
" plt.errorbar(t_mean, \n",
" h, \n",
" xerr=t_std,\n",
" yerr=delta_h,\n",
" ls='',\n",
" marker='.',\n",
" label='Rollzeit Vollkugel')\n",
"\n",
" time = [i/10 for i in range(1,30)]\n",
"\n",
" plt.plot(time, \n",
" [fallhoehe(t, g) for t in time],\n",
" label=f'h(t, g={g})')\n",
"\n",
" plt.xlim(1.4, 2.7)\n",
" plt.ylim(0, 0.4)\n",
" plt.grid()\n",
" plt.xlabel('Gemessene Rollzeit $t$ [s]')\n",
" plt.ylabel('Starthöhe $h$ [m]')\n",
" plt.legend()\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wir können durch einfaches Ausprobieren feststellen, welcher Wert von $g$ am besten zu unseren Messwerten passt. Genau das macht `curve_fit`. `curve_fit` probiert solange (nach der Methode der kleinsten Quadrate) verschiedene Werte von $g$ aus, bis es den am besten passenden Wert gefunden hat. Probieren wir dies nochmal aus:"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:36:34.611760Z",
"start_time": "2020-08-26T06:36:34.606773Z"
}
},
"outputs": [],
"source": [
"from scipy.optimize import curve_fit"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:36:34.901660Z",
"start_time": "2020-08-26T06:36:34.894687Z"
}
},
"outputs": [],
"source": [
"parameter, covariance_matrix = curve_fit(fallhoehe,\n",
" t_mean,\n",
" h,\n",
" sigma=delta_h,\n",
" absolute_sigma=True\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hierbei schreibt `curve_fit` das Ergebnis der besten Werte in die Variable `parameter` und deren Fehler in eine so genannte Kovarianzmatrix.\n",
"\n",
"Beispiel: Das Ergebnis sieht für eine Funktion mit drei Parametern `def f(x, p1, p2, p3):` allgemein so aus:\n",
"\n",
"```\n",
"paramter = [p1, p2, p3]\n",
"covariance = [[cov_1,1, cov_1,2, cov_1,3], \n",
" [cov_2,1, cov_2,2, cov_2,3],\n",
" [cov_3,1, cov_3,2, cov_3,3]]\n",
"```\n",
"wobei `cov_i,i` der Varianz, also dem $\\sigma^2$ des Parameters i entspricht. Da wir in unserem Beispiel lediglich einen Parameter haben, sieht das Ergebnis wie folgt aus:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:36:47.493940Z",
"start_time": "2020-08-26T06:36:47.487956Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"g ist 10.58 m/s^2\n",
"Delta g ist 0.09 m/s^2\n"
]
}
],
"source": [
"print(f'g ist {parameter[0]:.2f} m/s^2') # <-- einfache liste\n",
"print(f'Delta g ist {(covariance_matrix[0][0])**(1/2):.2f} m/s^2') # <-- doppel liste"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun sollten wir noch das $\\chi^2$ und die Anzahl an Freiheitsgraden berechnen, um zu bestimmen, wie gut unser Fit funktioniert hat:"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:27.965486Z",
"start_time": "2020-08-26T06:38:27.958504Z"
}
},
"outputs": [],
"source": [
"def chiquadrat(xwerte, ywerte, dywerte, fun, g):\n",
" chi = 0\n",
" for x,y,dy in zip(xwerte, ywerte, dywerte):\n",
2020-08-26 06:42:16 +00:00
" chi += (fun(x, g) - y)**2/dy**2 # Der Operator += addiert zu dem vorherigen Wert von chi unseren\n",
" # neuen Wert drauf und aktualisiert gleich danach chi.\n",
" # Sprich es ist die kurzschreibweise für chi = chi + ...\n",
" return chi"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:33.333572Z",
"start_time": "2020-08-26T06:38:33.327134Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Das chi-quadrat und die Anzhal der Freiheitsgrade sind: 22/9\n"
]
}
],
"source": [
"chi = chiquadrat(t_mean, h, delta_h, fallhoehe, parameter[0])\n",
"ndof = len(h) - 1 # Anzahl Messwerte - Anzahl der Fitparamter\n",
"\n",
"print(f' Das chi-quadrat und die Anzhal der Freiheitsgrade sind: {chi:.0f}/{ndof}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$\\chi^2/$ndof > 1 bedeutet, dass unsere Fitfunktion die Daten nicht ganz wiederspiegelt. Um dies nachvollziehen zu können, gucken wir uns den finalen Plot an:"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:38.267629Z",
"start_time": "2020-08-26T06:38:37.982393Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAwUAAAIWCAYAAAAGUCH4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAABcSAAAXEgFnn9JSAACoQ0lEQVR4nOzdd3hUxf7H8fckhIQaeu9dehWkFymKdEFFvRTR+6NcG+oVK7YLNhQFUVHEjlQBGyhFkCaI9CpC6CAdQnrm98fJppBNSNlN/bye5zzrzsyZmbNH4373TDHWWkREREREJPfyyewOiIiIiIhI5lJQICIiIiKSyykoEBERERHJ5RQUiIiIiIjkcgoKRERERERyOQUFIiIiIiK5nIICEREREZFcTkGBiIiIiEgup6BARERERCSXU1AgIiIiIpLLKSgQEREREcnlFBSIiIiIiORyCgpERERERHI5BQUiIiIiIrlcjgkKjDH5jDEvGmP2GWNCjTHHjTEzjDHl01lvTWNMiDHGGmN+SaacrzHmEWPM9pjy/xhjZhtjbkhP+yIiIiIi3pYjggJjTACwHHgWKAgsBI4Aw4A/jTHV0lH9h4D/ddr3AeYAk4AKwPfATuB2YJMx5sZ0tC8iIiIi4lU5IigAngFaAeuAWtbaO6y1LYGxQElgRloqNcbcB3QEpl+n6HCgH7AfqGOtvd1a2xEYCOQHvjTG5ElLH0REREREvC3bBwXGmLzAmJi3o621V1x51tpJwDaggzGmWSrrLQ28DvwMfH2d4o/GvD5hrT0Vr/15wCKgBtAnNe2LiIiIiGSUbB8UAG2AQOCAtfZPN/lzY157pbLeyUA+YFRyhYwxVYEbgBCcYUOeal9EREREJEPkhKCgUczr5iTyXekNU1qhMeZW4A7gf9bav1LY/g5rbYQn2hcRERERyUg5ISioFPN6NIl8V3rllFRmjCkAvAfsBV7N6PZFRERERDJaTpj8WjDm9WoS+cExr4VSWN/LOF/gO1lrwzO6fWPMziSyauEMUTqSknpEREREJFepCFy11pZJy8k5ISjwGGNMc+BB4DNr7cpM7s61fPLkyVOofPnydTO7IwLR0dEA+PjkhIdtOYPuSdai+5G16H5kLbofWUtOuR/Hjx8nIsLdSPaUyQlBgWu1ofxJ5BeIeb2cXCUxS4ZOBy4Aj2V0+y7W2npJ9G9n+fLl6x46dCgVXRNvWb58OQCdO3fO5J6Ii+5J1qL7kbXofmQtuh9ZS065H/Xq1WPXrl1pHlGSE4KCwzGvFZLId6UHXaeeCkBj4CQwxxgTP69IzGszY8xKgJh9CDzZvoiIiIhIpsgJQcHWmNemSeS70relsL4yMYc7RYAOSbRf3xjj52YFotS2LyIiIiKSobL34CnHGuAiUN0Y09hN/u0xr4uTq8Rae8haa9wdQKeYYsvipbnOOwjsxtnToGda2xcRERERySzZPiiIWSFoSszbqTFLigJgjHkUZ3+AX621f8RLH2OM2WOMmeChbkyKeX3NGFMqXjv9gd7AX8BCD7UlIiIiIuJROWH4EDjLiN4MtAb2G2NW4ywr2hL4Bxh+TfkSQG2grIfanwHcCvQD9hhjlsW00QFnGdF7rLWRHmpLRERERMSjsv2TAgBrbSjOEJ+XcPYL6IsTFMwEmlpr//Zy+9HAQGAscBy4DWgAzAOaW2s3eLN9EREREZH0yClPCrDWhgDPxRzXKzseGJ+KulcC5jplonCGEU1KrpyIiGQMay3W2szuRpbiWo9dsgbdj6wlK90PYwzXrITpdTkmKBARkdzNWsvly5e5dOkSV69eJSoqKrO7lGUUKOBMt9u7d28m90RA9yOryar3I2/evBQqVIjixYvj6+vr9fYUFIiISLYXHR3NyZMnuXjxYmZ3JUtyfemRrEH3I2vJqvcjPDycs2fPEhwcTKVKlbweGCgoEBGRbO/ixYuxAUGxYsUoVKgQ/v7+Gf74Pau6dOkSAIULF87kngjofmQ1WfF+REdHExwczKlTpwgNDeXs2bOUKlXq+iemg4ICERHJ9s6fPw9AqVKlKF68eCb3Juvx8fFJ8CqZS/cja8mK98PHx4fAwEAAjh8/zuXLl70eFGSdqxcREUkDay1hYWFA1vqlT0QkvVxDm8LDw72+cIKCAhERydbi/48yIybjiYhklPhPLxQUiIiIiIiIVykoEBERERHJ5RQUiIiIiIjkcgoKRERERERyOQUFIiIiOZQxBmMMgYGBBAYGxr53HR07dgRg/PjxGGOYOXNmpvZXRDKP9ikQERHJ4QYPHgyAn59fgvQ6deoke17Hjh359ddfOXjwIFWqVPFW93IMYwyVK1fm0KFDmd0VkVRTUCAiIpLDTZs2DUh6H4cxY8Zw5513UrZs2YzslohkIQoKREREcrkSJUpQokSJzO6GiGQizSkQERHJ5a6dU3Do0CGMMfz6668AVK1aNcFcBJehQ4dijGHlypX8+OOPtG3bloIFC1K0aFH69+/Pnj17ErUVGhrKxx9/TJ8+fahWrRr58uWjSJEitG/fnlmzZrntX/x2lixZQqdOnShSpAjGGC5cuADA6tWrGTNmDA0bNqRo0aLky5ePOnXq8OSTT8aWiW/lypUYYxg6dCinT5/mvvvuo0yZMhQoUIC2bduydu3a2LLvv/8+DRs2JF++fFSsWJHx48cTHR0dmz9z5szYzyUoKMjtvA2Xq1ev8uabb8Z+VgULFqRVq1Z8+umnbq/dGEOVKlUIDw/nxRdfpE6dOvj7+9O3b1+35UXSSk8KREREJIGCBQsyZMgQfvrpJ06dOsWAAQMoWLBgkuXnzJnDtGnTaN68Ob169WLbtm0sWLCA5cuX8+uvv9KoUaPYsocOHWLEiBGUK1eO2rVrc+ONN3Ly5EnWrl3L6tWr2bNnD+PHj3fbzldffcVHH31E8+bNueWWWzhw4EDsl/HHH3+crVu30rBhQ7p06UJoaCibN2/m1Vdf5bvvvmP9+vVur+H8+fPcdNNNREVF0bFjRw4dOsSaNWvo2rUrv//+Ox9++CHTp0+nU6dOVK5cmV9//ZUXXniBiIgIXnnlFQBq1KjBkCFD+PTTTylQoAC33357bP3x522cPn2arl27sm3bNkqXLk2HDh2w1rJ27VqGDh3Kpk2bePfddxP1MTo6mr59+7Jq1So6dOhAw4YNKV68eOznWbVqVcD7O95KDmet1ZENDmBn5cqVrWQNy5Yts8uWLcvsbkg8uidZS0bej6ioKLtr1y67a9cuGxUVlSFtZheABezFixftxYsXkyz3/PPPW8B+8sknCdI7dOhgAXvw4EG35w0ZMiS2jQ8//DA2PTo62v73v/+1gG3cuHGCc86cOWN//vlnGx0dnSD977//tlWqVLE+Pj6J2ovfzqxZs9z25YcffrAXLlxIkBYaGmofeOABC9gXXnghQd6KFSti67znnntseHh4os+jbt26tly5cvavv/6Kzdu5c6fNmzevzZ8/v718+XKCOgGb3P+rb731VgvYkSNH2tOnT8emnzx50jZv3twC9scff0xUJ2Br1Khhjx49mqjOgwcPxpaRtLnefx+ZKTV/3+rWrWuBnTaN3zU1fEhERCSHS2pJUk+tktO6dWvuv//+2PfGGF566SUqVKjAli1b+O2332Lzihcvzs0335xgGBI4Q5SefvppoqOjWbx4sdt2evbsyR133OE275ZbbiEwMDBBmr+/P2+//TZ58uRh4cKFbs8rXLgw77zzToKVmR555BGMMezatYsXX3yR6tWrx+bVrVuXnj17cvXqVTZt2pTEJ5LYli1b+OGHH2jRogX/+9//8Pf3j80rXbo0H374IRA3KfxaEyZMoHz58onS/fz8qF27NrVr105xX0Tc0fAhERGRHC6pJUmTGxKUGnfeeWeiND8/P26//XbefvttVq9eTdu2bRPk//bbb6xcuZJjx44RGhqKtZYTJ04AsH//frft9O7dO9l+HDt2jMWLF7Nnzx4uXboUO+4/b968SdbZvHlzihYtmiAtMDCQYsWKcfbsWbp165bonGrVqgHE9jclli5dCkDfvn3x8Un8m2yTJk0oWLA
"text/plain": [
"<Figure size 840x570 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(5.6, 3.8), dpi=150) # <-- Größe eines A4-Blatts ausnutzen\n",
"# Plot der Messdaten\n",
"plt.errorbar(t_mean, \n",
" h, \n",
" xerr=t_std,\n",
" yerr=delta_h,\n",
" ls='',\n",
" marker='.',\n",
" label='Rollzeit Vollkugel')\n",
"\n",
"# Fitergebnis:\n",
"time = [i/10 for i in range(1,30)]\n",
"plt.plot(time, \n",
" [fallhoehe(t, parameter[0]) for t in time],\n",
" label=f'Fitparamter:\\ng: ({parameter[0]:.2f}+/-{(covariance_matrix[0][0])**(1/2):.2f}) m/s$^2$\\n'\n",
" f'$\\chi^2/$ndof: {chi:.0f}/{ndof}')\n",
"\n",
"plt.xlim(1.4, 2.7)\n",
"plt.ylim(0, 0.4)\n",
"\n",
"plt.grid()\n",
"plt.xlabel('Gemessene Rollzeit $t$ [s]', fontsize=10)\n",
"plt.ylabel('Starthöhe $h$ [m]', fontsize=10)\n",
"plt.legend(fontsize=10)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Unsere Funktion weicht lediglich leicht von dem Großteil unserer Messdaten ab. Lediglich für kleine und große Fallhöhen ist die Abweichung stärker und unsere Funktion beschreibt die Messdaten nicht genau genug. Dies erklärt den leicht erhöhten Wert für unser $\\chi^2$/ndof. Woran könnte dies liegen?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bestimmen von mehren Parameter mittels curve_fit:\n",
"\n",
"Und weil es so schön ist, hier noch ein letztes Beispiel zum Thema Fitten. Einige von Ihnen haben sich gefragt, warum man überhaupt Fitten muss, wenn man bei einfachen Funktionen wie zum Beispiel\n",
"\n",
"$$s(t) = 1/2 \\cdot g \\cdot t^2$$\n",
"\n",
"die Funktion einfach nach $g$ auflösen und den Mittelwert und die Standardabweichung von $g$ berechnen kann. Bei Funktionen, die lediglich von einem Parameter abhängen, geht das relativ einfach, aber wie sieht es im folgenden Beispiel aus:\n",
"\n",
"$$T(t, T_0, \\tau, t_0) = \\tau \\cdot \\cos\\bigg(2 \\cdot \\pi \\cdot \\bigg(\\frac{t-t_0}{365 d}\\bigg)\\bigg) + T_0$$\n",
"\n",
"Die Funktion $T(t, T_0, \\tau, t_0)$ soll die jährlichen Temperaturschwankungen an einem bestimmten Ort auf der Erde wiederspiegeln. Hierbei ist $T_0$ die Durchschnittstemperatur, $\\tau$ der Temperaturunterschied und $t_0$ eine Verschiebung des Cosinus entsprechend des Tages, an dem die maximale Temperatur innerhalb eines Jahres gemessen wurde. Gucken wir uns zunächst die Messdaten an:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:46.482971Z",
"start_time": "2020-08-26T06:38:46.478982Z"
}
},
"outputs": [],
"source": [
"import numpy as np # trigonometrische Funktionen findet man ebenfalls in Numpy\n",
"import matplotlib.pyplot as plt\n",
"from scipy.optimize import curve_fit"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:46.870189Z",
"start_time": "2020-08-26T06:38:46.855230Z"
}
},
"outputs": [],
"source": [
"# Gemessene Werte:\n",
"tage = [0.28, 10.36, 20.4, 30.23, 40.22, 50.11,\n",
" 60.25, 70.22, 80.25, 90.03, 100.24, 110.21,\n",
" 120.22, 130.25, 140.14, 150.09, 160.33, 170.31,\n",
" 180.27, 190.28, 200.25, 210.33, 220.18, 230.15,\n",
" 240.19, 250.37, 260.39, 270.35, 280.56, 290.23, \n",
" 300.31, 310.17, 320.2, 330.11, 340.28, 350.48, 360.26] # d\n",
"\n",
"gemessene_temperatur = [15.17, 15.31, 14.46, 16.2, 15.49,\n",
" 16.18, 17.18, 16.17, 17.43, 18.24,\n",
" 18.96, 19.69, 20.19, 21.33, 22.27, \n",
" 23.14, 23.6, 23.37, 23.39, 25.27, \n",
" 25.2, 24.63, 23.22, 23.95, 23.53, \n",
" 22.9, 22.59, 21.84, 20.77, 20.12, \n",
" 18.79, 18.29, 17.87, 16.86, 16.48, \n",
" 15.41, 14.2] # °C\n",
"\n",
"fehler_temperatur = [0.52, 0.54, 0.54, 0.54, 0.51, 0.48, \n",
" 0.44, 0.39, 0.33, 0.28, 0.24, 0.22, \n",
" 0.24, 0.28, 0.33, 0.39, 0.44, 0.48, \n",
" 0.52, 0.54, 0.55, 0.55, 0.53, 0.5, \n",
" 0.46, 0.41, 0.35, 0.29, 0.25, 0.22, \n",
" 0.23, 0.26, 0.31, 0.37, 0.42, 0.47, \n",
" 0.5]\n",
"\n",
"def temp(t, T0, tau, t0):\n",
" \"\"\"\n",
" Jahrestemperaturverlauf für Ort x.\n",
" \n",
" Args:\n",
" t: Zeit in Tagen\n",
" T0: Mittlere Temperatur in °C\n",
" tau: Temperaturschwankungsamplitude in °C\n",
" t0: Zeitpunkt des heißesten Tages in Tagen\n",
" \"\"\"\n",
" return tau * np.cos(2 * np.pi * (t - t0) / 365) + T0"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Zunächst können wir uns die Messdaten angucken:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:48.953130Z",
"start_time": "2020-08-26T06:38:48.766630Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot der Messdaten:\n",
"plt.figure(dpi=100)\n",
"plt.errorbar(tage, \n",
" gemessene_temperatur,\n",
" fehler_temperatur, \n",
" ls='',\n",
" marker='.')\n",
"\n",
"plt.xlabel('Tage des Jahres')\n",
"plt.ylabel('Temperatur [°C]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Als Nächstes führen wir, wie in den anderen Beispielen auch, den Fit mittelts `curve_fit` durch:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:50.796960Z",
"start_time": "2020-08-26T06:38:50.789977Z"
}
},
"outputs": [],
"source": [
"# Fitten der Messdaten\n",
"para, pcov = curve_fit(temp,\n",
" tage,\n",
" gemessene_temperatur,\n",
" sigma=fehler_temperatur,\n",
" absolute_sigma=True\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Im vergleich zu vorher haben wir diesesmal mehrere Parameter, sprich `para` ist jetzt eine Liste von Werten und die Kovarianzmatrix `pcov` eine verschachtelte Liste:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:55.005310Z",
"start_time": "2020-08-26T06:38:54.998325Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([19.76428742, -4.757914 , 19.11533869])"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"para"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:55.422567Z",
"start_time": "2020-08-26T06:38:55.414589Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 3.29660572e-03, -1.46005392e-04, -4.33280486e-04],\n",
" [-1.46005392e-04, 1.13167028e-02, -9.24299792e-04],\n",
" [-4.33280486e-04, -9.24299792e-04, 6.93117520e-01]])"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pcov"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Denkt daran, dass die Fehler der Parameter der Wurzel der Hauptdiagonalen der Kovarianzmatrix entsprechen. Gucken wir uns die durch den Fit berechneten Werte etwas genauer an:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:38:58.444536Z",
"start_time": "2020-08-26T06:38:58.438539Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Der Wert für ist T0 (19.76 +/- 0.06) °C\n",
"Der Wert für ist tau (-4.76 +/- 0.11) °C\n",
"Der Wert für ist t0 (19.12 +/- 0.83) d\n"
]
}
],
"source": [
"# Printausgabe der Parameter:\n",
"for ind, (pname, einheit) in enumerate(zip(('T0', 'tau', 't0'), ('°C', '°C', 'd'))):\n",
" wert = para[ind]\n",
" fehler = pcov[ind, ind]**0.5 # dies entspricht der Hauptdiagnolen mit den Indizes 1,1 2,2 etc.\n",
" print(f'Der Wert für ist {pname} ({wert:.2f} +/- {fehler:.2f}) {einheit}')\n",
" \n",
"# Zusatzinfo:\n",
"# In unserer for-Schleife haben wir einen weiteren nützlichen Befehl eingebaut:\n",
"# enumerate gibt den Index enstsprechend dem aktuellen Schritt in der Schleife\n",
"# Probiert doch mal das folgende aus:\n",
"# for ind, buchstabe in enumerate(['A', 'B', 'C'], start=0):\n",
"# print(ind, buchstabe)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nun sollten wir auch das $\\chi^2$ berechnen, um ein Gefühl für die Fitgüte zu bekommen:"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:39:02.007699Z",
"start_time": "2020-08-26T06:39:01.998689Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Das Chi-Quadrat beträgt 41.96 mit 34 Freiheitsgraden.\n"
]
}
],
"source": [
"# Berechnen des Chi**2:\n",
"chi_liste = []\n",
"for t, T, dT in zip(tage, gemessene_temperatur, fehler_temperatur):\n",
" chi_liste.append((temp(t, para[0], para[1], para[2]) - T)**2/dT**2)\n",
"\n",
"chi = sum(chi_liste) \n",
"print(f'Das Chi-Quadrat beträgt {chi:.2f} mit {len(gemessene_temperatur) - 3} Freiheitsgraden.')\n",
"\n",
"\n",
"# Zusatzinfo: \n",
"# Sie können das Ganze auch wieder etwas kompakter als list comprehension schreiben.\n",
"# Außerdem können Sie die Fitparameter anstatt als para[0], para[1], para[2] mithilfe von\n",
"# *para an die Funktion geben. Der Stern ordnet die Werte in der Liste der Reihe nach den \n",
"# Argumenten der Funktion zu:\n",
"# chi = sum([(temp(t, *para) - T)**2/dT**2 for t, T, dT in zip(tage, gemessene_temperatur, fehler_temperatur)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die Fitparameter scheinen den Funktionsverlauf ganz gut zu beschreiben. Gucken wir uns das Resultat zusammen mit den Messwerten an:"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:39:04.861580Z",
"start_time": "2020-08-26T06:39:04.639174Z"
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(dpi=100)\n",
"plt.errorbar(tage, \n",
" gemessene_temperatur,\n",
" fehler_temperatur, \n",
" ls='',\n",
" marker='.',\n",
" label='T an Ort x')\n",
"\n",
"tage2 = [t/10 for t in range(3650)]\n",
"plt.plot(tage2, temp(tage2, *para), label='Fitfunktion')\n",
"\n",
"plt.legend(loc=2)\n",
"plt.xlabel('Tage des Jahres')\n",
"plt.ylabel('Temperatur [°C]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hier noch ein kleiner Zusatz: Ist Ihnen etwas aufgefallen? Der Fitparameter $T_0$ hat einen Wert von ca. 20 Tagen, obwohl das Maximum eher bei 200 Tagen liegt. Dennoch beschreibt der Fit den Verlauf der Messdaten sehr gut. Dies liegt daran, dass der Cosinus eine periodische Funktion ist. Bei der Methode der kleinsten Quadrate werden die Fitparameter so lange nach einem gewissen Schema variiert, bis $\\chi^2$ minimal ist. Bei einer periodischen Funktion gibt es mehre dieser Minima.\n",
"\n",
"Dies kann auch bei anderen komplexeren Funktionen der Fall sein. Da die meisten Funktionen jedoch nicht periodisch sind, handelt es sich in der Regel bei diesen zusätzlichen Minima nur um lokale Minima. Um die besten Fitparameter zu finden, wollen wir jedoch das globale Minimum finden. Um dies zu erreichen, können wir `curve_fit` ein wenig helfen und zum Beispiel noch zusätzlich Startwerte für unsere Fitparameter mitgeben:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:39:40.646282Z",
"start_time": "2020-08-26T06:39:40.638303Z"
}
},
"outputs": [],
"source": [
"# Die Startwerte sind entsprechend der Reihenfolge der Parameter der Fitfunktion anzugeben.\n",
"# In unserem Fall ist dies T0, tau, t0. Sollten wir keine Idee für einen Startwert haben,\n",
"# können wir einfach den entsprechenden Wert auf einen passenden Wert setzen, hier z.B, 1.\n",
"startwerte = [1, 1, 200]\n",
"\n",
"# Fitten der Messdaten\n",
"para, pcov = curve_fit(temp,\n",
" tage,\n",
" gemessene_temperatur,\n",
" sigma=fehler_temperatur,\n",
" absolute_sigma=True,\n",
" p0=startwerte # <-- Übergeben der Startwerte an die Funktion\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:39:41.286672Z",
"start_time": "2020-08-26T06:39:41.278694Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Der Wert für ist T0 (19.76 +/- 0.06) °C\n",
"Der Wert für ist tau (4.76 +/- 0.11) °C\n",
"Der Wert für ist t0 (201.62 +/- 0.83) d\n",
"Das Chi-Quadrat beträgt 41.96 mit 34 Freiheitsgraden.\n"
]
}
],
"source": [
"# Erneute Ausgabe der Fitwerte und des Chi**2\n",
"for ind, (pname, einheit) in enumerate(zip(('T0', 'tau', 't0'), ('°C', '°C', 'd'))):\n",
" wert = para[ind]\n",
" fehler = pcov[ind, ind]**0.5 # dies entspricht der Hauptdiagnolen mit den Indizes 1,1 2,2 etc.\n",
" print(f'Der Wert für ist {pname} ({wert:.2f} +/- {fehler:.2f}) {einheit}')\n",
"\n",
"chi = sum([(temp(t, *para) - T)**2/dT**2 for t, T, dT in zip(tage, gemessene_temperatur, fehler_temperatur)])\n",
"chi = sum(chi_liste) \n",
"print(f'Das Chi-Quadrat beträgt {chi:.2f} mit {len(gemessene_temperatur) - 3} Freiheitsgraden.')"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"ExecuteTime": {
2020-08-26 06:42:16 +00:00
"end_time": "2020-08-26T06:39:42.279956Z",
"start_time": "2020-08-26T06:39:42.070512Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhQAAAFtCAYAAABfv/NxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABbTUlEQVR4nO3deXhTVfrA8e+bblBKy1KkVcSyyC6gLCoim7Ioggoqio6i429cRx1xFFEUQVFRVBBcxpVRGRdQREDZBFxwQVwREUXKIgVka4HSNk3O74+blrSkbZKmvUn6fp7nPk3uPbl5T2+gb849ixhjUEoppZSqDIfdASillFIq8mlCoZRSSqlK04RCKaWUUpWmCYVSSimlKk0TCqWUUkpVmiYUSimllKo0TSiUUkopVWmaUCillFKq0mLtDqCqiYgAxwIH7I5FKaWUikB1ge2mgpkwoz6hwEomttkdhFJKKRXBmgB/llegJiQUBwC2bt1KcnJySE7odDpZvHgxAwYMIC4uLiTnDEdaz+ii9YwuWs/oEq71zMnJ4fjjjwc/WvlrQkIBQHJyckgTisTERJKTk8Pqwoea1jO6aD2ji9YzukRDPbVTplJKKaUqTRMKpZRSSlWarQmFiNwtIqtF5ICI7BKRuSLS2ke500XkYxE5JCI5IvKJiNS2I2allFJKHc3uPhS9gRnAak8sk4DFItLOGHMIrGQC+Ah4GPgnUAh0AtyhCsIYQ2FhIS6Xy6/yTqeT2NhY8vLy/H5NJIqmesbExBAbG4s1ilgppVSo2ZpQGGMGeT8XkVHALqAL8Iln95PANGPMI15Ffw1VDAUFBWRlZZGbm+v3a4wxpKWlsXXr1qj+AxVt9UxMTCQ9PZ34+Hi7Q1FKqahjdwtFaSmen3sBROQY4FTgDRFZBbQA1gP3GGM+83UCEUkAErx21QXr27bT6SxR1u12s2nTJmJiYkhPTycuLs6vP5zGGA4dOkSdOnWi4g9tWaKlnsYYnE4nf/31F3/88QfNmjXD4Thyt6/oc1H68xFttJ7RResZXcK1noHEIxVMfFVtRMQBzAPqGWN6evadBnyBlWDcAXwPXAncCHQwxvzm4zzjgftL7581axaJiYkl9sXGxpKWlkaTJk1ISEgo/RIVZfLz89m2bRtZWVkRfwtHKaWqQ25uLiNHjgRIMcbklFc2nBKKZ4FzgJ7GmG2efT2Az4GHjTFjvcr+CCwwxtzt4zy+Wii27d69+6h5KPLy8ti6dSsZGRnUqlXL71iNMRw4cIC6detG9Df3ikRbPfPy8sjMzOT4448vcb2dTidLliyhf//+ETv+2x9az+ii9Ywu4VrPnJwcUlNTwY+EIixueYjIdOA8oFdRMuGR5fm5rtRLfgGa+jqXMSYfyPc6NwBxcXFHXSSXy4WI4HA4SjSBV8TtdhefO5DXRZpoq6fD4UBEfH4WwPdnJBppPaOL1jO6hFs9A4nF7mGj4kkmLgT6GWM2lSqSCWwHSg8lbQVsrvoIlVJKKeUPu792zgCuAEYCB0QkzbPVBvCsbPYYcIuIXCQiLUVkItAGeMm2qMNYnz59uO222yosN3fuXFq2bElMTIxf5f2VkZHBU089FdBrVqxYgYiwf//+kMWhokduQSEZYxaQMWYBuQWFdoejlCqD3QnFDVgjO1Zg3d4o2kYUFTDGPIU1B8WTwA/AWUB/Y8zGao41rIwaNQoROWqbPHkyEydOLC5X1h/46667josuuoitW7eWKF/VfCU8PXr0ICsri5SUFN8vUkopFfbsnofCr55+njkoHqmwYA0zaNAgXnnllRL7GjVqRExMTLmvO3jwILt27WLgwIEce+yxVRmiX+Lj40lLS7M7DBUFcgsKaXffYiCWPmcXkhJG96KVinZ2t1CEH2Og4FDFmzPXv3L+bkGMtklISCAtLa3EdtZZZxW3APTp04fNmzfzr3/9q7gFY8WKFdStWxeAfv36Fe8bP348nTt3LnH+qVOn0rFjx+Lno0aN4oILLuDxxx8nPT2dhg0bctNNN5U7TvnFF1+kXr16LFu2jFGjRrFy5UqmTp1aHE9mZqbPWx5z5syhffv2JCQkkJGRwZQpU0qcNyMjg0mTJnHNNddQt25dmjZtyn/+85+Af4dKKaVCIyxGeYQVZy5MKv9buwOoF+r3Hbsd4uuE9JTvvvsunTp14h//+Af/93//B0CDBg349ddfad26NXPmzKFHjx40aNCAFStW+HXO5cuXk56ezvLly/n9998ZMWIEnTt3Lj6/t8mTJzN58mQWL15M9+7d6dq1Kxs2bKBDhw5MmDABsFpUMjMzS7xuzZo1XHLJJYwfP54RI0awatUqbrzxRho2bMioUaOKy02ZMoWJEycyduxYZs+ezQ033EDv3r1p3fqo5WCUUkpVMU0oItj8+fNJSkoqfn7OOeeUON6gQQNiYmKoW7duiVsKxxxzTPHxQG811K9fn+nTpxMTE0ObNm0YPHgwy5YtOyqhuOuuu3jttddYuXIl7du3ByAlJYX4+HgSExPLfd8nnniCs846i3HjxgHQqlUr1q1bx2OPPVYioTj33HO58cYbi9/vySefZPny5ZpQKKWUDTShKC0u0WotKIfb7SbnwAGS69YN3fwMcYkVlymlb9++PPvss8XP69Spw2WXXRaaeMrQvn37En000tPT+emnn0qUmTJlCocOHeKbb76hefPmAb/HL7/8wvnnn19i3xlnnMFTTz2Fy+Uqfn/v2zEiQlpaGrt27Qr4/ZRSSlWeJhSliVR868HthjiXVc7GCZ/q1KlDy5YtQ3Iuh8NB6VlTffWNKD3JiYgUT4BV5Mwzz2TBggW8/fbbjBkzJiTx+eJPLEoppaqHJhRRLj4+3q91Kxo1asSOHTswxhTPLvr9998H9Z7du3fn5ptvZtCgQcTGxnLHHXcEFE/btm35/PPPS+z7/PPPadWqVYUjWJRSStlDR3lEuYyMDD755BP+/PNPdu/eXWa5Pn368NdffzF58mQ2btzIjBkz+Oijj4J+3x49erBw4UIeeOCBEvNgZGRk8NVXX5GZmcnu3bt9tiiMHj2aZcuWMXHiRDZs2MDMmTOZPn16icREKaVUeNGEIspNmDCBzMxMWrRoQaNGjcos17ZtW5555hlmzJhBp06d+Prrrxk9enSl3rtnz54sWLCAe++9l6effhqAO+64g5iYGNq1a0ejRo3YsmXLUa875ZRTePvtt3nzzTfp0KED9913HxMmTCjRIVPVTDuy8+wOQSlVhrBZbbSqiEgykJ2dne1ztdFNmzbRrFmzgFYbdbvd5OTkkJycHBWLZpUl2upZ1vV2Op0sXLiQc889N6wW5Qm1SK3na19kMu79nwFwCDw87CRGdPO5NqBnYqtFACy+tQet0utXW5zVLVKvZ6C0nvbKyckpmsW4wtVGI/+vhFIqamVlH+b+eT8XP3cbGPvuWrKyD/ssP2fNkcWKB01bxVurj24BU0pVDU0olFJha9PuQ7hLNaK6jCFzd+5RZQNNPpRSoaUJhVIqbDVLrYOj1Io/MSJkpB49b0sgyYdSKvQ0oVBKha30lNo8MLR98XOHwKRhHUhPqX1U2UCSjyK6NLpSoaMJhVIqrA3v0qT48dLbe5fZITOQ5EMpFXqaUCilIkZaSvmjsbyTj49u6VFm8qGUCj1NKJRSUalxsv9DwZVSlacJRQjofVillFI1nSYUSimllKo0TSgijIiUu40fP77aY5o/fz69e/embt26JCYm0q1bN1599VW/Xjt+/Hg6d+5cpfEppZSqeppQRJisrKzi7amnniI5ObnEvupeQOvpp5/m/PPP54wzzuCrr77ixx9/5NJLL+X6668vNxZjDIWFentIKaWihSYUIVbVixelpaUVbykpKYhIiX1JSUk+X/faa6/RtWtX6tatS1paGiNHjmTXrl3Fx1esWIGIsGzZMrp27UpiYiI9e/bkt99+KzOWrVu3Mnr0aG677TYmTZpEu3btaNmyJaNHj+axxx5jypQpfPXVVyXO/+GHH9KlSxcSEhJ4/fXXeeCBB/jhhx+KW1h8tWzk5eXRvn17/vGPfxTv27hxI3X
"text/plain": [
"<Figure size 600x400 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Erneutes Plotten der Funktion:\n",
"plt.figure(dpi=100)\n",
"plt.errorbar(tage, \n",
" gemessene_temperatur,\n",
" fehler_temperatur, \n",
" ls='',\n",
" marker='.',\n",
" label='T an Ort x')\n",
"\n",
"tage2 = [t/10 for t in range(3650)]\n",
"plt.plot(tage2, temp(tage2, *para), label='Fitfunktion')\n",
"\n",
"plt.legend(loc=2)\n",
"plt.xlabel('Tage des Jahres')\n",
"plt.ylabel('Temperatur [°C]')\n",
"plt.grid()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wir konnten mithilfe der Startwerte den Fit so beeinflussen, dass `curve_fit` dieses Mal das \"richtige\" Minimum finden konnte. Daher wird bei einem komplexeren Problem empfohlen, sich immer erst die Messdaten anzugucken und ein paar Startwerte für den Fit zu raten/schätzen."
]
}
],
"metadata": {
"kernelspec": {
2021-09-01 21:15:12 +00:00
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
2020-08-25 14:48:41 +00:00
},
"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.9.7"
}
},
"nbformat": 4,
2021-09-01 21:15:12 +00:00
"nbformat_minor": 4
}