{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Fakultät für Physik\n", "\n", "## Physikalisches Praktikum P1 für Studierende der Physik\n", "\n", "Versuch P1-26, 27, 28 (Stand: Oktober 2023)\n", "\n", "[Raum F1-15](https://labs.physik.kit.edu/img/Praktikum/Lageplan_P1.png)\n", "\n", "# Kreisel\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Name: _surname1_ Vorname: _name1_ E\\-Mail: _mail1_\n", "\n", "\\begin{equation*}\n", "\\begin{split}\n", "&\\\\\n", "&\\\\\n", "\\end{split}\n", "\\end{equation*}\n", "\n", "Name: _surname2_ Vorname: _name2_ E\\-Mail: _mail2_\n", "\n", "\\begin{equation*}\n", "\\begin{split}\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "\\end{split}\n", "\\end{equation*}\n", "\n", "Gruppennummer: _groupnumber_\n", "\n", "\\begin{equation*}\n", "\\begin{split}\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "\\end{split}\n", "\\end{equation*}\n", "\n", "Betreuer: \n", "\n", "\\begin{equation*}\n", "\\begin{split}\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "\\end{split}\n", "\\end{equation*}\n", "\n", "Versuch durchgeführt am: _date_\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**Beanstandungen:**\n", "\n", "\\begin{equation*}\n", "\\begin{split}\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "&\\\\\n", "\\end{split}\n", "%\\text{\\vspace{10cm}}\n", "\\end{equation*}\n", "\n", "
\n", "Testiert am: __________________ Testat: __________________" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Hilfsfunktionen. Nicht weiter beachten\n", "from IPython.core.display import Markdown\n", "from IPython.display import display\n", "def M_helper_func(txt):\n", " #print(txt)\n", " #print('fr\"'+txt.replace(\"§\",\"$\").replace(\"{\",\"{{\").replace(\"}\",\"}}\").replace(\"[!\",\"{\").replace(\"!]\",\"}\")+'\"')\n", " execreturnvalue = \"\"\n", " loc = {}\n", " exec('execreturnvalue = fr\"
'+txt.replace(\"{\",\"{{\").replace(\"}\",\"}}\").replace(\"[!\",\"{\").replace(\"!]\",\"}\")+'
\"', globals(), loc)\n", " display(Markdown(loc[\"execreturnvalue\"]))\n", " return loc[\"execreturnvalue\"]\n", "\n", "from IPython.core.magic import (register_line_magic,\n", " register_cell_magic)\n", "\n", "from IPython.core import magic\n", "\n", "def register_line_magic(f):\n", " setattr(f, magic.MAGIC_NO_VAR_EXPAND_ATTR, True)\n", " return magic.register_line_magic(f)\n", "\n", "@register_line_magic\n", "def m(line):\n", " M_helper_func(line)\n", "\n", "import os\n", "import numpy as np\n", "from numpy import pi\n", "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "import scipy as sci\n", "import kafe2\n", "from kafe2 import MultiFit\n", "import pandas as pd\n", "import uncertainties\n", "from uncertainties import ufloat, unumpy\n", "from uncertainties.unumpy import uarray as uarr\n", "from uncertainties.unumpy import nominal_values, nominal_values as nomv, std_devs, std_devs as stdv\n", "from uncertainties.umath import sqrt as usqrt, sin as usin,exp as uexp\n", "import scipy\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "mpl.rcParams['figure.dpi'] = 100\n", "class ng:\n", " def __init__(self,x=None,stat=None,syst=None):\n", " if x == None:\n", " self.syst = None\n", " self.stat = None\n", " else:\n", " self.syst = ufloat(x,0)\n", " self.stat = ufloat(x,0)\n", " if syst != None:\n", " self.syst = ufloat(x,syst)\n", " if stat != None:\n", " self.stat = ufloat(x,stat)\n", " def SetSyst(self,syst):\n", " self.syst = ufloat(nomv(self.syst),syst)\n", " def SetStat(self,stat):\n", " self.stat = ufloat(nomv(self.stat),stat)\n", " def __str__(self):\n", " return f'{nomv(self.stat):.2}±ₛₜₐₜ{stdv(self.stat):.2}±ₛᵧₛₜ{stdv(self.syst):.2}'\n", " def __add__(self,o):\n", " res = ng()\n", " if type(o) == ng:\n", " res.syst = self.syst + o.syst\n", " res.stat = self.stat + o.stat\n", " else:\n", " res.syst = self.syst + o\n", " res.stat = self.stat + o\n", " return res\n", " def __iadd__(self,o):\n", " return self.__add__(o)\n", " def __sub__(self,o):\n", " res = ng()\n", " if type(o) == ng:\n", " res.syst = self.syst - o.syst\n", " res.stat = self.stat - o.stat\n", " else:\n", " res.syst = self.syst - o\n", " res.stat = self.stat - o\n", " return res\n", " def __isub__(self,o):\n", " return self.__sub__(o)\n", " def __mul__(self,o):\n", " res = ng()\n", " if type(o) == ng:\n", " res.syst = self.syst * o.syst\n", " res.stat = self.stat * o.stat\n", " else:\n", " res.syst = self.syst * o\n", " res.stat = self.stat * o\n", " return res\n", " def __imul__(self,o):\n", " return self.__mul__(o)\n", " def __truediv__(self,o):\n", " res = ng()\n", " if type(o) == ng:\n", " res.syst = self.syst / o.syst\n", " res.stat = self.stat / o.stat\n", " else:\n", " res.syst = self.syst / o\n", " res.stat = self.stat / o\n", " return res\n", " def __itruediv__(self,o):\n", " return self.__truediv__(o)\n", " def __pow__(self,o):\n", " res = ng()\n", " if type(o) == ng:\n", " res.syst = self.syst**o.syst\n", " res.stat = self.stat**o.stat\n", " else:\n", " res.syst = self.syst**o\n", " res.stat = self.stat**o\n", " return res\n", " def __ipow__(self,o):\n", " return self.__pow__(o)\n", "def sin(o):\n", " if type(o) == ng:\n", " res = ng()\n", " res.syst = usin(o.syst)\n", " res.stat = usin(o.stat)\n", " return res\n", " else:\n", " return np.sin(o)\n", "def exp(o):\n", " if type(o) == ng:\n", " res = ng()\n", " res.syst = uexp(o.syst)\n", " res.stat = uexp(o.stat)\n", " return res\n", " else:\n", " return np.exp(o)\n", "def sqrt(o):\n", " if type(o) == ng:\n", " res = ng()\n", " res.syst = usqrt(o.syst)\n", " res.stat = usqrt(o.stat)\n", " return res\n", " else:\n", " return np.sqrt(o)\n", " \n", "def uplot(x,y,*args, **kwargs):\n", " utypes = (uncertainties.core.Variable,uncertainties.core.AffineScalarFunc)\n", " xplt = x\n", " yplt = y\n", " if type(x[0]) in utypes:\n", " xplt = nomv(x)\n", " kwargs[\"xerr\"] = stdv(x)\n", " if type(y[0]) in utypes:\n", " yplt = nomv(y)\n", " kwargs[\"yerr\"] = stdv(y)\n", " plt.errorbar(xplt,yplt,*args,**kwargs)\n", " plt.show()\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Durchführung\n", "\n", "## Aufgabe 1: Physik starrer Körper\n", "\n", "**Hinweise zu allen hier durchzuführenden Messungen finden Sie in der Datei [Hinweise-Aufgabe-1.md](https://gitlab.kit.edu/kit/etp-lehre/p1-praktikum/students/-/blob/main/Kreisel/doc/Hinweise-Aufgabe-1.md).**\n", "\n", "Bei dieser Aufgabe handelt es sich um **Demonstrationsversuche**, die Sie sich gemeinsam mit Ihrem:r Tutor:in während der Praktikumsvorbesprechung überlegen und im Anschluß durchführen können, um sich durch eigene Erfahrung mit der Physik starrer Körper vertraut zu machen. Wir empfehlen Ihnen, die nötige Zeit für die entsprechenden Versuche einzuräumen und jedem:r Teilnehmer:in die Versuche, bei denen Sie selbst das Studienobjekt sind, selbst durchzuführen.\n", "\n", "### Aufgabe 1.1: Drehimpulserhaltung\n", "\n", "Um persönliche Erfahrungen mit der Drehimpulserhaltung zu sammeln, stehen Ihnen ein Drehschemel und ein Rad mit zwei Griffen und Zugband zur Verfügung. Notieren Sie Ihre Erfahrungen und diskutieren Sie die zugrundeliegenden physikalischen Effekte.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Nehmen Sie auf dem Drehschemel Platz; halten Sie die Radachse vertikal; werfen Sie den Fahrradkreisel von Hand an, oder lassen Sie sich dabei helfen; Drehen Sie dann den Fahrradkreisel in die Horizontale und halten Sie ihn schließlich an.\n", "\n", "> Durch das Anwerfen des Kreisels beginnt die sitzende Person sich in die entgegengesetzte Richtung zu drehen. Wird der Fahrradkreisel in die horizontale Richtung gebracht, stoppt die Drehung der Sitzenden. Dieser Effekt kann über die Präzession oder auch über die Drehimpulserhaltung in der vertikalen Achse erklärt werden.\n", "\n", "- Gehen Sie wie oben vor, aber beginnen Sie mit dem Fahrradkreisel in der Horizontalen und drehen Sie ihn dann in die Vertikale.\n", "\n", "> Wenn man den Fahrradkreisel in der horizonralen Richtung andreht und dann in die vertikale Position bringt fängt man an sich in die entgegengesetzte Richtung zu drehen wie der Kreisel. Auch das kann wieder über die Drehimpulserhaltung erklärt werden. Wenn man den Kreisel anhält hört man auf selbst auf sich zu drehen, was auch wieder durch Drehimpulserhaltung zu erklären ist.\n", "\n", "- Gehen Sie wie oben vor, aber lassen Sie den Fahrradkreisel von einer anderen Person anwerfen, die diesen dann an Sie übergibt.\n", "\n", "> Wird der Fahrradkreisel in die horizontale Richtung gebracht, startet eine Drehung der Person in die gleiche Richtung wie der Kreisel vorher. Dieser Effekt kann über wieder über die Drehimpulserhaltung in der vertikalen Achse erklärt werden. Wird der Kreisel gestoppt, endet nicht die Drehung der Person.\n", "\n", "- Gehen Sie wie oben vor, aber drehen Sie den Fahrradkreisel langsam von der Vertikalen um 180 Grad erneut in die Vertikale. Dabei zeigt ein Griff des Kreisels mal nach oben und mal nach unten.\n", "\n", "> Die Person dreht sich immer in die entgegengesetzte Richtung wie der Kreisel. Je vertikaler die Achse des Kreises ist, desto schneller die Drehung um die eigene Achse.\n", "\n", "- Versetzen Sie den Drehschemel (mit oder ohne Fahrradkreisel in Drehung); halten Sie dabei die Arme ausgestreckt; führen Sie dann die Arme an den Körper. Der Effekt verstärkt sich, wenn Sie Gewichte in den Händen halten.,\n", "\n", "> Je näher man die Arme an den Körper bringt, desto schneller dreht man sich. Auch dieser Effekt folgt aus der Drehimpulserhaltung.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 1.2: Trägheitstensor\n", "\n", "Um Erfahrungen mit dem Trägheitstensor zu sammeln steht Ihnen ein Aufbau zur Verfügung, mit dem Sie entsprechend präparierte Holzkisten in ihren Schwerpunkten aufhängen und in Rotation versetzen können. Notieren Sie Ihre Erfahrungen und diskutieren Sie die zugrundeliegenden physikalischen Effekte.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es wird ein Holzkästchen mit Ösen an den Seitenflächen über einen Draht mit einem Motor verbunden und so frei im Raum aufgehängt. Anschließend wird die Ausrichtung des Körpers bei Rotation nach Befestigung an den verschiedenen Seiten beobachtet.\n", "\n", "Es ist zu erwarten, dass nach dem Dschinbekow\\-Effekt, lediglich die Rotation um die Hauptachsen extremaler Hauptträgheitsmomente stabil ist und eine Rotation um das mittlere Trägheitsmoment instabil ist, sich also in eine Rotation um eine der anderen Achsen wandelt.\n", "\n", "Diese sind erwartet die längste und kürzeste Achse durch den Körper, die normal zu Oberfläche stehen.\n", "\n", "Beobachtet wird, dass nur die Rotation um die Achse maximalen Trägheitsmoments stabil ist \\- also die durch die Seite größter Fläche und kleinsten Durchmesser des dahinter liegenden Körpers \\- und auch die Rotation um das minimale Trägheitsmoment sich für größere Drehzahlen in eine um das größte Moment wandelt. Dies liegt daran, dass die Drehung um das minimale Moment lediglich semistabil, also nur für kleinere Drehzahlen stabil ist.\n", "\n", "Eine weitere Erklärungsidee unsererseits war ein hörbares Klackern innerhalb des Kästchens, welches zu einer Verfälschung der homogen angenommenen Masserverteilung führt und damit die Größe der Trägheitsmomente beeinflusst.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 1.3: Kreiselkompass\n", "\n", "Für diesen Versuch steht Ihnen ein [kardanisch](https://de.wikipedia.org/wiki/Kardanische_Aufh%C3%A4ngung) gelagerter Kreisel auf einer drehbaren Grundfläche zur Verfügung, der sich gegen die Grundfläche kippen lässt. Der innere Kardanrahmen ist durch Arretierfedern fixiert. Beschreiben und diskutieren Sie das Verhalten des Kreisel nachdem Sie zunächst den Kreisel und dann seine Standfläche in Rotation versetzt haben. \n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Der Versuch Kreiselkompass soll die theoretische Möglichkeit verdeutlichen, einen Kompass auf der Rotation der Erde zu basieren.\n", "\n", "Es wird ein Kreisel auf eine sich drehende Scheibe gestellt, um eine Rotation der Erde in einer Geschwindigkeit zu simulieren, bei der trotz Reibungseffekten und in kleineren Zeitspannen, die gleichen Effekte beobachtet werden.\n", "\n", "Diese sind erwartet primär eine Ausrichtung der Rotationsachse des Kreisels parallele zu der der \"Erde\" \\(der Scheibe, die im weiteren als Erde bezeichnet wird, da sie diese simulieren soll\\). Auch eine Verkippung des Kreisels vor seiner Rotation relativ zur Achse, um einen anderen Breitengrad zu simulieren, sollte diesen Effekt nicht beeinträchtigen.\n", "\n", "Bei der Ausführung wurde dieser Effekt gut beobachtet. Die Kreiselachse strebte deutlich der Erdachse entgegen und erreichte Sie auch wenn ein Breitengerad in der Einstellung nahe >70° gewählt wurde. Bei Positionen in der Nähe des symbolisierten Äquators wurde die Ausrichtung durch die Federn im Aufbau daran gehindert sich ganz auszurichten.\n", "\n", "Der Effekt funktioniert dabei so, dass eine Rotation der Erde eine Kraft in tangentialer Richtung auf den Kreisel ausübt. Diese Kraft erzeugt nach Rechter\\-Hand\\-Regel ein Drehmoment in Richtung der Rotationsachse. Dieses wirkt so lange, bis die Rotationsachse des Kreisels ausgerichtet ist.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 2: Kardanisch gelagerter Kreisel\n", "\n", "**Hinweise zu allen hier durchzuführenden Messungen finden Sie in der Datei [Hinweise-Aufgabe-2.md](https://gitlab.kit.edu/kit/etp-lehre/p1-praktikum/students/-/blob/main/Kreisel/doc/Hinweise-Aufgabe-2.md).**\n", "\n", "Im Verlauf dieses Versuchs untersuchen Sie den [kardanisch](https://de.wikipedia.org/wiki/Kardanische_Aufh%C3%A4ngung) gelagerten Kreisel quantitativ. Sie lernen dabei mehrere charakteristische Eigenschaften symmetrischer Kreisel kennen. Sie bestimmen die Trägheitsmomente entlang der [Hauptträgheitsachsen](https://de.wikipedia.org/wiki/Haupttr%C3%A4gheitsachse) des Kreisels und schätzen die Masse des Kreiselrotors ab. \n", "\n", "### Aufgabe 2.1: Dämpfung\n", "\n", "Bestimmen Sie die Dämpfung des Kreisels aus einer Messreihe von mindestens 30 Punkten. Stellen Sie die Kreisfrequenz $\\omega$ des Kreisels geeignet als Funktion der Zeit $t$ dar.\n", "\n", "---\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "### Messung der Datenpunkte\n", "%m Es wurde die Dämpfung des Kreisels gemessen, indem er beschleunigt wurde und dann das Absinken seiner Frequenz mit der Zeit beobachtetet wurde.\n", "mpg = pd.read_csv('A21.csv')\n", "mpg.rename(columns={'t': 'Zeit in s','f': 'Frequenz in Hz'}, inplace=True)\n", "t,f = np.genfromtxt('A21.csv', delimiter=',')[1:].transpose()\n", "Δt = 1E-3 #als kleinste Zeiteinheit des Arduinos\n", "Δf = 1E-3 #Abschätzen\n", "display(mpg)\n", "%m Als Unsicherheiten wurden dabei $[!Δt:.3f!]\\,s$ für die Zeitmessung (als kleinste Zeiteinheit des Arduinos) und $[!Δf:.3f!]\\,Hz$ für die Frequenzmessung (als angenommen größerer Fehler als die Stellen, um die Mittelung über eine Sekunde zu berücksichtigen) angenommen.\n", "ut = unumpy.uarray(t, Δt)\n", "uw = 2*np.pi*unumpy.uarray(f, Δf)\n", "\n", "plt.errorbar(nomv(ut),nomv(uw),xerr=stdv(ut),yerr=stdv(uw))\n", "plt.title(\"Darstellung der gemessenen Kreisfrequenzen\")\n", "plt.xlabel(\"t in s\")\n", "plt.ylabel(r'$\\omega$ in Hz')\n", "plt.show()\n", "%m Es ist gut erkennbar, dass einer der Werte um 1000s ein Ausreißer war, der auftrat, als das Messgerät verrutschte, sodass dieser nun verworfen wird.\n", "index = np.argmin(uw[:1200])\n", "ut = np.delete(ut,index)\n", "uw = np.delete(uw,index)\n", "\n", "### Fitten eines Modells\n", "%m An die Daten wird nun ein phänomenologisches Modell der Form $\\omega(t, \\omega_{0}, a, b,c) = \\omega_{0}\\,e^{-a\\,t} + b\\,t^{c}$ angepasst.\n", "def slowDownModel(t,ω_0=200,a=1,b=0,c=2):\n", " return ω_0*np.exp(-1*a*t)+b*t**c\n", "\n", "xy_data = kafe2.XYContainer(x_data=nomv(ut), y_data=nomv(uw))\n", "slow_fit = kafe2.Fit(data=xy_data, model_function=slowDownModel)\n", "slow_fit.add_error(\"x\",stdv(ut))\n", "slow_fit.add_error(\"y\",stdv(uw))\n", "slow_fit.do_fit()\n", "p = kafe2.Plot(slow_fit)\n", "p.x_label = 't in s'\n", "p.y_label = 'Frequenz in Hz'\n", "p.plot()\n", "p.show()\n", "\n", "### Bewerten des Fits\n", "%m Wie erkennenbar ist, folgen die Daten dem Modell scheinbar sehr gut, die Linie ist hinter den Punkten nicht mehr wirklich sichtbar, allerdings ist die $\\chi^2$ Wahrscheinlichkeit 0, also sehr schlecht. Dies könnte unter anderem daran liegen, dass Kafe2 hier sehr viele Daten zu verarbeiten hat, also viel Potential für unerkannte systematische Fehler bleibt. Es könnte aber auch daran liegen, dass die Unsicherheiten der Messung zu konservativ abgeschätzt wurden und die Messungen des Arduinos eigentlich ungenauer waren (die Mittelung über eine Sekunde also zu möglicherweise größeren Abweichungen führte, als angenommen)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 2.2: Nutation\n", "\n", " * Bestimmen Sie die Nutationsfrequenz $\\omega_{N}$ des Kreisels als Funktion von $\\omega$. Nehmen Sie eine Messreihe mit mindestens 30 Messpunkten auf und stellen Sie sie geeignet dar. \n", " * Wiederholen Sie die Messreihe für eine Konfiguration in der Sie zwei Zylindergewichte zusätzlich an den äußeren Kardanrahmen der Kreiselaufhängung geschraubt haben. \n", "\n", " ---\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "### Messung der Datenpunkte\n", "%m
Messung der Nutation ohne Zusatzgewichte
\n", "%m Es wurde die Nutationsfrequenz des Kreisels beobachtet, indem er beschleunigt und die Nutationsfrequenz nach Schlägen auf den Rahmen mithilfe der zur Verfügung gestellten Schwanenhälse bei verschiedenen Frequenzen gemessen wurde.\n", "mpg = pd.read_csv('A22_noMass.csv')\n", "mpg.rename(columns={'f': 'Frequenz in Hz', 'fn': 'Nutationsfrequenz in Hz'}, inplace=True)\n", "Δf = 1E-2 #Abschätzen #aus Anzahl Stellen?\n", "Δf_N = 2E-1 #Abschätzen #aus Anzahl Stellen?\n", "Δf1 = Δf \n", "Δf_N1 = Δf_N\n", "display(mpg)\n", "\n", "%m Als Unsicherheiten wurden dabei $[!Δf1:.3f!]\\,Hz$ für die Frequenz des Kreisels (Ungenauigkeit des Ablesens der wandelnden Zahlen und Beeinträchtigung durch die Schläge) und $[!Δf_N1:.3f!]\\,Hz$ für die Frequenzmessung der Nutation (Schnell wandelnde Zahlen, die teilweise doppelt so groß waren und dann spontan halbiert und mit den anderen gemittelt werden mussten) angenommen.\n", "f1, f_N1 = np.genfromtxt('A22_noMass.csv', delimiter=',')[1:].transpose()\n", "uw1 = unumpy.uarray(f1, Δf1) * 2*np.pi\n", "uw_N1 = unumpy.uarray(f_N1, Δf_N1) * 2*np.pi\n", "\n", "\n", "### Zweite Messreihe mit Gewichten\n", "%m
Messung der Nutation mit Zusatzgewichten
\n", "#Dieses Trägheitsmoment kommt zu Θ_x hinzu\n", "m_N = ufloat(1,1E-3)# Eintragen\n", "r_N = ufloat(10E-2,5E-3) #Eintragen\n", "l_N = ufloat(14.9E-2,0.2E-2)\n", "θ_Z = 2*(1/2*m_N*r_N**2+m_N*l_N**2)\n", "%m Nun wurden Massen von $[!nomv(m_N):.2f!]\\,kg$ angehängt und die gleiche Messung erneut durchgeführt. Zu den vorher aufgeführten Fehlern kommen nun eine Unsicherheit von $[!stdv(m_N):.3f!]\\, kg$ auf die Massen (nach Angabe Datenblatt), eine Unsicherheit von $[!stdv(r_N):.3f!]\\,m$ auf den Radius von $[!nomv(r_N):.2f!]\\,m$ (Abschätzen der eigenen Genauigkeit beim Messen mit Hilfe der gegebenen Messinstrumente) und eine Unsicherheit von $[!stdv(l_N):.3f!]\\,m$ auf den Abstand vom Schwerpunkt der Gewichte zur Symmetrieachse des Kreisels von $[!nomv(l_N):.2f!]\\,m$ (nach Datenblatt).\n", "mpg = pd.read_csv('A22_withMass.csv')\n", "mpg.rename(columns={'f': 'Frequenz in Hz', 'fn': 'Nutationsfrequenz in Hz'}, inplace=True)\n", "Δf2 = Δf \n", "Δf_N2 = Δf_N \n", "display(mpg)\n", "\n", "f2,f_N2 = np.genfromtxt('A22_withMass.csv', delimiter=',')[1:].transpose()\n", "uw2 = unumpy.uarray(f2, Δf2) * 2*np.pi\n", "uw_N2 = unumpy.uarray(f_N2, Δf_N2) * 2*np.pi\n", "\n", "\n", "### Fitten der Messreihen auf Beschreibungen\n", "%m
Fitten der Messreihen
\n", "%m Die Messreihen sollen nun auf Geraden der Form $\\omega_N = \\omega *m +b$ gefittet werden, wobei $m$ die Steigung beschreibt, die sich aus den Trägheitsmomenten ergibt: $m = \\frac{\\theta_{z}^{\\prime}}{\\sqrt{\\theta_{x}^{\\prime}\\,\\theta_{y}^{\\prime}}}.$ Die Steigungen der beiden Fits unterscheiden sich, da sich $\\theta_{x}^{\\prime}$ durch Anfügen der zusätzlichen Masse ändert.\n", "\n", "def nutModel(w,m=1,b=0):\n", " return w*m+b\n", "# Reihe 1:\n", "xy_data = kafe2.XYContainer(x_data=nomv(uw1), y_data=nomv(uw_N1))\n", "xy_data.label = 'Messung ohne Zusatzgewichte'\n", "line_fit1 = kafe2.Fit(data=xy_data, model_function=nutModel)\n", "line_fit1.add_error(\"x\",stdv(uw1))\n", "line_fit1.add_error(\"y\",stdv(uw_N1))\n", "line_fit1.do_fit()\n", "mN1,bN1 = line_fit1.parameter_values\n", "\n", "# Reihe 2:\n", "xy_data = kafe2.XYContainer(x_data=nomv(uw2), y_data=nomv(uw_N2))\n", "xy_data.label = 'Messung mit Zusatzgewichten'\n", "line_fit2 = kafe2.Fit(data=xy_data, model_function=nutModel)\n", "line_fit2.add_error(\"x\",stdv(uw2))\n", "line_fit2.add_error(\"y\",stdv(uw_N2))\n", "line_fit2.do_fit()\n", "mN2,bN2 = line_fit2.parameter_values\n", "\n", "p = kafe2.Plot([line_fit1,line_fit2])\n", "p.x_label = r'$\\omega$ in Hz'\n", "p.y_label = 'Nutationsfrequenz in Hz'\n", "p.plot()\n", "p.show()\n", "\n", "### Auswertung\n", "%m Wie zu erkennen ist, ist die $\\chi^2$ Wahrscheinlichkeit sehr gut, allerdings ist die $\\frac{\\chi^2}{ndof}$ besonders für den zweiten Fit recht weit von 1 entfernt. Ein möglicher Grund hierfür wäre die geringe Anzahl an Datenpunkten bei zu groß geschätzten Unsicherheiten. Die geringe Anzahl an Messwerten entspringt vor allem dem Problem, dass bei zu geringen Frequenzen des Kreisels andere Effekte schwer zu beobachten sind, während zu große Frequenzen ein mögliches Sicherheitsrisiko darstellen. Eine mögliche Lösung wäre es hierfür gewesen, den messbaren Bereich mehrmals zu durchmessen, um mehr Werte aufzunehmen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 2.3: Präzession\n", "\n", "Bestimmen Sie Präzessionsfrequenz $\\Omega$ des nutationsfreien, symmetrischen Kreisels als Funktion von $\\omega$. Tun Sie dies, indem Sie einen Metallstab als zusätzliches Gewicht in den inneren Kardanrahmen der Kreiselaufhängung schrauben. Nehmen Sie eine Messreihe mit midestens 30 Messpunkten auf und stellen Sie sie geeignet dar.\n", "\n", " ---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m_Stab = ufloat(330E-3,1E-3)\n", "l_Stab = ufloat(41.8E-2-25.5E-2,3E-3) #Abstand Schwerpunkt #25.5E-2 41.8E-2\n", "m_G = ufloat(375E-3,1E-3)\n", "s = ufloat(10.91E-2,0.03E-2)\n", "\n", "### Messung der Datenpunkte\n", "%m
Messung der Präzession mit verschiedenen Positionen des Gewichts
\n", "%m Es wurde die Präzession des Kreisels beobachtet, indem er beschleunigt und mit einem mit einem Gewicht versehenen Stab erweitert wurde, der durch die Gewichtskraft zu einer Kraft auf den Kreisel führte und so erlaubte die Periodendauer einer Präzession bei verschiedenen Frequenzen und verschiedenen Abständen des Gewichts zu messen.\n", "mpg = pd.read_csv('A23_1.csv')\n", "mpg.rename(columns={'fv': 'Frequenz in Hz vorher','fn': 'Frequenz in Hz nachher','T': 'Periodendauer in s','m': 'Angehängte Masse in kg','r': 'Abstand der Masse in m'}, inplace=True)\n", "display(mpg)\n", "\n", "##Uncertainties\n", "#Δf = 1E-4 #Abschätzen #aus Anzahl Stellen?\n", "Δf_P = 1E-1 #Abschätzen #aus Anzahl Stellen?\n", "ΔT_P = 4E-1 #Unsicherheit auf die Messung mit der Stoppuhr #abschätzen\n", "Δr_P = 2E-3 #Abschätzen\n", "\n", "\n", "r1 = l_Stab + s\n", "m1 = m_Stab\n", "d2 = ufloat(0.04335,1E-3)\n", "r2 = (l_Stab*m_Stab+d2*m_G)/(m_Stab+m_G)+s\n", "m2 = m_Stab + m_G\n", "d3 = ufloat(15.5E-2 +2E-2,1E-3)\n", "r3 = (l_Stab*m_Stab+d3*m_G)/(m_Stab+m_G) + s\n", "m3 = m_Stab + m_G\n", "#Sofern kein Stab da: Schwerpunkt Stab und zuzüglich Abstand Rahmen (s) als Radius, Masse Stab als Masse\n", "#später: Schwerpunkt Stab und Masse m_G daran zuzüglich Abstand Rahmen (s), Masse Summe der Massen\n", "\n", "%m Der Stab wog $m_{Stab} = ([!nomv(m_Stab):.3!]\\pm [!stdv(m_Stab):.3!])\\,kg$ und sein Schwerpunkt lag bei $l_{Stab} = ([!nomv(l_Stab):.3!]\\pm [!stdv(l_Stab):.3!])\\,m$ (bestimmt durch Auflage an einer Kante und Abmessen der Distanz zum Gleichgewichtspunkt). Das anhängbare Gewicht wog $m_{G} = ([!nomv(m_G):.3!]\\pm [!stdv(m_G):.3!])\\,kg$ und seine Distanz zum Schwerpunkt wurde den jeweiligen Radien zugerechnet, wobei eine homogene Massenverteilung und so eine Unsicherheit von $[!stdv(d2):.3!]\\,m$ angenommen wurde.\n", "%m Als Unsicherheiten der Messung selbst wurden dabei $[!2*np.pi*Δf_P:.2!]\\, Hz$ auf die Drehfrequenz des Kreisels gewählt (da die Anzeige in der Schnelle nicht genauer abgelesen werden konnte und sich die Frequenz während der Messung ändert - um diesem Effekt entgegenzuwirken, wurde die Frequenz vor und nach der Präzession bestimmt und gemittelt) und $[!ΔT_P:.2!]\\, s$ für die Zeitmessung (Messung der Dauer einer Periode von Hand mit einer Stoppuhr, wobei Beginn und Ende einer Periode nur bedingt präzise abgepasst werden konnten).\n", "\n", "\n", "f_Pv1, f_Pn1, m_P1, r_P1, T_P1 = np.genfromtxt('A23_1.csv', delimiter=',')[1:].transpose()\n", "uw_Pv1 = unumpy.uarray((f_Pv1+f_Pn1)/2, Δf_P) * 2*np.pi\n", "uT_P1 = unumpy.uarray(T_P1, ΔT_P) \n", "\n", "f_Pv2, f_Pn2, m_P2, r_P2, T_P2 = np.genfromtxt('A23_2.csv', delimiter=',')[1:].transpose()\n", "uw_Pv2 = unumpy.uarray((f_Pv2+f_Pn2)/2, Δf_P) * 2*np.pi\n", "uT_P2= unumpy.uarray(T_P2, ΔT_P) \n", "\n", "f_Pv3, f_Pn3, m_P3, r_P3, T_P3 = np.genfromtxt('A23_3.csv', delimiter=',')[1:].transpose()\n", "uw_Pv3 = unumpy.uarray((f_Pv3+f_Pn3)/2, Δf_P) * 2*np.pi\n", "uT_P3 = unumpy.uarray(T_P3, ΔT_P) \n", "\n", "### Darstellen\n", "plt.errorbar(nomv(uw_Pv1),nomv(uT_P1),xerr=stdv(uw_Pv1),yerr=stdv(uT_P1),label=str(np.around(nomv(m1),3))+\"kg im Abstand von \"+str(np.around(nomv(r1),3))+\"m\",fmt=\".\")\n", "plt.errorbar(nomv(uw_Pv2),nomv(uT_P2),xerr=stdv(uw_Pv2),yerr=stdv(uT_P2),label=str(np.around(nomv(m2),3))+\"kg im Abstand von \"+str(np.around(nomv(r2),3))+\"m\",fmt=\".\")\n", "plt.errorbar(nomv(uw_Pv3),nomv(uT_P3),xerr=stdv(uw_Pv3),yerr=stdv(uT_P3),label=str(np.around(nomv(m3),3))+\"kg im Abstand von \"+str(np.around(nomv(r3),3))+\"m\",fmt=\".\")\n", "\n", "plt.xlabel(\"Kreisfrequenz in Hz\")\n", "plt.ylabel(\"Periodendauer Präzession in s\")\n", "plt.legend()\n", "plt.show()\n", "%m Die Punkte scheinen wie erwartet auf Geraden zu liegen. Es ist zu erkennen, dass die Unsicherheit auf die Periodendauer recht groß ist, sodass die Zeitmessung besser anders durchgeführt worden wäre. Ideen hierfür wären beispielsweise auch hier die Verwendung der Schwanenhälse oder anderer Lichtschrankensysteme." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 2.4: Trägheitsmomente entlang der Hauptträgheitsachsen\n", "\n", " * Berechnen Sie aus den Messungen die Sie im Rahmen der **Aufgaben 2.2** und **2.3** durchgeführt haben, die Trägheitsmomente $\\theta_{x}$, $\\theta_{y}$ und $\\theta_{z}$ entlang der Hauptträgheitsachsen.\n", " * Schätzen Sie aus Ihren Berechnungen die Masse $M$ des Kreiselrotors ab.\n", "\n", " ---\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "###Trägheitsmomentbestimmung durch Multifit\n", "%m
Bestimmung der einzelnen Trägheiten durch einen Multifit
\n", "%m Es werden die einzelnen Funktionen durch ihre entsprechenden Zusammenhänge mit den Trägheitsmomenten ersetzt und gemeinsam für diese gefittet.\n", "\n", "## Defining the Models\n", "def praezModelm1(w,m1,r1,k,θ_z=1,b1=1):\n", " return 2*np.pi *θ_z * w /(m1*k*r1)+b1\n", "\n", "def praezModelm2(w,m2,r2,k,θ_z=1,b2=1):\n", " return 2*np.pi *θ_z * w /(m2*k*r2) +b2\n", "\n", "def praezModelm3(w,m3,r3,k,θ_z=1,b3=1):\n", " return 2*np.pi *θ_z * w /(m3*k*r3) +b3\n", "\n", "def noMNutModel(w,θ_z=1, θ_x=1, θ_y=1):\n", " return w * θ_z/np.sqrt(θ_x * θ_y)\n", "\n", "def MNutModel(w, θ_Z, θ_z=1, θ_x=1, θ_y=1):\n", " return w * θ_z/np.sqrt((θ_x+θ_Z)* θ_y)\n", "\n", "\n", "## Fitting Procedure\n", "fitlist = []\n", "for i in range(0,5):\n", " fitlist.append([])\n", " \n", "#Fitting the Präzession\n", "xy_data = kafe2.XYContainer(x_data=nomv(uw_Pv1), y_data=nomv(uT_P1))\n", "xy_data.add_error(axis='x', err_val=stdv(uT_P1))\n", "xy_data.add_error(axis='y', err_val=stdv(uT_P1))\n", "fitlist[0] = kafe2.Fit(data=xy_data, model_function=praezModelm1)\n", "fitlist[0].add_parameter_constraint(name='m1', value=nomv(m1), uncertainty=stdv(m1))\n", "fitlist[0].add_parameter_constraint(name='k', value=9.81, uncertainty=0.01)\n", "fitlist[0].add_parameter_constraint(name='r1', value=nomv(r1), uncertainty=stdv(r1))\n", "fitlist[0].data_container.axis_labels = (\"Frequenz in Hz\", \"Periodendauer in s\")\n", "fitlist[0].data_container.label = \"Präzession bei \"+ str(np.around(nomv(m1),3))+\"kg im Abstand von \"+str(np.around(nomv(r1),3))+\"m\"\n", "fitlist[0].limit_parameter(\"θ_z\",1E-12,None)\n", "fitlist[0].model_label = \"Parametrization\"\n", "\n", "\n", "xy_data = kafe2.XYContainer(x_data=nomv(uw_Pv2), y_data=nomv(uT_P2))\n", "xy_data.add_error(axis='x', err_val=stdv(uT_P2))\n", "xy_data.add_error(axis='y', err_val=stdv(uT_P2))\n", "fitlist[1] = kafe2.Fit(data=xy_data, model_function=praezModelm2)\n", "fitlist[1].add_parameter_constraint(name='m2', value=nomv(m2), uncertainty=stdv(m2))\n", "fitlist[1].add_parameter_constraint(name='k', value=9.81, uncertainty=0.01)\n", "fitlist[1].add_parameter_constraint(name='r2', value=nomv(r2), uncertainty=stdv(r2))\n", "fitlist[1].data_container.axis_labels = (\"Frequenz in Hz\", \"Periodendauer in s\")\n", "fitlist[1].data_container.label = \"Präzession bei \"+ str(np.around(nomv(m2),3))+\"kg im Abstand von \"+str(np.around(nomv(r2),3))+\"m\"\n", "fitlist[1].model_label = \"Parametrization\"\n", "\n", "xy_data = kafe2.XYContainer(x_data=nomv(uw_Pv3), y_data=nomv(uT_P3))\n", "xy_data.add_error(axis='x', err_val=stdv(uT_P3))\n", "xy_data.add_error(axis='y', err_val=stdv(uT_P3))\n", "fitlist[2] = kafe2.Fit(data=xy_data, model_function=praezModelm3)\n", "fitlist[2].add_parameter_constraint(name='m3', value=nomv(m3), uncertainty=stdv(m3))\n", "fitlist[2].add_parameter_constraint(name='k', value=9.81, uncertainty=0.01)\n", "fitlist[2].add_parameter_constraint(name='r3', value=nomv(r3), uncertainty=stdv(r3))\n", "fitlist[2].data_container.axis_labels = (\"Frequenz in Hz\", \"Periodendauer in s\")\n", "fitlist[2].data_container.label = \"Präzession bei \"+ str(np.around(nomv(m3),3))+\"kg im Abstand von \"+str(np.around(nomv(r3),3))+\"m\"\n", "fitlist[2].model_label = \"Parametrization\"\n", "\n", "\n", "# Nutation Fit without added \n", "xy_data = kafe2.XYContainer(x_data=nomv(uw1), y_data=nomv(uw_N1)) #change number of data\n", "xy_data.label = 'Messung ohne Zusatzgewichte'\n", "xy_data.add_error(axis='x', err_val=stdv(uw1))\n", "xy_data.add_error(axis='y', err_val=stdv(uw_N1))\n", "fitlist[3] = kafe2.Fit(data=xy_data, model_function=noMNutModel)\n", "fitlist[3].data_container.axis_labels = (\"Frequenz in Hz\", \"Nutationsfrequenz in Hz\")\n", "\n", "# Nutation Fit with added \n", "xy_data = kafe2.XYContainer(x_data=nomv(uw2), y_data=nomv(uw_N2)) #change number of data\n", "xy_data.label = 'Messung mit Zusatzgewichten'\n", "xy_data.add_error(axis='x', err_val=stdv(uw2))\n", "xy_data.add_error(axis='y', err_val=stdv(uw_N2))\n", "fitlist[4] = kafe2.Fit(data=xy_data, model_function=MNutModel)\n", "fitlist[4].data_container.axis_labels = (\"Frequenz in Hz\", \"Nutationsfrequenz in Hz\")\n", "fitlist[4].add_parameter_constraint(name='θ_Z', value=nomv(θ_Z), uncertainty=stdv(θ_Z))\n", "\n", "\n", "# Construct a MultiFit object\n", "multi_fit = MultiFit(fit_list=fitlist, minimizer='iminuit')\n", "multi_fit.limit_parameter(\"θ_x\",1E-12,None)\n", "multi_fit.limit_parameter(\"θ_y\",1E-12,None)\n", "multi_fit.limit_parameter(\"θ_Z\",1E-12,None)\n", "\n", "# Do the fit\n", "multi_fit.do_fit()\n", "\n", "# Darstellung\n", "plot = kafe2.Plot(multi_fit, separate_figures=True)\n", "plot.plot()\n", "plot.show()\n", "\n", "nm1,nr1,nk,nθ_z,nb1,nm2,nr2,nb2,nm3,nr3,nb3,nθ_x,nθ_y,nθ_Z = multi_fit.parameter_values \n", "Δm1,Δr1,Δk,Δθ_z,Δb1,Δm2,Δr2,Δb2,Δm3,Δr3,Δb3,Δθ_x,Δθ_y,Δθ_Z = multi_fit.parameter_errors\n", "\n", "%m Die $\\chi^2$ Wahrscheinlichkeit ist 1 und $\\frac{\\chi^2}{ndof}$ nicht sehr weit von 1 entfernt, sodass der Fit als gut betrachtet wird. Auffällig sind trotzdem die verhältnismäßig großen Fehler. Diese sind vermutlich besonders in der Zeitmessung und den schlecht ablesbaren Nutationsfrequenzen begründet.\n", "\n", "%m Es ergaben sich folgende Werte für die Trägheitsmomente: $\\theta_x = ([!nθ_x:.3f!] \\pm [!Δθ_x:.3f!] )\\,kg\\,m^2$, $\\theta_y = ([!nθ_y:.3f!] \\pm [!Δθ_y:.3f!] )\\,kg\\,m^2$ und $\\theta_z = ([!nθ_z:.3f!] \\pm [!Δθ_z:.3f!] )\\,kg\\,m^2$. Diese Werte sind durchaus realistisch und.\n", "\n", "### Berechnung von M_Rotor\n", "d_Rotor = ufloat(13.5E-2,0.01E-2)\n", "nθ_z = ufloat(nθ_z,Δθ_z)\n", "M_Rotor = 8*nθ_z*d_Rotor**(-2)\n", "\n", "%m
Berechnung des Rotorgewichts aus den Trägheitsmomenten
\n", "%m Aus den im Fit bestimmten Trägheitsmomenten wird nun dan Gewicht des Rotors zu $M_{Rotor} = ([!nomv(M_Rotor):.2f!]\\pm [!stdv(M_Rotor):.2f!])\\,kg$ bestimmt. Dabei geht auch noch der Durchmesser des Rotors von $d_{Rotor} = ([!nomv(d_Rotor):.2f!]\\pm [!stdv(d_Rotor):.4f!])\\,m$ mit ein.\n", "%m Dieses Ergebnis klingt durchaus realistisch, würde bei diesem Gewicht weder der Tisch kaputt gehen, noch eine zu kleine Masse Rotationsenergie aufnehmen. Die Größe des Fehlers ist für die gegebenen Messmittel erstaunlich klein." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "argv": [ "/usr/bin/python3", "-m", "ipykernel", "--matplotlib=inline", "-c", "%config InlineBackend.figure_formats = set(['retina'])\nimport matplotlib; matplotlib.rcParams['figure.figsize'] = (12, 7)", "-f", "{connection_file}" ], "display_name": "Python 3 (Ubuntu Linux)", "env": {}, "language": "python", "name": "python3-ubuntu", "resource_dir": "/usr/local/share/jupyter/kernels/python3-ubuntu" }, "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" } }, "nbformat": 4, "nbformat_minor": 4 }