{ "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-23, 24, 25 (Stand: Oktober 2023)\n", "\n", "[Raum F1-10](https://labs.physik.kit.edu/img/Praktikum/Lageplan_P1.png)\n", "\n", "\n", "\n", "# Aeromechanik" ] }, { "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_" ] }, { "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", "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 matplotlib.image as mpimg\n", "\n", "\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.\n", "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", "\n", "def pltimg(path):\n", " img = mpimg.imread(path)\n", " imgplot = plt.imshow(img)\n", " plt.axis('off')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Durchführung\n", "\n", "## Aufgabe 1: Messmethoden \n", "\n", "**Bei den folgenden Aufgaben handelt es sich um Demonstrationsversuche.** Sie dienen der Verdeutlichung des Druck-Geschwindigkeits-Gesetzes, sowie der verwendeten Messmethoden. \n", "\n", "### Aufgabe 1.1: Dynamischer Druck\n", "\n", "Halten Sie eine Rohrsonde parallel zur Strömungsrichtung in den Luftstrom und beobachten Sie die Feinmanometeranzeige bei Motordrehzahlen von $2600\\,\\mathrm{U/min}$ und $1600\\,\\mathrm{U/min}$. Drehen Sie jetzt die Rohrsonde so, dass sie senkrecht zur Strömungsrichtung steht. Was beobachten Sie am Manometer?\n", "\n", "Verwenden Sie jetzt die Scheibensonde: richten Sie deren Rohr wie oben parallel und senkrecht zur Strömungsrichtung aus. Vergleichen Sie das Ergebnis mit dem der Rohrsonde. Diskutieren Sie, welchen Druck Sie mit welcher Methode jeweils messen. Schließen Sie daraus auf geeignete Messmethoden für statischen Druck, Gesamtdruck und dynamischen Druck.\n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In dieser Aufgabe soll der Einfluss der Strömungsrichtung auf die Messungen einer Rohr- und einer Scheibensonde untersucht werden.\n", "\n", "Scheibensonde\n", "\n", "| | Parallel | Senkrecht |\n", "| :--------- | :------: | :-------: |\n", "| 2604 U/min | 99 pa | 11 pa |\n", "\n", "Rohrsonde\n", "\n", "| | Parallel | Senkrecht |\n", "| :--------- | :------: | :-------: |\n", "| 2604 U/min | 97 pa | 62 pa |\n", "\n", "Die Bernulli\\-Gleichung besagt, dass der Gesamtdruck $p_{tot}$ entlang einer Stromlinie konstant ist und der Summe aus Staudruck $p_{dyn}$ und $p_{stat}$ dem statischen Druck zusammensetzt, also $p_{tot} = p_{dyn} + p_{stat}$ \\(Quelle: Vorbesprechung im Tutorium\\).\n", "An den Daten sieht man, dass der Druck in paralleler Ausrichtung immer höher ist, als in senkrechter Ausrichtung. Das liegt daran, dass es in paralleler Ausrichtung einen zusätzlichen Beitrag durch den Staudruck $p_{dyn}$ gibt. Da der Geschwindigkeitsvektor in senkrechter Ausrichtung ortogonal zur Rohrsonde ist, fällt dieser bei dieser Ausrichtung weg. Die Platte an der Scheibensonde sorgt dafür, dass es weniger verwirbelungen an der Spitze der Sonde gibt, da sie schon vor der Öffnung des Rohrs Strömungen parallel zum Rohr dämpft. Bei der Rohrsonde hingegen gibt es noch einen Beitrag durch dynamischen Druck der Verwirbelungen. \\(Ein Offset des Feinmanometers von \\+4 pa wurde schon abgezogen.\\)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 1.2: Venturirohr\n", "\n", "Messen und skizzieren Sie den Verlauf des statischen Drucks und beobachten Sie den Gesamtdruck längs der Strömung im Venturirohr. Vergleichen Sie mit Ihren Erwartungen. Sie müssen aufgrund der Geometrie beim Messen mit Abweichungen von Ihrer Erwartung rechnen.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Für die Beschreibung des Venturirohrs wird angenommen, dass Luft unter den Vorraussetzungen des Experiments als inkompressibel angemommen werden kann. Der Querschnitt in der Mitte des Rohrs ist kleiner als am Eingang und am Ausgang. Folglich ist die Strömungsgeschwindigkeit in der Mitte antiproportional zur Querschnittsfläche größer als an den beiden Enden. Nach der Energieerhaltung im Medium muss der statische Druck in der Mitte entsprechend geringer sein als an den beiden Enden. Dieser Zusammenhang wird insbesondere inder Kontinuitätsgleichung abgebildet. Demnach steigt die Flüssigkeit in den Röhrchen in der Mitte wesentlich höher als am Rand (Beträchtet wird das dem Luftstrom zugewandte Ende der Flüssigkeitssäule). \n", "Der zusätzliche Effekt, dass die Flüssigkeit am Anfang und am Ende des Röhrchens unterschiedlich stark ausgelekt ist rührt daher, dass der Luftstrom nicht laminar ist und die Öffnungen der Röhrchen nicht normal zum Luftstrom ausgerichtet sind.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "pltimg(\"Venturirohr.jpg\")" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### Aufgabe 1.3: Aerodynamisches Paradoxon \n", "\n", "Lassen Sie Druckluft axial zentrisch zwischen zwei eng aneinanderliegenden Kreisscheiben einströmen, so dass sie radial nach außen entweicht. Erklären Sie das Ergebnis.\n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Platte wird nicht wie erwartet weggepustet, sondern wird in Richtung des Luftstroms gezogen. Das liegt daran, dass die strömende Luft eine hohe Geschwindigkeit hat und damit auch der dynamische Druck an der Innenseite einen größeren Teil des Gesamtdrucks ausmacht. Dieser Zusammenhang folgt auch aus der Bernulligleichung. Auf die Platte wirkt allerdings nur der statische Druck, da die Strömungsrichtung natürlich parralel zur Plattenoberfläche ist. Auf der Außenseite sind Gesamtdruck und statischer Druck gleich, da die Luft steht. Also entsteht eine Druckdifferenz die dafür sorgt, dass ein anpressene Kraft entsteht.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 2: Messaufbau \n", "\n", "### Aufgabe 2.1: Ortsunabhängigkeit der Geschwindigkeit des Luftstroms \n", "\n", "Messen Sie den Staudruck $p_{d}$ (dynamischer Druck) an verschiedenen Orten im Luftstrom. Überzeugen Sie sich davon, dass die Geschwindigkeit des Luftstroms für die folgenden Versuche ausreichend ortsunabhängig ist. Geben Sie die Grenzen dafür an und legen Sie den Ort für die umströmten Körper für die folgenden Versuche fest. Stellen Sie den Verlauf des Staudrucks graphisch dar (z.B. $\\ell = 10,\\,20,\\,30,\\,35\\,\\mathrm{cm}$ vom Düsenrand entfernt; $\\Delta r = 1.0\\,\\mathrm{cm}$; $0\\leq r\\leq5\\,\\mathrm{cm}$; Drehzahl: $2600\\,\\mathrm{U/min}$).\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%m In dieser Aufgabe soll die Ortsabhängigkeit der Strömungsgeschwindigkeit untersucht werden. Dafür wird an verschiendenen Stellen im Luftstrom der dynamische Druck bestimmt und daraus die Strömungsgeschwindigkeit berechnet.\n", "\n", "%m Wir haben bei der ersten Messung folgende Werte erhalten.\n", "mpg = pd.read_csv('A21.csv')\n", "mpg.rename(columns={'l': 'Abstand in m','p': 'Dynamischer Druck in pa', 'r': 'Radius in m'}, inplace=True)\n", "display(mpg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l, r, p = np.genfromtxt('A21.csv', delimiter=',')[1:].transpose()\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111, projection='3d')\n", "ax.set_xlabel(\"Radius in m\")\n", "ax.set_ylabel(\"Abstand in m\")\n", "ax.set_zlabel(\"$p_{Dyn}$ in pa\")\n", "surf = ax.plot_trisurf(r,l,p)\n", "plt.show()\n", "\n", "cs = plt.contour([0.1,0.2,0.3,0.33],[0.0,0.01,0.02,0.03,0.04,0.05],p.reshape(4,6).transpose(),5)\n", "plt.clabel(cs, inline=1, fontsize=10)\n", "plt.ylabel(\"Radius in m\")\n", "plt.ylabel(\"Abstand in m\")\n", "plt.title(\"Druck in pa\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wie an den Höhenlinien zu erkennen ist, ist der Gradient in radiale Richtung beim Radius $r=0 m$ und Abstand $a=0.1 m$ am geringsten. Da noch ein wenig mehr Platz für den Kraftmesser am Anfang der Schiene benötigt wird, haben wir einen Abstand von 0.20 m zur Düse als Messpunkt für die restlichen Aufgaben gewählt.\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### Aufgabe 2.2: Geschwindigkeit des Luftstroms als Funktion der Drehzahl \n", "\n", "Für einige der folgenden Aufgaben ist es notwendig, die Geschwindigkeit $v$ des Luftstroms in Abhängigkeit von der Drehzahl des die Strömung verursachenden Motors ($> 600\\,\\mathrm{U/min}$) zu kennen. Messen Sie diese an einem zuvor festgelegten Ort.\n", "\n", "---\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#entschieden für Messungen im Abstand von 20 cm vom Ventilator und einem Radius von 0\n", "#offset von 4\\pm1 Pascal\n", "%m Wir haben folgende Messwerte abgelesen, wobei noch ein Offset von $+4$pa, den das Feinmanometer auch ohne angelegten Druck angezeigt hat, abgezogen werden muss. Die statistischen Unsicherheiten wurden jeweils aus den Schwankungen der Messgeräte abgeschätzt.\n", "\n", "mpg = pd.read_csv('A22.csv')\n", "mpg.rename(columns={'f': 'Drehzahl in rpm','pdyn': r'$p_{Dyn}$ in pa', 'dpdyn': 'Unsicherheit in pa','df': 'Unsicherheit in rpm'}, inplace=True)\n", "display(mpg)\n", "\n", "f, p, Δp,Δf = np.genfromtxt('A22.csv', delimiter=',')[1:].transpose()\n", "up = unumpy.uarray(p, Δp)\n", "uf = unumpy.uarray(f, Δf)\n", "\n", "uρ_luft = ufloat(1.29, 0.02)\n", "%m Der dynamische Druck steht mit der Strömungsgeschwindigkeit über die Formel $p_{Dyn} = \\frac{\\rho v**2}{2}$ im Zusammenhang (Quelle: Vorbesprechung im Praktikum). Die Dichte der Umgebungsluft beträgt $[!uρ_luft.n:.2f!]\\,\\frac{kg}{m^3}$ (Quelle: Becker et al.: Formel Sammlung. Cornelsen schulverlag, Berlin, 1. Auflage 2016, ISBN: 978-3-8355-1263-4). Für die Unsicherheit haben wir $[!uρ_luft.s:.2f!]\\,\\frac{kg}{m^3}$ als angemessenen Wert gewählt, da Temperaturschwankungen die Messungen beeinflussen können. Damit lässt sich die Strömungsgeschwindigkeit $v$ über der Drehzahl $f$ auftragen.\n", "\n", "uv = (2 * up / uρ_luft)**(1/2)\n", "\n", "uplot(uf, uv, capsize=3, fmt=\"o\")\n", "plt.ylabel(r\"Windgeschwindigkeit in $\\frac{m}{s}$\")\n", "plt.xlabel(r\"Drehzahl in $\\frac{1}{min}$\")\n", "plt.show()\n", "\n", "%m Es ist zu sehen, dass die Punkte durch eine Gerade approximierbar sind. Wir nehmen als Modell an, dass $v = fm+b$. Daraus folgt, dass $p_{dyn}=\\frac{\\rho_{\\mathrm{Luft}}}{2} (f c)^2$ was als Modell mit Kafe2 an die Messdaten gefittet werden kann.\n", "\n", "def model(f, pluft, m=0.004, b=0.09):\n", " return pluft/2*(f*m+b)**2\n", "\n", "xy_data = kafe2.XYContainer(x_data=nomv(f), y_data=nomv(up))\n", "xy_data.add_error(axis='x', err_val=stdv(uf))\n", "xy_data.add_error(axis='y', err_val=stdv(up))\n", "fit2 = kafe2.Fit(data=xy_data, model_function=model)\n", "fit2.add_parameter_constraint(name='pluft', value=uρ_luft.n, uncertainty=uρ_luft.s)\n", "\n", "fit2.do_fit()\n", "p = kafe2.Plot(fit2)\n", "p.x_label = '$f$ in rpm'\n", "p.y_label = '$p_dyn$ in pa'\n", "p.plot()\n", "p.show()\n", "\n", "_, m, b = fit2.parameter_values\n", "_, Δm, Δb = fit2.parameter_errors\n", "um = ufloat(m,Δm)\n", "ub = ufloat(b,Δb)\n", "\n", "uv_func = lambda uf: uf*um+ub\n", "\n", "%m Damit haben wir eine Abhängigkeit $v = f\\cdot [!um.n!]\\frac{\\mathrm{m}\\cdot\\mathrm{min}}{s}+[!ub.n!]\\mathrm{\\frac{m}{s}}$. Die entsprechenden Unsicherheiten auf den Parametern sind dem Plot zu entnehmen und werden in den folgenden Aufgaben mit berücksichtigt." ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Aufgabe 3: Strömungswiderstand\n", "\n", "### Aufgabe 3.1: Rücktrieb und Stirnfläche \n", "\n", "Messen Sie bei konstanter Strömungsgeschwindigkeit (für $2600\\,\\mathrm{U/min}$) den Strömungswiderstand der drei Kreisscheiben sowie des Haltestiels. Korrigieren Sie die Werte und setzen Sie diese zu den jeweiligen Flächen ins Verhältnis. Welche Folgerungen können Sie aus dieser Messung ziehen?\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%m In dieser Messung werden die Strömungswiderstände der verschiedene Kreisscheiben bestimmt, um einen Zusammenhang mit der Querschnittsfläche zu untersuchen.\n", "uF_stab = ufloat(2E-2,5E-3)\n", "%m Die Messung des Strömungswiderstands des Haltestiels hat $[!uF_stab.n!]\\,N\\pm [!uF_stab.s!]\\,N$ ergeben, bei einer Drehzahl von $2607\\,rpm\\pm 5\\,rpm$.\n", "\n", "ur = uarr([0.0418,0.0555,0.0898],np.array([.5,.5,.5])*1E-3)\n", "uF = uarr([0.18,0.28,0.49],[0.005,0.01,0.015]) - uF_stab\n", "\n", "%m Die Messung der Kreisscheiben ergab folgende Werte:\n", "ratio = uF/(pi*ur**2)\n", "td = np.array((nomv(ur), nomv(uF), nomv(ratio), stdv(ratio))).transpose()\n", "df = pd.DataFrame(td, columns=[\"Radius in m\", \"Kraft in N\", \"Kraft pro Fläche in N/m^2\", \"Unsicherheit in N/m^2\"])\n", "display(df)\n", "%m Dabei wurde für den Radius eine Messunsicherheit von 0.5mm mit dem Messschieber angenommen und der Strömungswiderstand schon um den Strömungswiderstand des Haltestiels korrigiert.\n", "\n", "plt.errorbar(nomv(ur), nomv(uF), xerr=stdv(ur), yerr=stdv(uF), fmt='.', capsize=3, label=\"Messpunkte\")\n", "\n", "coef = np.polyfit(nomv(ur),nomv(uF),1)\n", "poly1d_fn = np.poly1d(coef) \n", "plt.plot(nomv(ur), poly1d_fn(nomv(ur)), '--k', label=\"Lineare Regression\")\n", "plt.ylabel(\"Korrigierter Strömungswiderstand in N\")\n", "plt.xlabel(\"Radius in m\")\n", "plt.legend()\n", "plt.show()\n", "\n", "\n", "%m Aus dieser Messung kann man eigentlich keine soliden Folgerungen ziehen, da lediglich drei Messpunkte enthalten sind. Man sieht allerdings, dass die drei Messpunkte gut durch eine Gerade repräsentiert werden können, was die Möglichkeit eines linearen Zusammenhangs zwischen Radius und Strömungswiderstand nahelegt. Das in der Tabelle aufgetrage Verhältnis von Querschnittsfläche und Strömungswiderstand ist jedenfalls nicht konstant und legt keinen linearen Zusammenhang nahe." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 3.2: Rücktrieb und Strömungsgeschwindigkeit: \n", "\n", "Messen Sie bei zwei Kreisscheiben den Strömungswiderstand in Abhängigkeit von der Windgeschwindigkeit (Staudruck $p_{d}$). Tragen Sie den Widerstand über $p_{d}$ auf und schließen Sie auf die Form der Abhängigkeit (Drehzahlen wie für **Aufgabe 2.2**).\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%m Im folgenden Versuch soll die Abhängigkeit des Strömungswiderstands von der Windgeschwindigkeit untersucht werden. Wir haben für diesen Versuch die große und die mittelgroße Kreisscheibe gewählt, da bei bei der kleinen Kreisscheibe die Unebenheiten der Schiene und Reibungswiderstände aufgrund der kleineren Kräft wesentliche Messfehler verursachen können. Die Unsicherheiten auf Drehzahl und Kraft wurden wieder aus der Schwankung der Messgeräte abgeschätzt.\n", "\n", "ur1 = ufloat(0.0898,.5E-3)/2\n", "ur2 = ufloat(0.0555,.5E-3)/2\n", "\n", "%m Messdaten für $r = [!ur1.n!]\\,\\mathrm{m} \\pm [!ur1.s!]\\,\\mathrm{m}$\n", "mpg = pd.read_csv('A32_1.csv')\n", "mpg.rename(columns={'f': 'Drehzahl in rpm','df': 'Unsicherheit in pa','F': 'Kraft in N', 'dF': 'Unsicherheit in N'}, inplace=True)\n", "display(mpg)\n", "\n", "%m Messdaten für $r = [!ur2.n!]\\,\\mathrm{m} \\pm [!ur2.s!]\\,\\mathrm{m}$\n", "mpg = pd.read_csv('A32_2.csv')\n", "mpg.rename(columns={'f': 'Drehzahl in rpm','df': 'Unsicherheit in pa','F': 'Kraft in N', 'dF': 'Unsicherheit in N'}, inplace=True)\n", "display(mpg)\n", "\n", "%m Der Staudruck kann über den oben bestimmten Zusammenhang zwischen Drehzahl und Strömungsgeschwindigkeit ausgerechnet werden $p = \\frac{v^2 \\rho_{luft}}{2}$.\n", "\n", "f1, Δf1, F1, ΔF1 = np.genfromtxt('A32_1.csv', delimiter=',')[1:].transpose()\n", "f2, Δf2, F2, ΔF2 = np.genfromtxt('A32_2.csv', delimiter=',')[1:].transpose()\n", "uf1 = uarr(f1, Δf1)\n", "uF1 = uarr(F1, ΔF1)\n", "uf2 = uarr(f2, Δf2)\n", "uF2 = uarr(F2, ΔF2)\n", "\n", "up1 = uv_func(uf1)**2*uρ_luft/2\n", "up2 = uv_func(uf2)**2*uρ_luft/2\n", "\n", "uplot(up1,uF1, capsize=3, fmt=\"og\", label=f\"r={ur1.n}m\")\n", "coef = np.polyfit(nomv(up1),nomv(uF1),1)\n", "poly1d_fn = np.poly1d(coef) \n", "plt.plot(nomv(up1), poly1d_fn(nomv(up1)), \"--g\")\n", "\n", "uplot(up2,uF2, capsize=3, fmt=\"ok\", label=f\"r={ur2.n}m\")\n", "coef = np.polyfit(nomv(up2),nomv(uF2),1)\n", "poly1d_fn = np.poly1d(coef) \n", "plt.plot(nomv(up2), poly1d_fn(nomv(up2)), \"--k\")\n", "\n", "plt.ylabel(\"Strömungswiderstand in N\")\n", "plt.xlabel(\"$p_{dyn}$ in pa\")\n", "\n", "plt.legend()\n", "plt.show()\n", "\n", "%m Wie man sieht lassen sich die Daten gut durch eine Gerade darstellen. Somit liegt ein linearer Zusammenhang nahe. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 3.3: Rücktrieb und Körperform \n", "\n", "Messen Sie bei konstanter Drehzahl den Strömungswiderstand der rotationssymmetrischen Widerstandskörper (Kugel, Halbkugel, Stromlinienkörper glatt) in beiden Richtungen. Stellen Sie nun die Widerstandsformel zusammen und bestimmen Sie die Widerstandsbeiwerte $c_{w}$ der Widerstandskörper. Diskutieren Sie das Ergebnis und vergleichen Sie mit Tabellenwerten.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "uf = ufloat(2610,5)\n", "ur = ufloat(0.056, 5E-4)/2\n", "\n", "%m Es wurde bei einer Drehzahl von 2610rpm$\\pm$ 5rpm gemessen. Der Radius wurde mit 0.056m $\\pm$ 0.5mm bestimmt. Die Widerstandsformel besagt, dass $c_w = \\frac{F}{p_{Dyn} A}$ (Quelle: Vorbesprechung im Praktikum) mit der Querschnittsfläche A. Auch hier wird wie zuvor $p_{Dyn}$ aus der Drehzahl errechnet. Die 'Normale' Richtung ist dabei immer die, bei der das Kugelförmige ende des Körpers zur Windquelle zeigt.\n", "\n", "uA=np.pi*ur**2\n", "\n", "name, F, ΔF = np.genfromtxt('A33.csv', delimiter=',')[1:].transpose() # Hier wurde in der V0 bei der Unsicherheit der Kraft konstant eine 0 vergessen. Deswegen war die unsicherheit um einen Faktor 10 zu groß. Sie sollte 0.01N sein, war aber 0.1N\n", "uF = unumpy.uarray(F, ΔF)\n", "\n", "ucw = 2*uF/uv_func(uf)**2/uA/uρ_luft\n", "#Stromlinienkörper ca. 10 cm weiter vorne\n", "mpg = pd.read_csv('A33.csv')\n", "mpg.rename(columns={\"F\": 'Strönmungswiderstand in N', 'dF': 'Unsicherheit in N'}, inplace=True)\n", "mpg[\"c_w\"] = nomv(ucw)\n", "mpg[\"Unsicherheit\"] = stdv(ucw)\n", "mpg[\"Vergleichswerte\"] = [\"0.09 bis 0.45\", \"0.34\", \"1.33\", \"0.04\", \"\"]\n", "display(mpg)\n", "\n", "%m Man sieht, dass die gemessenen Werte im Rahmen des Versuchsaufbaus gut zu den gefundenen Vergleichswerten passen. Der Vergleichswert für die Kugel deckt einen sehr großen Bereich ab (abhängig von der Reynolds-Zahl die wir im Versuch nicht bestimmt haben) in dem unser Messwert gut mittig liegt. Der Wert für die inverse Halbkugel stimmt zufällig äußerst gut mit dem Vergleichswert überein, wohingegen der normale Wert um 50% abweicht. Das dürfte unter anderem daran liegen, dass der Luftstrom alles andere als Laminar war. Der Wert für den Stromlinienkörper weicht wesentlich vom Vergleichswert ab, was daran liegt, dass seine axiale Ausdehnung (>10cm) viel größer war als bei den anderen Körpern, sodass die Strömungsgeschwindigkeit wesentlich vom vorher bestimmten Zusammenhang mit der Drehzahl abweicht und somit kein akkurater Druck für die Formel bestimmt werden konnte. (Quelle für Vergleichswerte: de.wikipedia.org/wiki/Strömungswiderstandskoeffizient abgerufen am 24.11.23)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 3.4: $c_{w}$-Wert eines Modellautos \n", "\n", "Bestimmen Sie den $c_{w}$-Wert eines Modellautos. Sie können auch ein eigenes Modell mitbringen, die zur Verfügung stehende Stellfläche beträgt ${\\approx}8\\times10\\,\\mathrm{cm^{2}}$.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Kraftoffset: 0.04\n", "uf = ufloat(2640,3)\n", "ux = ufloat(31.5E-3, 5E-4)\n", "uy = ufloat(22.5E-3, 1E-3)\n", "\n", "uA=ux*uy\n", "\n", "uF = ufloat(0.09, 0.005) - ufloat(0.04, 0.005)\n", "\n", "ucw = 2*uF/uv_func(uf)**2/uA/uρ_luft\n", "\n", "%m Für das Matchboxauto mit einer Querschnittsfläche von [!uA.n:.4f!] m² wurde bei einer Drehzahl von [!uf.n!] rpm ein Strömungswiderstand von [!uF.n:.2f!] N gemessen. Damit ergibt sich ein $c_w$-Wert von [!ucw.n:.2f!] mit einer Unsicherheit [!ucw.s:.2f!]. Der Wert liegt in einem plausiblen bereich für ein solches kastenförmiges Auto von 0.9 bis 0.44 (Quelle: https://www.cw-wert.de/ abgerufen am 24.11.23)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 4: \n", "\n", "Nachdem die Faktoren bekannt sind, die den unerwünschten Strömungswiderstand beeinflussen, wenden Sie sich dem Aufbau und der Wirkungsweise eines Tragflügels zu. Installieren Sie hierzu die Auftriebswaage und den Treibflügel gemäß der Gebrauchsanweisung.\n", "\n", "### Aufgabe 4.1: Polardiagramm\n", "\n", "Messen Sie bei konstanter Windgeschwindigkeit (zu $2600\\,\\mathrm{U/min}$) den Auftrieb und den Strömungswiderstand als Funktion des Anstellwinkels $\\alpha$ (in einem Bereich von $-20^{\\circ}\\leq\\alpha\\leq20^{\\circ}$ in Schritten von $\\Delta\\alpha = 5^{\\circ}$). Tragen Sie den Widerstand und den Auftrieb als Funktion von $\\alpha$, und die Auftriebswerte über dem Widerstand (in einem Polardiagramm) auf. Bestimmen Sie die günstigste Gleitzahl als reziproke Steigung aus dem Polardiagramm. Welcher Gleitwinkel ergibt sich daraus? Diskutieren Sie die Bedeutung dieser Größe. Was sollte zur Verbesserung der Flugeigenschaften unternommen werden?\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "uf = ufloat(2582,5)\n", "\n", "%m Im folgenden sollen die Charakteristiken des Flügels in abhängigkeit des Winkels untersucht werden. Unsere Messdaten sind:\n", "\n", "mpg = pd.read_csv('A41.csv')\n", "mpg.rename(columns={\"a\": 'Winkel in °', 'Fs': 'Strömungswiderstand in N', 'Fa': \"Auftrieb in N\"}, inplace=True)\n", "display(mpg)\n", "\n", "a, Fs, Fa = np.genfromtxt('A41.csv', delimiter=',')[1:].transpose()\n", "ar = a/180*np.pi\n", "\n", "%m Zur Veranschaulichtung wurden beide Größen einnmal über dem Winkel aufgetragen.\n", "plt.plot(ar,Fs,'o', label=\"Strömungswiderstand\")\n", "plt.plot(ar,Fa,'o', label=\"Auftriebskraft\")\n", "plt.xlabel(\"Kraft in N\")\n", "plt.xlabel(\"Winkel in °\")\n", "plt.legend()\n", "plt.show()\n", "\n", "%m Die Gleitzahl ergibt sich als Quotient von Auftriebskraft und Strömungswiderstand (Quelle: Aeromechanik-Literaturmappe) und ist im folgenden über den Winkel aufgetragen.\n", "\n", "plt.title(\"Gleitzahl\")\n", "plt.plot(a,Fa/Fs,'o')\n", "plt.ylabel(\"Gleitzahl\")\n", "plt.xlabel(\"Winkel in °\")\n", "plt.show()\n", "\n", "%m Es ist zu sehen, dass die Maximale Gleitzahl bei 15° mit einem Wert von [!np.max(Fa/Fs):.2f!] erreicht wird. Möchte man also mit diesem Flügel möglichst weit gleiten ohne weiteren Antrieb sollte man an einen Winkel von 15° zur anströhmenden Luft wählen. Zur verbesserung der Flugeigenschaften könnte die Form des Flügels weiter optimiert werden oder eine reibungsärmere Oberflächenbeschichtung aufgebracht werden, um den Strömungswiderstand zu reduzieren. \n", "\n", "%m Aus der Gleitahl ergibt sich ein Gleitwinkel von $γ = \\arctan{\\frac{1}{\\epsilon}} = [!np.arctan(1/np.max(Fa/Fs))*180/pi!]$ was doch schon recht steil erscheint und sich nicht besonders gut für ein Segelflugzeug einen würde." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aufgabe 4.2: Druckprofil\n", "\n", "Messen Sie bei konstanter Geschwindigkeit des Luftstroms den Druck an den Messstellen des Tragflächenmodells in Abhängigkeit von $\\alpha$. Zeichnen Sie der Anschaulichkeit wegen in Querschnittskizzen der Tragfläche bei einigen Anstellwinkeln die 'Druckvektoren' an den Messstellen ein. Der Druck ist eine skalare Größe; welche Richtung ist gemeint? Schließen Sie auf den Auftrieb. Erklären Sie mit Hilfe der Ergebnisse aus **Aufgabe 4.1** und **4.2** die Wirkungsweise einer Tragfläche.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%m Der 'Druckvektor' ist ein Pseud-Vektor der senkrecht auf der Oberfläche steht und dessen Magnitude gleich dem Druck ist. Die Druckvektoren drehen sich mit der Tragfläche mit, da sie immer normal auf der Oberfläche stehen.\n", "pltimg(\"Druckvektoren.png\")\n", "%m Bildquelle: Aufgabenstellung zum Versuch Aeromechanik (Bild wurde modifiziert)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%m Im folgenden finden sich die Drücke, die wir an den verschiedenen numerierten Messpunkten für drei verschiedene Anstellwinkel gemessen haben. Die Messwerte wurden schon um den Offset des Feinmanometers korrigiert. \n", "\n", "mpg = pd.read_csv('A42.csv')\n", "for d in range(1,10):\n", " name = str(d)\n", " mpg[name] = mpg[name] - 4 * np.sign(mpg[name]) # Hier wird der Offset mit dem Korrekten Vorzeichen abgezogen.\n", "mpg.rename(columns={\"a\": 'Winkel in °'} | {str(d): f\"{d} in pa\" for d in range(1,10)}, inplace=True)\n", "display(mpg)\n", "\n", "%m Es ist zu sehen, dass Der Druck bei 0° und 20° Anstellwinkel auf der Oberseite kleiner ist als auf der Unterseite, wenn man jeweils die übereinanderliegenden Messpunkte vergleicht. Lediglich beim Anstellwinkel von -20° dreht sich das Verhältnis um. Folglich ergibt sich bei den beiden nichtnegativen Winkeln eine Netto-Auftriebskraft und beim negativen Anstellwinkel eine Netto-Abtriebskraft. Da wir die Abmessungen des Flügels nicht bestimmt haben, ist es schwierig auf eine Auftriebskraft zu schließen, da diese von der Größe des Flügels abhängt. Allerdings wäre dieser Wert aufgrund der wenigen Messpunkte ohnehin wenig aussagekräftig. \n", "\n", "%m Es lässt sich aber feststellen, dass der Auftrieb des Flügels erzielt wird, indem über die Form eine unterschiedliche Strömungsgeschwindigkeit auf Ober- und Unterseite erzeugt wird, was für unterschiedliche Kräfte auf Ober- und Unterseite der Tragfläche sorgt." ] }, { "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 }