From 4440091802f89910cb6214eb548cce9ac38f5ba6 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 25 Sep 2024 22:37:04 +0200 Subject: [PATCH 01/80] template file with step marker --- .../example-report/auswertung_template.py | 460 ++++++++++++++++++ 1 file changed, 460 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/auswertung_template.py diff --git a/exercises-toolbox/8-all/example-report/auswertung_template.py b/exercises-toolbox/8-all/example-report/auswertung_template.py new file mode 100644 index 00000000..75227dc7 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/auswertung_template.py @@ -0,0 +1,460 @@ +# Erklärung: # <2-2> +# Importiere numpy unter dem Namen np # <2-2> +import numpy as np # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Importiere matplotlib.pyplot unter dem Namen plt # <3-3> +import matplotlib.pyplot as plt # <3-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Importiere curve_fit aus scipy.optimize # <4-4> +from scipy.optimize import curve_fit # <4-6> +from scipy.constants import physical_constants # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Importiere uncertainties unter dem Namen unc # <5-6> +# Importiere uncertainties.unumpy unter dem Namen unp # <5-6> +# Importiere der Funktionen nominal_values und std_devs # <5-6> +# aus uncertainties.unumpy, unter den kürzeren Namen # <5-6> +# noms respektive stds # <5-6> +import uncertainties as unc # <5-6> +import uncertainties.unumpy as unp # <5-6> +from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> +# zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> +# es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> +# # <2-6> +# Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> +# # <2-6> +# Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> +# ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> +# nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> +# Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> +# # <2-6> +# Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> +# (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-6> +# für die meisten Messwerte. # <5-6> +# Beim Importieren der Daten muss beachtet werden, dass: # <5-6> +# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-6> +# Auch hier ist eine konsistente Benennung sinnvoll # <5-6> +# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-6> +# # <2-6> +# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-6> +# entweder durch unc.ufloat oder durch das unp.uarray # <5-6> + # <2-6> + # <2-6> +# Länge der schiefen Ebene # <2-6> +l = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",")/100 # m # <2-4> +l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-6> +l = unc.ufloat(l, l_unc) # <5-6> + # <2-6> +# Framerate der Kamera # <2-4> +# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-6> +fps = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",") # 1/s # <2-4> +fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Die Daten aus Dateien mit mehreren spalten muss man in einer extra Zeile skalieren # <2-2> +# Masse und Umfang der Kugel # <2-6> +m_b, u_b = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <2-4> +m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-6> +m_b = m_b/1000 # kg # <2-4> +u_b = u_b/100 # m # <2-4> +m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-6> +u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-6> + # <2-6> +# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-6> +h_b, Fi_b, Ff_b = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <2-4> +h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-6> +h_b = h_b/100 # m # <2-4> +h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-6> +Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-6> +Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-6> + # <2-6> + # <2-6> +# Masse und Umfang des Zylinders # <2-6> +m_c, u_c, d_c = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <2-4> +m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +m_c = m_c/1000 # kg # <2-4> +u_c = u_c/100 # m # <2-4> +d_c = d_c/100 # m # <2-4> +m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-6> +u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-6> +d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-6> + # <2-6> +# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-6> +h_c, Fi_c, Ff_c = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <2-4> +h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +h_c = h_c/100 # m # <2-4> +h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-6> +Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-6> +Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Ein gewisses Maß an Struktur in der Benennung von Variablen hilft bei der Orientierung, # <2-2> +# gerade in der Zusammenarbeit mit euren jeweiligen Partnern. # <2-2> +# Man muss es aber auch nicht übertreiben. Gerade ein Sprachenmix aus deutsch und englisch # <2-2> +# ist nicht besonders tragisch: z.B. steht m_b für mass_ball aber u_b für umfang_ball, # <2-2> +# aber das p_b für perimeter_ball würde mir persönlich nicht so klar werden. # <2-2> + # <2-6> +# Erklärung: # <2-2> +# Auch die einzelnen "Arbeitsschritte" der Auswertung sollten in einem # <2-2> +# kurzen Kommentar erklärt werden. # <2-2> +# Erklärung: # <2-2> +# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-6> + # <2-6> + # <2-6> +# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-6> + # <2-6> +# Radius der Kugel # <2-6> +r_b = u_b/(2*np.pi) # <2-6> + # <2-6> +# Äußerer Radius des Zylinders # <2-6> +ro_c = u_c/(2*np.pi) # <2-6> + # <2-6> +# Innerer Radius des Zylinders # <2-6> +ri_c = ro_c - d_c # <2-6> + # <2-6> + # <2-6> +# Trägheitsmoment der Kugel # <2-6> +I_b = 2/5 * m_b * r_b**2 # <2-6> + # <2-6> +# Trägheitsmoment des Zylinders # <2-6> +I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-6> + # <2-6> +print("Trägheitsmoment (Kugel)") # <2-6> +print(I_b) # <2-6> + # <2-6> +print("Trägheitsmoment (Zylinder)") # <2-6> +print(I_c) # <2-6> + # <2-6> + # <2-6> +# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-6> +t_b = (Ff_b - Fi_b)/fps # <2-6> +t_c = (Ff_c - Fi_c)/fps # <2-6> + # <2-6> +# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-6> + # <2-6> +# Erklärung: # <2-2> +# Es ist ein neuer Name (t_b_mean) notwendig, wenn die alten Werte in t_b # <2-2> +# noch verfügbar bleiben sollen # <2-2> +# # <2-2> +# Hieran sieht man (schon im Kleinen) die Nützlichkeit der numpy arrays # <2-2> +# und der möglichen Manipulationen: # <2-2> +# reshape(-1,3): # <2-2> +# Im array t_b liegen die zu mittelnden Werte immer genau hintereinander # <2-2> +# durch reshape(-1,3) wird aus t_b ein 2D array erzeugt, das in jeder # <2-2> +# Zeile 3 Spalten hat. Das bedeutet: Nach jeweils 3 Werten in t_b wird eine neue # <2-2> +# Zeile begonnen, damit sind in jeder Zeile genau die Werte die gemittelt werden sollen. # <2-2> +# Die -1 als Anzahl der Zeilen ist gibt numpy die Anweisung, diese Anzahl # <2-2> +# selbst zu berechnen. # <2-2> +# # <2-2> +# mean(axis=1): # <2-2> +# Bei einem 2D array bezeichnet axis=0 die Zeilen und axis=1 die Spalten. # <2-2> +# Berechnet den Mittelwert "entlang der axis 1", d.h. die axis 1 ist die "Dimension" # <2-2> +# des arrays, über die summiert wird (die danach nur noch einen Wert enthält). # <2-2> +# Da jede Zeile genau die drei Werte enthält, die zu mitteln sind, enthält jede # <2-2> +# Zeile danach genau den jeweiligen Mittelwert. # <2-2> + # <2-6> +t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-6> + # <2-6> +# Erklärung: # <2-2> +# Das Array h_b enthält jede Höhe dreifach, auch die Auswahl # <2-2> +# der einzelnen Höhen kann durch array Manipulation geschehen. # <2-2> +# # <2-2> +# Die Benennung der Variable (h_b_mean) wurde so gewählt, # <2-2> +# dass diese zur zugehörigen Variable für die Zeitdauern passt # <2-2> +# # <2-2> +# reshape(-1, 3): # <2-2> +# analog zur Manipulation von t_b # <2-2> +# [:,0] # <2-2> +# Aus jeder Zeile (= erster Index ist ':') wird die 'nullte' Spalte (= zweiter Index ist '0') # <2-2> +# ausgewählt, d.h. in jeder Zeile bleibt genau eine Höhe erhalten. # <2-2> + # <2-6> +h_b_mean = h_b.reshape(-1,3)[:,0] # <2-6> + # <2-6> +# Erklärung: # <2-2> +# analog für die andere Messreihe # <2-2> + # <2-6> +t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-6> +h_c_mean = h_c.reshape(-1,3)[:,0] # <2-6> + # <2-6> +# Ausgabe verarbeiteten der Messwerte # <2-6> + # <2-6> +print("Messwerte (Kugel)") # <2-6> +print("alle Zeiten") # <2-6> +print(t_b) # <2-6> +print("alle Höhen") # <2-6> +print(h_b) # <2-6> +print("Höhe") # <2-6> +print(h_b_mean) # <2-6> +print("gemittlelte Zeit") # <2-6> +print(t_b_mean) # <2-6> +print("\n") # <2-6> + # <2-6> + # <2-6> +print("Messwerte (Zylinder)") # <2-6> +print("alle Höhen") # <2-6> +print(h_c) # <2-6> +print("alle Zeiten") # <2-6> +print(t_c) # <2-6> +print("Höhe") # <2-6> +print(h_c_mean) # <2-6> +print("gemittlelte Zeit") # <2-6> +print(t_c_mean) # <2-6> +print("\n") # <2-6> + # <2-6> +# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-6> + # <2-6> +# Erklärung: # <3-3> +# Funktionen für die Funktionsgleichungen der Theorie-Funktionen # <3-3> +# # <2-6> +# In Funktionen können Variablen verwendet werden, die außerhalb (global) definiert wurden # <3-3> +# wie hier: l, ri_c und ro_c # <3-3> +# Solche globalen Variablen können bei größeren Skripten/Programmen zu einem Problem werden # <3-3> +# es ist also zumindest Vorsicht geboten # <3-3> + # <2-6> +def theory_t_ball(h): # <3-3> + return np.sqrt(7/5 * 1/h * 2* l**2/9.81) # <3-3> + # <2-6> +def theory_t_cylinder(h): # <3-3> + return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/9.81 * 1/h) # <3-3> + # <2-6> +# Erklärung: # <4-4> +# Umwandeln der Theorie-Funktion zu einer Fit-Funktion: # <4-4> +# Die Funktion erhält ein zusätzliches Argument für jeden Fitparameter, hier: g und t0 # <4-4> +# diese müssen auch in der Funktion verwendet werden. # <4-4> +# # <2-6> +# Namen sind wie immer beliebig und es gibt nicht "den einen richtigen Namen", # <4-4> +# aber es bietet sich wie immer an sprechende Namen zu verwenden, hier z.B. # <4-4> +# "fit_g_ball" als Abkürzung für "Fitfunktion für den Parameter g aus den Messwerten für die Kugel" # <4-4> + # <2-6> +def fit_g_ball(h, g, t0): # <4-6> + return np.sqrt(7/5 * 1/h * 2* l**2/g) + t0 # <4-4> + # <2-6> +def fit_g_cylinder(h, g, t0): # <4-6> + return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/g * 1/h) + t0 # <4-4> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-6> +# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-6> +# Messwerten umgehen. # <5-6> +# Folgendes muss dafür geändert werden: # <5-6> +# # <5-6> +# (1) in der Fitfunktion müssen mit der Funktion noms() # <5-6> +# die Unsicherheiten von Konstanten entfernt werden # <5-6> +# # <5-6> +# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-6> +# diese müssen mit noms() entfernt werden. # <5-6> +# # <5-6> +# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-6> +# müssen getrennt übergeben werden: noms() und stds() # <5-6> +# # <5-6> +# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-6> +# um die Unsicherheiten anzeigen zu können # <5-6> +# # <5-6> +# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-6> +# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-6> +# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-6> + # <2-6> +def fit_g_ball(h, g, t0): # <4-6> + return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-6> + # <2-6> +def fit_g_cylinder(h, g, t0): # <4-6> + return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-6> + # <2-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Hier ist Vorsicht geboten, da die Fit-Funktion und Messwerte zusammen passen müssen # <4-4> +# an solchen Stellen zahlt sich eine konsistente Benennung aus. # <4-4> +# Berechnung der Fitparameter für die Kugel # <4-6> + # <2-6> +params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> +print("Fitparameter (Kugel)") # <4-6> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> +# auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> +# Der Bereich in dem diese Werte liegen entspricht, aber dem der Messwerte ca. [0.03, 0.33] # <3-3> +h_plot = np.linspace(0.03, 0.33, 205) # <3-6> + # <2-6> + # <2-6> +# Fit Parameter für den Zylinder # <4-4> +# Fitparameter für den Zylinder # <5-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Erstellen einer figure mit einem subplot darin (1 Zeile x 1 Spalte an subplots) # <3-3> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Einstellung der Achsenbeschriftungen # <3-3> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Darstellen der Messwerte mit Legendeneintrag # <3-3> +ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> +ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> + # <2-6> +# Erklärung: # <4-4> +# Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> + # <2-6> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot_kugel.pdf") # <3-3> +fig.savefig("plot-g_kugel.pdf") # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Analog für die Messreihe des Zylinders # <4-4> +# Achtung! Copy-and-paste ist natürlich gängige Praxis, # <4-4> +# aber alle Variablen müssen angepasst werden. # <4-4> + # <2-6> +# Berechnung der Fitparameter für den Zylinder # <4-6> +params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Zylinder)") # <4-6> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <2-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> +ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> +ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot_zylinder.pdf") # <3-3> +fig.savefig("plot-g_zylinder.pdf") # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Verwenden der physikalischen Konstanten aus scipy # <4-4> +# hier: g # <4-4> +# physical_constants enthält 3er-tuple, der erste Eintrag # <4-4> +# der tuple ist der Wert der Konstante, deswegen [0] # <4-4> + # <2-6> + # <2-6> +def fit_I_ball(h, I, t0): # <4-6> + g = physical_constants["standard acceleration of gravity"][0] # <4-6> + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 # <4-4> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-6> + # <2-6> + # <2-6> +def fit_I_cylinder(h, I, t0): # <4-6> + g = physical_constants["standard acceleration of gravity"][0] # <4-6> + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-6> + # <2-6> +# Erklärung: # <4-4> +# Durch den Fit wird diese Warnung auf das Terminal ausgegeben: # <4-4> +# .../v16515/auswertung.py:197: RuntimeWarning: invalid value encountered in sqrt # <4-4> +# return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> +# # <2-6> +# Diese bedeutet, dass während des Fits negative Werte für I 'ausprobiert' wurden, # <4-4> +# von denen die Wurzel nicht berechnet werden konnte. # <4-4> +# Man kann das verhindern, in dem man die Parameter auf den physikalisch möglichen # <4-4> +# Bereich einschränkt. Dies tut man mit dem zusätzlichen Parameter bounds für curve_fit, # <4-4> +# hier müsste # <4-4> +# bounds=([0,-np.inf],[+np.inf,+np.inf]) # <4-4> +# als zusätzliches Argument für curve_fit ergänzt werden. # <4-4> +# bounds gibt den minimalen und den maximalen Wert für alle Parameter an, # <4-4> +# und zwar zuerst alle Minima und dann alle Maxima, # <4-4> +# in diesem konkreten Beispiel steht bounds also für: 0 < I < +np.inf und -np.inf < t0 < +np.inf # <4-4> + # <2-6> + # <2-6> +# Berechnung der Fitparameter für die Kugel # <4-6> +params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Kugel)") # <4-6> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> + if name == "I": # <4-6> + value *= 10000 # <4-6> + uncertainty *= 10000 # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <2-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot-I_kugel.pdf") # <4-6> + # <2-6> + # <2-6> +# Berechnung der Fitparameter für den Zylinder # <4-6> +params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Zylinder)") # <4-6> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> + if name == "I": # <4-6> + value *= 10000 # <4-6> + uncertainty *= 10000 # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <2-6> + # <2-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot-I_zylinder.pdf") # <4-6> From c37c09568f7c79a51a3408fb9caa23928af0a13e Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 25 Sep 2024 23:01:26 +0200 Subject: [PATCH 02/80] add step generation script --- .../example-report/generate-step-scripts.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/generate-step-scripts.py diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-scripts.py new file mode 100644 index 00000000..6e32ca0e --- /dev/null +++ b/exercises-toolbox/8-all/example-report/generate-step-scripts.py @@ -0,0 +1,79 @@ +import re +import sys +from collections import defaultdict + +STEPRANGEREGEX = re.compile(r"#\s<(\d)*(-(\d*)|)>") + + + +def extract_stepranges(lines): + step_ranges = [] + script_lines = [] + for i,l in enumerate(lines): + found = STEPRANGEREGEX.search(l) + if found is None: + continue + groups = found.groups() + + lower_limit = int(groups[0]) + if (not groups[1]) and (groups[2] is None): + step_range = (lower_limit, lower_limit) + elif not groups[2]: + step_range = (lower_limit, None) + else: + step_range = (lower_limit, int(groups[2])) + step_ranges.append(step_range) + script_lines.append(STEPRANGEREGEX.sub("", l).rstrip()) + + return step_ranges, script_lines + + +def step_list_from_step_range(step_range, upper_limit): + lower_limit = int(step_range[0]) + if not step_range[1] is None: + upper_limit = int(step_range[1]) + return list(range(lower_limit, upper_limit+1)) + + + +def generate_step_file_lines(template_lines): + step_ranges, script_lines = extract_stepranges(template_lines) + highest_upper_limit = max([int(sr[1]) for sr in step_ranges if sr[1]]) + 1 + + step_lists = [step_list_from_step_range(sr, highest_upper_limit) for sr in step_ranges] + + files_lines = defaultdict(list) + for sl, line in zip(step_lists, script_lines): + print(f"sl: {sl}: {line}") + for step in sl: + files_lines[step].append(line) + + + return files_lines + + +def main(): + filepath = sys.argv[1] + print(f"Filename: {filepath}") + output_filepath = filepath + if len(sys.argv) > 2: + output_filepath = sys.argv[2] + + path, ext = output_filepath.rsplit('.') + output_filepath_pattern = path + "_step-{step}." + ext + print(output_filepath, output_filepath_pattern) + with open(sys.argv[1]) as fh: + script_lines = fh.readlines() + + files_lines = generate_step_file_lines(script_lines) + + for it in files_lines.items(): + print(it) + + for step, lines in files_lines.items(): + with open(output_filepath_pattern.format(step=step), "w") as fh: + fh.write("\n".join(lines).strip()) + + +if __name__ == "__main__": + main() From 2ff5ce6b90cab79baee6c9ff62662189d804180f Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 25 Sep 2024 23:02:37 +0200 Subject: [PATCH 03/80] removed trailing spaces --- .../example-report/auswertung_template.py | 918 +++++++++--------- 1 file changed, 459 insertions(+), 459 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/auswertung_template.py b/exercises-toolbox/8-all/example-report/auswertung_template.py index 75227dc7..4008743b 100644 --- a/exercises-toolbox/8-all/example-report/auswertung_template.py +++ b/exercises-toolbox/8-all/example-report/auswertung_template.py @@ -1,460 +1,460 @@ -# Erklärung: # <2-2> -# Importiere numpy unter dem Namen np # <2-2> -import numpy as np # <2-6> - # <2-6> -# Erklärung: # <3-3> -# Importiere matplotlib.pyplot unter dem Namen plt # <3-3> -import matplotlib.pyplot as plt # <3-6> - # <2-6> - # <2-6> -# Erklärung: # <4-4> -# Importiere curve_fit aus scipy.optimize # <4-4> -from scipy.optimize import curve_fit # <4-6> -from scipy.constants import physical_constants # <4-6> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Importiere uncertainties unter dem Namen unc # <5-6> -# Importiere uncertainties.unumpy unter dem Namen unp # <5-6> -# Importiere der Funktionen nominal_values und std_devs # <5-6> -# aus uncertainties.unumpy, unter den kürzeren Namen # <5-6> -# noms respektive stds # <5-6> -import uncertainties as unc # <5-6> -import uncertainties.unumpy as unp # <5-6> -from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-6> - # <2-6> -# Erklärung: # <2-2> -# Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> -# zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> -# es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> -# # <2-6> -# Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> -# # <2-6> -# Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> -# ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> -# nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> -# Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> -# # <2-6> -# Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> -# (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-6> -# für die meisten Messwerte. # <5-6> -# Beim Importieren der Daten muss beachtet werden, dass: # <5-6> -# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-6> -# Auch hier ist eine konsistente Benennung sinnvoll # <5-6> -# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-6> -# # <2-6> -# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-6> -# entweder durch unc.ufloat oder durch das unp.uarray # <5-6> - # <2-6> - # <2-6> -# Länge der schiefen Ebene # <2-6> -l = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",")/100 # m # <2-4> -l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-6> -l = unc.ufloat(l, l_unc) # <5-6> - # <2-6> -# Framerate der Kamera # <2-4> -# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-6> -fps = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",") # 1/s # <2-4> -fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-6> - # <2-6> -# Erklärung: # <2-2> -# Die Daten aus Dateien mit mehreren spalten muss man in einer extra Zeile skalieren # <2-2> -# Masse und Umfang der Kugel # <2-6> -m_b, u_b = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <2-4> -m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-6> -m_b = m_b/1000 # kg # <2-4> -u_b = u_b/100 # m # <2-4> -m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-6> -u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-6> - # <2-6> -# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-6> -h_b, Fi_b, Ff_b = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <2-4> -h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-6> -h_b = h_b/100 # m # <2-4> -h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-6> -Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-6> -Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-6> - # <2-6> - # <2-6> -# Masse und Umfang des Zylinders # <2-6> -m_c, u_c, d_c = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-6> -m_c = m_c/1000 # kg # <2-4> -u_c = u_c/100 # m # <2-4> -d_c = d_c/100 # m # <2-4> -m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-6> -u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-6> -d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-6> - # <2-6> -# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-6> -h_c, Fi_c, Ff_c = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-6> -h_c = h_c/100 # m # <2-4> -h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-6> -Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-6> -Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-6> - # <2-6> -# Erklärung: # <2-2> -# Ein gewisses Maß an Struktur in der Benennung von Variablen hilft bei der Orientierung, # <2-2> -# gerade in der Zusammenarbeit mit euren jeweiligen Partnern. # <2-2> -# Man muss es aber auch nicht übertreiben. Gerade ein Sprachenmix aus deutsch und englisch # <2-2> -# ist nicht besonders tragisch: z.B. steht m_b für mass_ball aber u_b für umfang_ball, # <2-2> -# aber das p_b für perimeter_ball würde mir persönlich nicht so klar werden. # <2-2> - # <2-6> -# Erklärung: # <2-2> -# Auch die einzelnen "Arbeitsschritte" der Auswertung sollten in einem # <2-2> -# kurzen Kommentar erklärt werden. # <2-2> -# Erklärung: # <2-2> -# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-6> - # <2-6> - # <2-6> -# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-6> - # <2-6> -# Radius der Kugel # <2-6> -r_b = u_b/(2*np.pi) # <2-6> - # <2-6> -# Äußerer Radius des Zylinders # <2-6> -ro_c = u_c/(2*np.pi) # <2-6> - # <2-6> -# Innerer Radius des Zylinders # <2-6> -ri_c = ro_c - d_c # <2-6> - # <2-6> - # <2-6> -# Trägheitsmoment der Kugel # <2-6> -I_b = 2/5 * m_b * r_b**2 # <2-6> - # <2-6> -# Trägheitsmoment des Zylinders # <2-6> -I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-6> - # <2-6> -print("Trägheitsmoment (Kugel)") # <2-6> -print(I_b) # <2-6> - # <2-6> -print("Trägheitsmoment (Zylinder)") # <2-6> -print(I_c) # <2-6> - # <2-6> - # <2-6> -# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-6> -t_b = (Ff_b - Fi_b)/fps # <2-6> -t_c = (Ff_c - Fi_c)/fps # <2-6> - # <2-6> -# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-6> - # <2-6> -# Erklärung: # <2-2> -# Es ist ein neuer Name (t_b_mean) notwendig, wenn die alten Werte in t_b # <2-2> -# noch verfügbar bleiben sollen # <2-2> -# # <2-2> -# Hieran sieht man (schon im Kleinen) die Nützlichkeit der numpy arrays # <2-2> -# und der möglichen Manipulationen: # <2-2> -# reshape(-1,3): # <2-2> -# Im array t_b liegen die zu mittelnden Werte immer genau hintereinander # <2-2> -# durch reshape(-1,3) wird aus t_b ein 2D array erzeugt, das in jeder # <2-2> -# Zeile 3 Spalten hat. Das bedeutet: Nach jeweils 3 Werten in t_b wird eine neue # <2-2> -# Zeile begonnen, damit sind in jeder Zeile genau die Werte die gemittelt werden sollen. # <2-2> -# Die -1 als Anzahl der Zeilen ist gibt numpy die Anweisung, diese Anzahl # <2-2> -# selbst zu berechnen. # <2-2> -# # <2-2> -# mean(axis=1): # <2-2> -# Bei einem 2D array bezeichnet axis=0 die Zeilen und axis=1 die Spalten. # <2-2> -# Berechnet den Mittelwert "entlang der axis 1", d.h. die axis 1 ist die "Dimension" # <2-2> -# des arrays, über die summiert wird (die danach nur noch einen Wert enthält). # <2-2> -# Da jede Zeile genau die drei Werte enthält, die zu mitteln sind, enthält jede # <2-2> -# Zeile danach genau den jeweiligen Mittelwert. # <2-2> - # <2-6> -t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-6> - # <2-6> -# Erklärung: # <2-2> -# Das Array h_b enthält jede Höhe dreifach, auch die Auswahl # <2-2> -# der einzelnen Höhen kann durch array Manipulation geschehen. # <2-2> -# # <2-2> -# Die Benennung der Variable (h_b_mean) wurde so gewählt, # <2-2> -# dass diese zur zugehörigen Variable für die Zeitdauern passt # <2-2> -# # <2-2> -# reshape(-1, 3): # <2-2> -# analog zur Manipulation von t_b # <2-2> -# [:,0] # <2-2> -# Aus jeder Zeile (= erster Index ist ':') wird die 'nullte' Spalte (= zweiter Index ist '0') # <2-2> -# ausgewählt, d.h. in jeder Zeile bleibt genau eine Höhe erhalten. # <2-2> - # <2-6> -h_b_mean = h_b.reshape(-1,3)[:,0] # <2-6> - # <2-6> -# Erklärung: # <2-2> -# analog für die andere Messreihe # <2-2> - # <2-6> -t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-6> -h_c_mean = h_c.reshape(-1,3)[:,0] # <2-6> - # <2-6> -# Ausgabe verarbeiteten der Messwerte # <2-6> - # <2-6> -print("Messwerte (Kugel)") # <2-6> -print("alle Zeiten") # <2-6> -print(t_b) # <2-6> -print("alle Höhen") # <2-6> -print(h_b) # <2-6> -print("Höhe") # <2-6> -print(h_b_mean) # <2-6> -print("gemittlelte Zeit") # <2-6> -print(t_b_mean) # <2-6> -print("\n") # <2-6> - # <2-6> - # <2-6> -print("Messwerte (Zylinder)") # <2-6> -print("alle Höhen") # <2-6> -print(h_c) # <2-6> -print("alle Zeiten") # <2-6> -print(t_c) # <2-6> -print("Höhe") # <2-6> -print(h_c_mean) # <2-6> -print("gemittlelte Zeit") # <2-6> -print(t_c_mean) # <2-6> -print("\n") # <2-6> - # <2-6> -# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-6> - # <2-6> -# Erklärung: # <3-3> -# Funktionen für die Funktionsgleichungen der Theorie-Funktionen # <3-3> -# # <2-6> -# In Funktionen können Variablen verwendet werden, die außerhalb (global) definiert wurden # <3-3> -# wie hier: l, ri_c und ro_c # <3-3> -# Solche globalen Variablen können bei größeren Skripten/Programmen zu einem Problem werden # <3-3> -# es ist also zumindest Vorsicht geboten # <3-3> - # <2-6> -def theory_t_ball(h): # <3-3> - return np.sqrt(7/5 * 1/h * 2* l**2/9.81) # <3-3> - # <2-6> -def theory_t_cylinder(h): # <3-3> - return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/9.81 * 1/h) # <3-3> - # <2-6> -# Erklärung: # <4-4> -# Umwandeln der Theorie-Funktion zu einer Fit-Funktion: # <4-4> -# Die Funktion erhält ein zusätzliches Argument für jeden Fitparameter, hier: g und t0 # <4-4> -# diese müssen auch in der Funktion verwendet werden. # <4-4> -# # <2-6> -# Namen sind wie immer beliebig und es gibt nicht "den einen richtigen Namen", # <4-4> -# aber es bietet sich wie immer an sprechende Namen zu verwenden, hier z.B. # <4-4> -# "fit_g_ball" als Abkürzung für "Fitfunktion für den Parameter g aus den Messwerten für die Kugel" # <4-4> - # <2-6> -def fit_g_ball(h, g, t0): # <4-6> - return np.sqrt(7/5 * 1/h * 2* l**2/g) + t0 # <4-4> - # <2-6> -def fit_g_cylinder(h, g, t0): # <4-6> - return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/g * 1/h) + t0 # <4-4> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-6> -# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-6> -# Messwerten umgehen. # <5-6> -# Folgendes muss dafür geändert werden: # <5-6> -# # <5-6> +# Erklärung: # <2-2> +# Importiere numpy unter dem Namen np # <2-2> +import numpy as np # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Importiere matplotlib.pyplot unter dem Namen plt # <3-3> +import matplotlib.pyplot as plt # <3-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Importiere curve_fit aus scipy.optimize # <4-4> +from scipy.optimize import curve_fit # <4-6> +from scipy.constants import physical_constants # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Importiere uncertainties unter dem Namen unc # <5-6> +# Importiere uncertainties.unumpy unter dem Namen unp # <5-6> +# Importiere der Funktionen nominal_values und std_devs # <5-6> +# aus uncertainties.unumpy, unter den kürzeren Namen # <5-6> +# noms respektive stds # <5-6> +import uncertainties as unc # <5-6> +import uncertainties.unumpy as unp # <5-6> +from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> +# zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> +# es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> +# # <2-6> +# Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> +# # <2-6> +# Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> +# ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> +# nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> +# Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> +# # <2-6> +# Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> +# (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-6> +# für die meisten Messwerte. # <5-6> +# Beim Importieren der Daten muss beachtet werden, dass: # <5-6> +# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-6> +# Auch hier ist eine konsistente Benennung sinnvoll # <5-6> +# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-6> +# # <5-6> +# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-6> +# entweder durch unc.ufloat oder durch das unp.uarray # <5-6> + # <2-6> + # <2-6> +# Länge der schiefen Ebene # <2-6> +l = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",")/100 # m # <2-4> +l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-6> +l = unc.ufloat(l, l_unc) # <5-6> + # <2-6> +# Framerate der Kamera # <2-4> +# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-6> +fps = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",") # 1/s # <2-4> +fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Die Daten aus Dateien mit mehreren spalten muss man in einer extra Zeile skalieren # <2-2> +# Masse und Umfang der Kugel # <2-6> +m_b, u_b = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <2-4> +m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-6> +m_b = m_b/1000 # kg # <2-4> +u_b = u_b/100 # m # <2-4> +m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-6> +u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-6> + # <2-6> +# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-6> +h_b, Fi_b, Ff_b = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <2-4> +h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-6> +h_b = h_b/100 # m # <2-4> +h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-6> +Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-6> +Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-6> + # <2-6> + # <2-6> +# Masse und Umfang des Zylinders # <2-6> +m_c, u_c, d_c = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <2-4> +m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +m_c = m_c/1000 # kg # <2-4> +u_c = u_c/100 # m # <2-4> +d_c = d_c/100 # m # <2-4> +m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-6> +u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-6> +d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-6> + # <2-6> +# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-6> +h_c, Fi_c, Ff_c = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <2-4> +h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +h_c = h_c/100 # m # <2-4> +h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-6> +Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-6> +Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-6> + # <2-6> +# Erklärung: # <2-2> +# Ein gewisses Maß an Struktur in der Benennung von Variablen hilft bei der Orientierung, # <2-2> +# gerade in der Zusammenarbeit mit euren jeweiligen Partnern. # <2-2> +# Man muss es aber auch nicht übertreiben. Gerade ein Sprachenmix aus deutsch und englisch # <2-2> +# ist nicht besonders tragisch: z.B. steht m_b für mass_ball aber u_b für umfang_ball, # <2-2> +# aber das p_b für perimeter_ball würde mir persönlich nicht so klar werden. # <2-2> + # <2-6> +# Erklärung: # <2-2> +# Auch die einzelnen "Arbeitsschritte" der Auswertung sollten in einem # <2-2> +# kurzen Kommentar erklärt werden. # <2-2> +# Erklärung: # <2-2> +# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-6> + # <2-6> + # <2-6> +# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-6> + # <2-6> +# Radius der Kugel # <2-6> +r_b = u_b/(2*np.pi) # <2-6> + # <2-6> +# Äußerer Radius des Zylinders # <2-6> +ro_c = u_c/(2*np.pi) # <2-6> + # <2-6> +# Innerer Radius des Zylinders # <2-6> +ri_c = ro_c - d_c # <2-6> + # <2-6> + # <2-6> +# Trägheitsmoment der Kugel # <2-6> +I_b = 2/5 * m_b * r_b**2 # <2-6> + # <2-6> +# Trägheitsmoment des Zylinders # <2-6> +I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-6> + # <2-6> +print("Trägheitsmoment (Kugel)") # <2-6> +print(I_b) # <2-6> + # <2-6> +print("Trägheitsmoment (Zylinder)") # <2-6> +print(I_c) # <2-6> + # <2-6> + # <2-6> +# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-6> +t_b = (Ff_b - Fi_b)/fps # <2-6> +t_c = (Ff_c - Fi_c)/fps # <2-6> + # <2-6> +# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-6> + # <2-6> +# Erklärung: # <2-2> +# Es ist ein neuer Name (t_b_mean) notwendig, wenn die alten Werte in t_b # <2-2> +# noch verfügbar bleiben sollen # <2-2> +# # <2-2> +# Hieran sieht man (schon im Kleinen) die Nützlichkeit der numpy arrays # <2-2> +# und der möglichen Manipulationen: # <2-2> +# reshape(-1,3): # <2-2> +# Im array t_b liegen die zu mittelnden Werte immer genau hintereinander # <2-2> +# durch reshape(-1,3) wird aus t_b ein 2D array erzeugt, das in jeder # <2-2> +# Zeile 3 Spalten hat. Das bedeutet: Nach jeweils 3 Werten in t_b wird eine neue # <2-2> +# Zeile begonnen, damit sind in jeder Zeile genau die Werte die gemittelt werden sollen. # <2-2> +# Die -1 als Anzahl der Zeilen ist gibt numpy die Anweisung, diese Anzahl # <2-2> +# selbst zu berechnen. # <2-2> +# # <2-2> +# mean(axis=1): # <2-2> +# Bei einem 2D array bezeichnet axis=0 die Zeilen und axis=1 die Spalten. # <2-2> +# Berechnet den Mittelwert "entlang der axis 1", d.h. die axis 1 ist die "Dimension" # <2-2> +# des arrays, über die summiert wird (die danach nur noch einen Wert enthält). # <2-2> +# Da jede Zeile genau die drei Werte enthält, die zu mitteln sind, enthält jede # <2-2> +# Zeile danach genau den jeweiligen Mittelwert. # <2-2> + # <2-6> +t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-6> + # <2-6> +# Erklärung: # <2-2> +# Das Array h_b enthält jede Höhe dreifach, auch die Auswahl # <2-2> +# der einzelnen Höhen kann durch array Manipulation geschehen. # <2-2> +# # <2-2> +# Die Benennung der Variable (h_b_mean) wurde so gewählt, # <2-2> +# dass diese zur zugehörigen Variable für die Zeitdauern passt # <2-2> +# # <2-2> +# reshape(-1, 3): # <2-2> +# analog zur Manipulation von t_b # <2-2> +# [:,0] # <2-2> +# Aus jeder Zeile (= erster Index ist ':') wird die 'nullte' Spalte (= zweiter Index ist '0') # <2-2> +# ausgewählt, d.h. in jeder Zeile bleibt genau eine Höhe erhalten. # <2-2> + # <2-6> +h_b_mean = h_b.reshape(-1,3)[:,0] # <2-6> + # <2-6> +# Erklärung: # <2-2> +# analog für die andere Messreihe # <2-2> + # <2-6> +t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-6> +h_c_mean = h_c.reshape(-1,3)[:,0] # <2-6> + # <2-6> +# Ausgabe verarbeiteten der Messwerte # <2-6> + # <2-6> +print("Messwerte (Kugel)") # <2-6> +print("alle Zeiten") # <2-6> +print(t_b) # <2-6> +print("alle Höhen") # <2-6> +print(h_b) # <2-6> +print("Höhe") # <2-6> +print(h_b_mean) # <2-6> +print("gemittlelte Zeit") # <2-6> +print(t_b_mean) # <2-6> +print("\n") # <2-6> + # <2-6> + # <2-6> +print("Messwerte (Zylinder)") # <2-6> +print("alle Höhen") # <2-6> +print(h_c) # <2-6> +print("alle Zeiten") # <2-6> +print(t_c) # <2-6> +print("Höhe") # <2-6> +print(h_c_mean) # <2-6> +print("gemittlelte Zeit") # <2-6> +print(t_c_mean) # <2-6> +print("\n") # <2-6> + # <2-6> +# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-6> + # <2-6> +# Erklärung: # <3-3> +# Funktionen für die Funktionsgleichungen der Theorie-Funktionen # <3-3> +# # <3-3> +# In Funktionen können Variablen verwendet werden, die außerhalb (global) definiert wurden # <3-3> +# wie hier: l, ri_c und ro_c # <3-3> +# Solche globalen Variablen können bei größeren Skripten/Programmen zu einem Problem werden # <3-3> +# es ist also zumindest Vorsicht geboten # <3-3> + # <2-6> +def theory_t_ball(h): # <3-3> + return np.sqrt(7/5 * 1/h * 2* l**2/9.81) # <3-3> + # <2-6> +def theory_t_cylinder(h): # <3-3> + return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/9.81 * 1/h) # <3-3> + # <2-6> +# Erklärung: # <4-4> +# Umwandeln der Theorie-Funktion zu einer Fit-Funktion: # <4-4> +# Die Funktion erhält ein zusätzliches Argument für jeden Fitparameter, hier: g und t0 # <4-4> +# diese müssen auch in der Funktion verwendet werden. # <4-4> +# # <4-4> +# Namen sind wie immer beliebig und es gibt nicht "den einen richtigen Namen", # <4-4> +# aber es bietet sich wie immer an sprechende Namen zu verwenden, hier z.B. # <4-4> +# "fit_g_ball" als Abkürzung für "Fitfunktion für den Parameter g aus den Messwerten für die Kugel" # <4-4> + # <2-6> +def fit_g_ball(h, g, t0): # <4-4> + return np.sqrt(7/5 * 1/h * 2* l**2/g) + t0 # <4-4> + # <2-6> +def fit_g_cylinder(h, g, t0): # <4-4> + return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/g * 1/h) + t0 # <4-4> + # <2-6> + # <2-6> +# Erklärung: # <5-6> +# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-6> +# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-6> +# Messwerten umgehen. # <5-6> +# Folgendes muss dafür geändert werden: # <5-6> +# # <5-6> # (1) in der Fitfunktion müssen mit der Funktion noms() # <5-6> -# die Unsicherheiten von Konstanten entfernt werden # <5-6> -# # <5-6> -# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-6> -# diese müssen mit noms() entfernt werden. # <5-6> -# # <5-6> -# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-6> -# müssen getrennt übergeben werden: noms() und stds() # <5-6> -# # <5-6> -# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-6> -# um die Unsicherheiten anzeigen zu können # <5-6> -# # <5-6> -# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-6> -# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-6> -# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-6> - # <2-6> -def fit_g_ball(h, g, t0): # <4-6> - return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-6> - # <2-6> -def fit_g_cylinder(h, g, t0): # <4-6> - return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-6> - # <2-6> - # <2-6> - # <2-6> -# Erklärung: # <4-4> -# Hier ist Vorsicht geboten, da die Fit-Funktion und Messwerte zusammen passen müssen # <4-4> -# an solchen Stellen zahlt sich eine konsistente Benennung aus. # <4-4> -# Berechnung der Fitparameter für die Kugel # <4-6> - # <2-6> -params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -# Erklärung: # <4-4> -# Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> -print("Fitparameter (Kugel)") # <4-6> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <2-6> - # <2-6> -# Erklärung: # <3-3> -# Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> -# auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> -# Der Bereich in dem diese Werte liegen entspricht, aber dem der Messwerte ca. [0.03, 0.33] # <3-3> -h_plot = np.linspace(0.03, 0.33, 205) # <3-6> - # <2-6> - # <2-6> -# Fit Parameter für den Zylinder # <4-4> -# Fitparameter für den Zylinder # <5-6> - # <2-6> - # <2-6> -# Erklärung: # <3-3> -# Erstellen einer figure mit einem subplot darin (1 Zeile x 1 Spalte an subplots) # <3-3> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> - # <2-6> -# Erklärung: # <3-3> -# Einstellung der Achsenbeschriftungen # <3-3> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> - # <2-6> -# Erklärung: # <3-3> -# Darstellen der Messwerte mit Legendeneintrag # <3-3> -ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> -ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> - # <2-6> -# Erklärung: # <4-4> -# Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> - # <2-6> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> -fig.savefig("plot_kugel.pdf") # <3-3> -fig.savefig("plot-g_kugel.pdf") # <4-6> - # <2-6> - # <2-6> -# Erklärung: # <4-4> -# Analog für die Messreihe des Zylinders # <4-4> -# Achtung! Copy-and-paste ist natürlich gängige Praxis, # <4-4> -# aber alle Variablen müssen angepasst werden. # <4-4> - # <2-6> -# Berechnung der Fitparameter für den Zylinder # <4-6> -params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Zylinder)") # <4-6> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <2-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> -ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> -ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> -fig.savefig("plot_zylinder.pdf") # <3-3> -fig.savefig("plot-g_zylinder.pdf") # <4-6> - # <2-6> - # <2-6> -# Erklärung: # <4-4> -# Verwenden der physikalischen Konstanten aus scipy # <4-4> -# hier: g # <4-4> -# physical_constants enthält 3er-tuple, der erste Eintrag # <4-4> -# der tuple ist der Wert der Konstante, deswegen [0] # <4-4> - # <2-6> - # <2-6> -def fit_I_ball(h, I, t0): # <4-6> - g = physical_constants["standard acceleration of gravity"][0] # <4-6> - return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-6> - # <2-6> - # <2-6> -def fit_I_cylinder(h, I, t0): # <4-6> - g = physical_constants["standard acceleration of gravity"][0] # <4-6> - return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-6> - # <2-6> -# Erklärung: # <4-4> -# Durch den Fit wird diese Warnung auf das Terminal ausgegeben: # <4-4> -# .../v16515/auswertung.py:197: RuntimeWarning: invalid value encountered in sqrt # <4-4> -# return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> -# # <2-6> -# Diese bedeutet, dass während des Fits negative Werte für I 'ausprobiert' wurden, # <4-4> -# von denen die Wurzel nicht berechnet werden konnte. # <4-4> -# Man kann das verhindern, in dem man die Parameter auf den physikalisch möglichen # <4-4> -# Bereich einschränkt. Dies tut man mit dem zusätzlichen Parameter bounds für curve_fit, # <4-4> -# hier müsste # <4-4> -# bounds=([0,-np.inf],[+np.inf,+np.inf]) # <4-4> -# als zusätzliches Argument für curve_fit ergänzt werden. # <4-4> -# bounds gibt den minimalen und den maximalen Wert für alle Parameter an, # <4-4> -# und zwar zuerst alle Minima und dann alle Maxima, # <4-4> -# in diesem konkreten Beispiel steht bounds also für: 0 < I < +np.inf und -np.inf < t0 < +np.inf # <4-4> - # <2-6> - # <2-6> -# Berechnung der Fitparameter für die Kugel # <4-6> -params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Kugel)") # <4-6> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> - if name == "I": # <4-6> - value *= 10000 # <4-6> - uncertainty *= 10000 # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <2-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> -ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> -fig.savefig("plot-I_kugel.pdf") # <4-6> - # <2-6> - # <2-6> -# Berechnung der Fitparameter für den Zylinder # <4-6> -params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Zylinder)") # <4-6> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> - if name == "I": # <4-6> - value *= 10000 # <4-6> - uncertainty *= 10000 # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <2-6> - # <2-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> -ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> -fig.savefig("plot-I_zylinder.pdf") # <4-6> +# die Unsicherheiten von Konstanten entfernt werden # <5-6> +# # <5-6> +# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-6> +# diese müssen mit noms() entfernt werden. # <5-6> +# # <5-6> +# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-6> +# müssen getrennt übergeben werden: noms() und stds() # <5-6> +# # <5-6> +# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-6> +# um die Unsicherheiten anzeigen zu können # <5-6> +# # <5-6> +# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-6> +# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-6> +# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-6> + # <2-6> +def fit_g_ball(h, g, t0): # <5-6> + return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-6> + # <2-6> +def fit_g_cylinder(h, g, t0): # <5-6> + return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-6> + # <2-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Hier ist Vorsicht geboten, da die Fit-Funktion und Messwerte zusammen passen müssen # <4-4> +# an solchen Stellen zahlt sich eine konsistente Benennung aus. # <4-4> +# Berechnung der Fitparameter für die Kugel # <4-6> + # <2-6> +params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> +print("Fitparameter (Kugel)") # <4-6> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <4-6> + # <2-6> +# Erklärung: # <3-3> +# Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> +# auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> +# Der Bereich in dem diese Werte liegen entspricht, aber dem der Messwerte ca. [0.03, 0.33] # <3-3> +h_plot = np.linspace(0.03, 0.33, 205) # <3-6> + # <2-6> + # <2-6> +# Fit Parameter für den Zylinder # <4-4> +# Fitparameter für den Zylinder # <5-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Erstellen einer figure mit einem subplot darin (1 Zeile x 1 Spalte an subplots) # <3-3> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Einstellung der Achsenbeschriftungen # <3-3> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> + # <2-6> +# Erklärung: # <3-3> +# Darstellen der Messwerte mit Legendeneintrag # <3-3> +ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> +ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> + # <2-6> +# Erklärung: # <4-4> +# Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> + # <2-6> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot_kugel.pdf") # <3-3> +fig.savefig("plot-g_kugel.pdf") # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Analog für die Messreihe des Zylinders # <4-4> +# Achtung! Copy-and-paste ist natürlich gängige Praxis, # <4-4> +# aber alle Variablen müssen angepasst werden. # <4-4> + # <2-6> +# Berechnung der Fitparameter für den Zylinder # <4-6> +params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Zylinder)") # <4-6> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <4-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <3-6> +ax.set_ylabel("$t$ / s") # <3-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> +ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> +ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <3-6> +fig.savefig("plot_zylinder.pdf") # <3-3> +fig.savefig("plot-g_zylinder.pdf") # <4-6> + # <2-6> + # <2-6> +# Erklärung: # <4-4> +# Verwenden der physikalischen Konstanten aus scipy # <4-4> +# hier: g # <4-4> +# physical_constants enthält 3er-tuple, der erste Eintrag # <4-4> +# der tuple ist der Wert der Konstante, deswegen [0] # <4-4> + # <2-6> + # <2-6> +def fit_I_ball(h, I, t0): # <4-6> + g = physical_constants["standard acceleration of gravity"][0] # <4-6> + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 # <4-4> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-6> + # <2-6> + # <2-6> +def fit_I_cylinder(h, I, t0): # <4-6> + g = physical_constants["standard acceleration of gravity"][0] # <4-6> + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-6> + # <2-6> +# Erklärung: # <4-4> +# Durch den Fit wird diese Warnung auf das Terminal ausgegeben: # <4-4> +# .../v16515/auswertung.py:197: RuntimeWarning: invalid value encountered in sqrt # <4-4> +# return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> +# # <4-4> +# Diese bedeutet, dass während des Fits negative Werte für I 'ausprobiert' wurden, # <4-4> +# von denen die Wurzel nicht berechnet werden konnte. # <4-4> +# Man kann das verhindern, in dem man die Parameter auf den physikalisch möglichen # <4-4> +# Bereich einschränkt. Dies tut man mit dem zusätzlichen Parameter bounds für curve_fit, # <4-4> +# hier müsste # <4-4> +# bounds=([0,-np.inf],[+np.inf,+np.inf]) # <4-4> +# als zusätzliches Argument für curve_fit ergänzt werden. # <4-4> +# bounds gibt den minimalen und den maximalen Wert für alle Parameter an, # <4-4> +# und zwar zuerst alle Minima und dann alle Maxima, # <4-4> +# in diesem konkreten Beispiel steht bounds also für: 0 < I < +np.inf und -np.inf < t0 < +np.inf # <4-4> + # <2-6> + # <2-6> +# Berechnung der Fitparameter für die Kugel # <4-6> +params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Kugel)") # <4-6> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> + if name == "I": # <4-6> + value *= 10000 # <4-6> + uncertainty *= 10000 # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <4-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <4-6> +ax.set_ylabel("$t$ / s") # <4-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <4-6> +fig.savefig("plot-I_kugel.pdf") # <4-6> + # <2-6> + # <2-6> +# Berechnung der Fitparameter für den Zylinder # <4-6> +params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> +params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> + # <2-6> + # <2-6> +print("Fitparameter (Zylinder)") # <4-6> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> + if name == "I": # <4-6> + value *= 10000 # <4-6> + uncertainty *= 10000 # <4-6> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> +print("\n") # <4-6> + # <2-6> + # <2-6> + # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-6> + # <2-6> +ax.set_xlabel("$h$ / m") # <4-6> +ax.set_ylabel("$t$ / s") # <4-6> + # <2-6> + # <2-6> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <4-6> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> +ax.legend() # <4-6> +fig.savefig("plot-I_zylinder.pdf") # <4-6> From 348d7f22bc1d55d55483989b031b40048c4e43bd Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 25 Sep 2024 23:06:43 +0200 Subject: [PATCH 04/80] removed extension, to stop formatters --- .../{auswertung_template.py => auswertung_template} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises-toolbox/8-all/example-report/{auswertung_template.py => auswertung_template} (100%) diff --git a/exercises-toolbox/8-all/example-report/auswertung_template.py b/exercises-toolbox/8-all/example-report/auswertung_template similarity index 100% rename from exercises-toolbox/8-all/example-report/auswertung_template.py rename to exercises-toolbox/8-all/example-report/auswertung_template From c4449ff32a107564fab56e9f0ea5bd96ff3d4452 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 26 Sep 2024 11:58:42 +0200 Subject: [PATCH 05/80] add Makefile to create the step dirs and fill them --- .../8-all/example-report/Makefile | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/Makefile diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile new file mode 100644 index 00000000..d9c8eeec --- /dev/null +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -0,0 +1,127 @@ +datafilenames = Messwerte_Bahn.txt \ +Messwerte_Frames_Kugel.txt \ +Messwerte_Frames_Zylinder.txt \ +Messwerte_Kamera.txt \ +Messwerte_Kugel.txt \ +Messwerte_Zylinder.txt + +datafiles_without_unc = $(addprefix templates/data_without_uncertainties/, $(datafilenames)) +datafiles_with_unc = $(addprefix templates/data_with_uncertainties/, $(datafilenames)) + + +steps_without_unc = 1 2 3 4 +steps_with_unc = 5 6 +steps = $(steps_without_unc) $(steps_with_unc) + +taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) + +step_dirs = $(foreach step, $(steps),build/report-example-step-$(step)/) +solution_dirs = $(addsuffix loesung, $(step_dirs)) +data_dirs = $(addsuffix /data, $(solution_dirs)) + +target_datafiles_paths = $(addprefix build/report-example-step-STEP/loesung/data/, $(datafilenames)) +target_datafiles_without_unc = $(foreach step, $(steps_without_unc), $(subst STEP,$(step), $(target_datafiles_paths))) +target_datafiles_with_unc = $(foreach step, $(steps_with_unc), $(subst STEP,$(step), $(target_datafiles_paths))) +datafiles_template_step-1 = $(addprefix build/report-example-step-1/data/, $(datafilenames)) + + +target_makefiles = $(addsuffix Makefile-loesung, $(step_dirs)) +target_scriptfiles = $(addsuffix loesung/auswertung.py, $(step_dirs)) +target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) +target_datafiles = $(datafiles_template_step-1) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))/data/, $(datafilenames))) + + + +all: \ +$(target_datafiles) \ +$(target_taskfiles) \ +$(target_scriptfiles) \ + + +tests = test1 test2 test3 +test-%: | build + @echo " " + @echo $@ + @echo " " + @echo $< + @echo " " + @echo $(target_scriptfiles) + @echo $(target_datafiles_without_unc) + @echo $(target_datafiles_with_unc) + @echo "" + @echo $(subst STEP,1, $(target_datafiles_paths)) + +build/report-example-step-%/aufgabe.txt &: $(taskfiles) | $(solution_dirs) + cp $(word $*, $(taskfiles)) build/report-example-step-$*/aufgabe.txt + + +build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) + cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung + + +$(target_scriptfiles) &: generate-step-scripts.py auswertung_template | $(solution_dirs) + touch $(word 1, $(target_scriptfiles)) + python generate-step-scripts.py auswertung_template $(target_scriptfiles) + +$(datafiles_template_step-1) &: | build/report-example-step-1 + cp -r templates/data_without_uncertainties build/report-example-step-1/data + +$(subst STEP,1, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) + cp -r templates/data_without_uncertainties $(word 1, $(data_dirs)) + +$(subst STEP,2, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) + cp -r templates/data_without_uncertainties $(word 2, $(data_dirs)) + +$(subst STEP,3, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) + cp -r templates/data_without_uncertainties $(word 3, $(data_dirs)) + +$(subst STEP,4, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) + cp -r templates/data_without_uncertainties $(word 4, $(data_dirs)) + +$(subst STEP,5, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 5, $(data_dirs)) + +$(subst STEP,6, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 6, $(data_dirs)) + + +# $(target_datafiles_with_unc) &: $(datafiles_without_unc) | $(solution_dirs) +# cp -r templates/data_with_uncertainties $(target_datafiles_with_unc) + +build/report-example-step-%/loesung &: | $(step_dirs) + mkdir -p build/report-example-step-$*/loesung + + +build/report-example-step-% : | build + mkdir -p build/report-example-step-$* + +build: + mkdir -p build + +clean: + rm -r build + + +# development rules + +test_step_scripts: all + @echo + @echo Testing: + @echo -n $(target_scriptfiles) + @echo "" + echo "" > build/output.txt + set -- $(solution_dirs); \ + for i do\ + cd "$$i"; \ + echo "Output of '$$i/auswertung.py':" >> ../../output.txt; \ + echo >> ../../output.txt; \ + echo "" >> ../../output.txt; \ + python auswertung.py >> ../../output.txt 2>&1;\ + cd - ;\ + echo $$(pwd) ; \ + done;\ + diff -u templates/steps_output.txt build/output.txt + + + +.PHONY: all clean From 7a367756a9671329b3235e2deb1850aee6de0bda Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 27 Sep 2024 08:44:48 +0200 Subject: [PATCH 06/80] fix missplaced * in regex --- exercises-toolbox/8-all/example-report/generate-step-scripts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-scripts.py index 6e32ca0e..09e0874f 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-scripts.py +++ b/exercises-toolbox/8-all/example-report/generate-step-scripts.py @@ -2,7 +2,7 @@ import sys from collections import defaultdict -STEPRANGEREGEX = re.compile(r"#\s<(\d)*(-(\d*)|)>") +STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") From 5be559143d20e5dd6cf290a82b91d400af0123b3 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 27 Sep 2024 08:46:32 +0200 Subject: [PATCH 07/80] changes to script --- .../example-report/generate-step-scripts.py | 94 +++++++++++-------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-scripts.py index 09e0874f..3e8668fe 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-scripts.py +++ b/exercises-toolbox/8-all/example-report/generate-step-scripts.py @@ -1,15 +1,31 @@ +import argparse import re import sys from collections import defaultdict STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") +def parse_int_tuple(tuple_str): + values = tuple_str.split(",") + return (int(values[0]), int(values[1])) -def extract_stepranges(lines): +def setup_arg_parser(): + parser = argparse.ArgumentParser( + prog="generate-step-scripts", + description="Generate multiple files with lines from a template file", + epilog='') + + parser.add_argument('-v', '--verbose', action='store_true') + parser.add_argument('-r', '--map-from-range',type=parse_int_tuple) + parser.add_argument('-t','--template_filepath', dest='template_filepath') + parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append") + return parser + +def extract_stepranges(lines, max_upper_limit): step_ranges = [] script_lines = [] - for i,l in enumerate(lines): + for l in lines: found = STEPRANGEREGEX.search(l) if found is None: continue @@ -17,33 +33,23 @@ def extract_stepranges(lines): lower_limit = int(groups[0]) if (not groups[1]) and (groups[2] is None): - step_range = (lower_limit, lower_limit) + step_limits = (lower_limit, lower_limit + 1) elif not groups[2]: - step_range = (lower_limit, None) + step_limits = (lower_limit, max_upper_limit + 1) else: - step_range = (lower_limit, int(groups[2])) - step_ranges.append(step_range) + step_limits = (lower_limit, int(groups[2]) + 1) + step_ranges.append(range(*step_limits)) script_lines.append(STEPRANGEREGEX.sub("", l).rstrip()) return step_ranges, script_lines -def step_list_from_step_range(step_range, upper_limit): - lower_limit = int(step_range[0]) - if not step_range[1] is None: - upper_limit = int(step_range[1]) - return list(range(lower_limit, upper_limit+1)) - - - -def generate_step_file_lines(template_lines): - step_ranges, script_lines = extract_stepranges(template_lines) - highest_upper_limit = max([int(sr[1]) for sr in step_ranges if sr[1]]) + 1 - - step_lists = [step_list_from_step_range(sr, highest_upper_limit) for sr in step_ranges] +def generate_step_file_lines(template_lines, num_output_files): + step_ranges, script_lines = extract_stepranges(template_lines, num_output_files) files_lines = defaultdict(list) - for sl, line in zip(step_lists, script_lines): + for sl, line in zip(step_ranges, script_lines): + print(f"sl: {sl}: {line}") for step in sl: files_lines[step].append(line) @@ -53,27 +59,39 @@ def generate_step_file_lines(template_lines): def main(): - filepath = sys.argv[1] - print(f"Filename: {filepath}") - output_filepath = filepath - if len(sys.argv) > 2: - output_filepath = sys.argv[2] - - path, ext = output_filepath.rsplit('.') - output_filepath_pattern = path + "_step-{step}." + ext - print(output_filepath, output_filepath_pattern) - with open(sys.argv[1]) as fh: - script_lines = fh.readlines() + parser = setup_arg_parser() + args = parser.parse_args() + template_filepath = args.template_filepath + output_filepaths = args.output_filepaths + if args.verbose: + print(f"Templatefile: {template_filepath}") + print(f"Outputfiles: {output_filepaths}") + print(f"range: {args.map_from_range}") + - files_lines = generate_step_file_lines(script_lines) + + - for it in files_lines.items(): - print(it) + with open(template_filepath) as fh: + script_lines = fh.readlines() - for step, lines in files_lines.items(): - with open(output_filepath_pattern.format(step=step), "w") as fh: - fh.write("\n".join(lines).strip()) - + files_lines = generate_step_file_lines(script_lines, len(output_filepaths)) + + if args.verbose: + print(f"Found steps: {files_lines.keys()}") + + + map_step = lambda step: step + if args.map_from_range: + map_step = lambda step: step - args.map_from_range[0] + + try: + for step, lines in files_lines.items(): + + with open(output_filepaths[map_step(step)-1], "w") as fh: + fh.write("\n".join(lines).strip()) + except IndexError: + raise ValueError(f"Expecting {max(files_lines.keys())} output files, but got only {len(output_filepaths)}.") if __name__ == "__main__": main() From e1301dc6b4c1cf071a3f699925160f8618236b9b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 27 Sep 2024 09:04:16 +0200 Subject: [PATCH 08/80] add and change cli args --- .../example-report/generate-step-scripts.py | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-scripts.py index 3e8668fe..694a1bd8 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-scripts.py +++ b/exercises-toolbox/8-all/example-report/generate-step-scripts.py @@ -5,11 +5,6 @@ STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") -def parse_int_tuple(tuple_str): - values = tuple_str.split(",") - return (int(values[0]), int(values[1])) - - def setup_arg_parser(): parser = argparse.ArgumentParser( prog="generate-step-scripts", @@ -17,7 +12,8 @@ def setup_arg_parser(): epilog='') parser.add_argument('-v', '--verbose', action='store_true') - parser.add_argument('-r', '--map-from-range',type=parse_int_tuple) + parser.add_argument('-n', '--dry-run', action='store_true') + parser.add_argument('-s', '--start-step', type=int) parser.add_argument('-t','--template_filepath', dest='template_filepath') parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append") return parser @@ -46,11 +42,10 @@ def extract_stepranges(lines, max_upper_limit): def generate_step_file_lines(template_lines, num_output_files): step_ranges, script_lines = extract_stepranges(template_lines, num_output_files) - + files_lines = defaultdict(list) for sl, line in zip(step_ranges, script_lines): - - print(f"sl: {sl}: {line}") + for step in sl: files_lines[step].append(line) @@ -64,10 +59,16 @@ def main(): template_filepath = args.template_filepath output_filepaths = args.output_filepaths if args.verbose: - print(f"Templatefile: {template_filepath}") - print(f"Outputfiles: {output_filepaths}") - print(f"range: {args.map_from_range}") + print("Input:") + print(' '.join(sys.argv)) + print("Parsed:") + print(f" - Templatefile: {template_filepath}") + print(f" - Outputfiles: {output_filepaths}") + print(f" - Start step: {args.start_step}") + map_step = lambda step: step + if args.start_step: + map_step = lambda step: step - (args.start_step - 1) @@ -80,10 +81,12 @@ def main(): if args.verbose: print(f"Found steps: {files_lines.keys()}") + if args.dry_run: + for step,lines in files_lines.items(): + print(f"\nOutputfile '{output_filepaths[map_step(step)-1]}' (Step: {step}) would contain:") + print(f"{"\n".join(lines)}") + return - map_step = lambda step: step - if args.map_from_range: - map_step = lambda step: step - args.map_from_range[0] try: for step, lines in files_lines.items(): From 9dc35575daf0de86d3c3530a3d608482c69d406e Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 27 Sep 2024 11:37:33 +0200 Subject: [PATCH 09/80] add makefile using the pyscript --- .../templates/loesung/v16516/Makefile | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile diff --git a/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile b/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile new file mode 100644 index 00000000..3ee00846 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile @@ -0,0 +1,82 @@ +all: build/v16516.pdf + +# hier Python-Skripte: +build/plot-g_ball.pdf: auswertung.py ../matplotlibrc ../header-matplotlib.tex data/*| build + # so that matplotlib can find the tex header when running + # LaTeX in the tmp directory + # and set the matplotlibrc + TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python auswertung.py + +build/parameter-g_ball.tex: build/plot-g_ball.pdf +build/parameter-t0-g_ball.tex: build/parameter-g_ball.tex + +build/plot-g_cylinder.pdf: build/parameter-t0-g_ball.tex +build/parameter-g_cylinder.tex: build/plot-g_cylinder.pdf +build/parameter-t0-g_cylinder.tex: build/parameter-g_cylinder.tex + +build/plot-I_ball.pdf: build/parameter-g_cylinder.tex +build/parameter-I_ball.tex: build/plot-I_ball.pdf +build/parameter-t0-I_ball.tex: build/parameter-I_ball.tex + +build/plot-I_cylinder.pdf: build/parameter-t0-I_ball.tex +build/parameter-I_cylinder.tex: build/plot-I_cylinder.pdf +build/parameter-t0-I_cylinder.tex: build/parameter-I_cylinder.tex + +build/table_all-measurements.tex: build/parameter-t0-I_cylinder.tex +build/table_averaged-measurements.tex: build/table_all-measurements.tex +build/tracklength.tex: build/table_averaged-measurements.tex +build/framerate.tex: build/tracklength.tex +build/mass_ball.tex: build/framerate.tex +build/radius_ball.tex: build/mass_ball.tex +build/theoretical-I_ball.tex: build/radius_ball.tex +build/mass_cylinder.tex: build/theoretical-I_ball.tex +build/radius-inner_cylinder.tex: build/mass_cylinder.tex +build/radius-outer_cylinder.tex: build/radius-inner_cylinder.tex +build/theoretical-I_cylinder.tex: build/radius-outer_cylinder.tex + +# hier weitere Abhängigkeiten für build/vXXX.pdf deklarieren: +build/v16516.pdf: build/plot-g_ball.pdf +build/v16516.pdf: build/parameter-g_ball.tex +build/v16516.pdf: build/parameter-t0-g_ball.tex +build/v16516.pdf: build/plot-g_cylinder.pdf +build/v16516.pdf: build/parameter-g_cylinder.tex +build/v16516.pdf: build/parameter-t0-g_cylinder.tex +build/v16516.pdf: build/plot-I_ball.pdf +build/v16516.pdf: build/parameter-I_ball.tex +build/v16516.pdf: build/parameter-t0-I_ball.tex +build/v16516.pdf: build/plot-I_cylinder.pdf +build/v16516.pdf: build/parameter-I_cylinder.tex +build/v16516.pdf: build/parameter-t0-I_cylinder.tex +build/v16516.pdf: build/framerate.tex +build/v16516.pdf: build/theoretical-I_ball.tex +build/v16516.pdf: build/theoretical-I_cylinder.tex +build/v16516.pdf: build/tracklength.tex +build/v16516.pdf: build/mass_ball.tex +build/v16516.pdf: build/mass_cylinder.tex +build/v16516.pdf: build/radius_ball.tex +build/v16516.pdf: build/radius-inner_cylinder.tex +build/v16516.pdf: build/radius-outer_cylinder.tex +build/v16516.pdf: build/table_all-measurements.tex +build/v16516.pdf: build/table_averaged-measurements.tex + +build/v16516.pdf: FORCE | build + # to find header and bib files in the main directory + TEXINPUTS=..: \ + BIBINPUTS=..: \ + max_print_line=1048576 \ + latexmk \ + --lualatex \ + --output-directory=build \ + --interaction=nonstopmode \ + --halt-on-error \ + v16516.tex + +build: + mkdir -p build + +clean: + rm -rf build + +FORCE: + +.PHONY: all clean From fdac792d14b25933b8d862b8d20f9058040de243 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 11:07:20 +0200 Subject: [PATCH 10/80] add dataclass for codeline --- .../example-report/generate-step-scripts.py | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-scripts.py index 694a1bd8..f83e5c53 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-scripts.py +++ b/exercises-toolbox/8-all/example-report/generate-step-scripts.py @@ -2,6 +2,19 @@ import re import sys from collections import defaultdict +from dataclasses import dataclass +from collections.abc import Iterable + +@dataclass +class Templateline: + linenumber: int + line: str + step_range: Iterable + + def __str__(self): + return f"{self.linenumber:>3} {self.line}" + + STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") @@ -14,16 +27,18 @@ def setup_arg_parser(): parser.add_argument('-v', '--verbose', action='store_true') parser.add_argument('-n', '--dry-run', action='store_true') parser.add_argument('-s', '--start-step', type=int) - parser.add_argument('-t','--template_filepath', dest='template_filepath') - parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append") + parser.add_argument('-t','--template_filepath', dest='template_filepath', required=True) + parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append", required=True) return parser -def extract_stepranges(lines, max_upper_limit): - step_ranges = [] +def parse_lines_and_stepranges(lines, max_upper_limit): + #step_ranges = [] script_lines = [] - for l in lines: + removed_lines = [] + for i,l in enumerate(lines, start=1): found = STEPRANGEREGEX.search(l) if found is None: + removed_lines.append(Templateline(i,l, (None, None))) continue groups = found.groups() @@ -34,30 +49,29 @@ def extract_stepranges(lines, max_upper_limit): step_limits = (lower_limit, max_upper_limit + 1) else: step_limits = (lower_limit, int(groups[2]) + 1) - step_ranges.append(range(*step_limits)) - script_lines.append(STEPRANGEREGEX.sub("", l).rstrip()) + script_lines.append(Templateline(i, STEPRANGEREGEX.sub("", l).rstrip(), range(*step_limits))) - return step_ranges, script_lines + return script_lines, removed_lines -def generate_step_file_lines(template_lines, num_output_files): - step_ranges, script_lines = extract_stepranges(template_lines, num_output_files) - - files_lines = defaultdict(list) - for sl, line in zip(step_ranges, script_lines): +def generate_step_file_lines(script_lines): + step_files_lines = defaultdict(list) + for line in script_lines: - for step in sl: - files_lines[step].append(line) + for step in line.step_range: + step_files_lines[step].append(line) - - return files_lines + return step_files_lines def main(): parser = setup_arg_parser() args = parser.parse_args() + template_filepath = args.template_filepath output_filepaths = args.output_filepaths + + if args.verbose: print("Input:") print(' '.join(sys.argv)) @@ -74,27 +88,31 @@ def main(): with open(template_filepath) as fh: - script_lines = fh.readlines() - - files_lines = generate_step_file_lines(script_lines, len(output_filepaths)) + template_lines = fh.readlines() + + script_lines, removed_lines = parse_lines_and_stepranges(template_lines, len(output_filepaths)) + + step_files_lines = generate_step_file_lines(script_lines) if args.verbose: - print(f"Found steps: {files_lines.keys()}") + print("Removed lines:") + print(f"{'\n'.join(str(rl) for rl in removed_lines)}") + print(f"Found steps: {step_files_lines.keys()}") if args.dry_run: - for step,lines in files_lines.items(): - print(f"\nOutputfile '{output_filepaths[map_step(step)-1]}' (Step: {step}) would contain:") - print(f"{"\n".join(lines)}") + for step,lines in step_files_lines.items(): + print(f"\nOutputfile '{output_filepaths[map_step(step)-1]}' (Step: {step}) would these lines from the template file:") + print(f"{"\n".join(str(l) for l in lines)}") return try: - for step, lines in files_lines.items(): + for step, lines in step_files_lines.items(): with open(output_filepaths[map_step(step)-1], "w") as fh: - fh.write("\n".join(lines).strip()) + fh.write("\n".join(l.line for l in lines).strip()) except IndexError: - raise ValueError(f"Expecting {max(files_lines.keys())} output files, but got only {len(output_filepaths)}.") + raise ValueError(f"Expecting {max(step_files_lines.keys())} output files, but got only {len(output_filepaths)}.") if __name__ == "__main__": main() From b594ef4bfb8daa93a0dc90d09ad6ca8c87fbc936 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:20:17 +0200 Subject: [PATCH 11/80] update makefile --- .../8-all/example-report/Makefile | 103 ++++++++++++++---- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index d9c8eeec..a8a21ca8 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -10,25 +10,36 @@ datafiles_with_unc = $(addprefix templates/data_with_uncertainties/, $(datafilen steps_without_unc = 1 2 3 4 -steps_with_unc = 5 6 +steps_with_unc = 5 6 7 8 9 10 +steps_with_latex = 7 8 9 10 + steps = $(steps_without_unc) $(steps_with_unc) taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) step_dirs = $(foreach step, $(steps),build/report-example-step-$(step)/) -solution_dirs = $(addsuffix loesung, $(step_dirs)) -data_dirs = $(addsuffix /data, $(solution_dirs)) +solution_dirs = $(addsuffix loesung/, $(step_dirs)) +data_dirs = $(addsuffix data, $(solution_dirs)) + +step_dirs_with_latex = $(foreach step, $(steps_with_latex),build/report-example-step-$(step)/) +solution_dirs_with_latex = $(addsuffix loesung/, $(step_dirs_with_latex)) +content_dirs_with_latex = $(addsuffix content/, $(solution_dirs_with_latex)) target_datafiles_paths = $(addprefix build/report-example-step-STEP/loesung/data/, $(datafilenames)) -target_datafiles_without_unc = $(foreach step, $(steps_without_unc), $(subst STEP,$(step), $(target_datafiles_paths))) -target_datafiles_with_unc = $(foreach step, $(steps_with_unc), $(subst STEP,$(step), $(target_datafiles_paths))) datafiles_template_step-1 = $(addprefix build/report-example-step-1/data/, $(datafilenames)) +datafiles_template_step-5 = $(addprefix build/report-example-step-5/data/, $(datafilenames)) target_makefiles = $(addsuffix Makefile-loesung, $(step_dirs)) -target_scriptfiles = $(addsuffix loesung/auswertung.py, $(step_dirs)) +target_scriptfiles = $(addsuffix auswertung.py, $(solution_dirs)) +target_texfiles_v16516 = $(addsuffix v16516.tex, $(solution_dirs_with_latex)) +target_texfiles_header = $(addsuffix header.tex, $(solution_dirs_with_latex)) +target_texfiles_durchfuehrung = $(addsuffix content/durchfuehrung.tex, $(solution_dirs_with_latex)) +target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_latex)) +target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) +target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) -target_datafiles = $(datafiles_template_step-1) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))/data/, $(datafilenames))) +target_datafiles = $(datafiles_template_step-1) $(datafiles_template_step-5) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) @@ -36,20 +47,32 @@ all: \ $(target_datafiles) \ $(target_taskfiles) \ $(target_scriptfiles) \ +$(target_texfiles_header) \ +$(target_texfiles_v16516) \ +$(target_texfiles_durchfuehrung) \ +$(target_texfiles_theorie) \ +$(target_texfiles_auswertung) \ +$(target_texfiles_diskussion) \ tests = test1 test2 test3 test-%: | build - @echo " " - @echo $@ - @echo " " - @echo $< - @echo " " + # @echo " " + # @echo $@ + # @echo " " + # @echo $< + # @echo " " @echo $(target_scriptfiles) - @echo $(target_datafiles_without_unc) - @echo $(target_datafiles_with_unc) @echo "" @echo $(subst STEP,1, $(target_datafiles_paths)) + @echo "" + @echo $(target_texfiles_v16516) + @echo "" + @echo $(target_datafiles) + @echo "" + @echo $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) + @echo "" + @echo $(target_taskfiles) build/report-example-step-%/aufgabe.txt &: $(taskfiles) | $(solution_dirs) cp $(word $*, $(taskfiles)) build/report-example-step-$*/aufgabe.txt @@ -58,14 +81,31 @@ build/report-example-step-%/aufgabe.txt &: $(taskfiles) | $(solution_dirs) build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung +$(target_texfiles_v16516) &: generate-step-scripts.py templates/latex/v16516_template | $(solution_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/v16516_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 + +$(target_texfiles_header) &: generate-step-scripts.py templates/latex/header_template | $(solution_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/header_template $(addprefix -o=,$(target_texfiles_header)) -s 7 + +$(target_texfiles_durchfuehrung) &: generate-step-scripts.py templates/latex/durchfuehrung_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/durchfuehrung_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 +$(target_texfiles_theorie) &: generate-step-scripts.py templates/latex/theorie_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/theorie_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 +$(target_texfiles_auswertung) &: generate-step-scripts.py templates/latex/auswertung_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/auswertung_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 +$(target_texfiles_diskussion) &: generate-step-scripts.py templates/latex/diskussion_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/diskussion_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 -$(target_scriptfiles) &: generate-step-scripts.py auswertung_template | $(solution_dirs) +$(target_scriptfiles) &: generate-step-scripts.py templates/latex/auswertung_template | $(solution_dirs) touch $(word 1, $(target_scriptfiles)) - python generate-step-scripts.py auswertung_template $(target_scriptfiles) + python generate-step-scripts.py -t templates/auswertung_template $(addprefix -o=, $(target_scriptfiles)) $(datafiles_template_step-1) &: | build/report-example-step-1 cp -r templates/data_without_uncertainties build/report-example-step-1/data +$(datafiles_template_step-5) &: | build/report-example-step-5 + cp -r templates/data_with_uncertainties build/report-example-step-5/data + $(subst STEP,1, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 1, $(data_dirs)) @@ -84,9 +124,29 @@ $(subst STEP,5, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 5, $(subst STEP,6, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 6, $(data_dirs)) +$(subst STEP,7, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 7, $(data_dirs)) + +$(subst STEP,8, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 8, $(data_dirs)) + +$(subst STEP,9, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 9, $(data_dirs)) + +$(subst STEP,10, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 10, $(solution_dirs)) + cp -r templates/data_with_uncertainties $(word 10, $(data_dirs)) -# $(target_datafiles_with_unc) &: $(datafiles_without_unc) | $(solution_dirs) -# cp -r templates/data_with_uncertainties $(target_datafiles_with_unc) +build/report-example-step-7/loesung/content &: | $(solution_dirs) + mkdir -p build/report-example-step-7/loesung/content + +build/report-example-step-8/loesung/content &: | $(solution_dirs) + mkdir -p build/report-example-step-8/loesung/content + +build/report-example-step-9/loesung/content &: | $(solution_dirs) + mkdir -p build/report-example-step-9/loesung/content + +build/report-example-step-10/loesung/content &: | $(solution_dirs) + mkdir -p build/report-example-step-10/loesung/content build/report-example-step-%/loesung &: | $(step_dirs) mkdir -p build/report-example-step-$*/loesung @@ -107,7 +167,7 @@ clean: test_step_scripts: all @echo @echo Testing: - @echo -n $(target_scriptfiles) + @echo $(target_scriptfiles) @echo "" echo "" > build/output.txt set -- $(solution_dirs); \ @@ -117,10 +177,9 @@ test_step_scripts: all echo >> ../../output.txt; \ echo "" >> ../../output.txt; \ python auswertung.py >> ../../output.txt 2>&1;\ - cd - ;\ - echo $$(pwd) ; \ + cd - >> /dev/null ;\ done;\ - diff -u templates/steps_output.txt build/output.txt + diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" From 1ab7a129c7089c55b0530007967a5125eae98530 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:20:39 +0200 Subject: [PATCH 12/80] output of all steps for snapshot testing --- .../templates/output_snapshot.txt | 715 ++++++++++++++++++ 1 file changed, 715 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/output_snapshot.txt diff --git a/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt new file mode 100644 index 00000000..d3ef7de2 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt @@ -0,0 +1,715 @@ + +Output of 'build/report-example-step-1/loesung//auswertung.py': + + +Output of 'build/report-example-step-2/loesung//auswertung.py': + + +Trägheitsmoment (Kugel) +0.000203588707139895 +Trägheitsmoment (Zylinder) +0.00014610097410365817 +Messwerte (Kugel) +alle Zeiten +[1.86666667 1.83333333 1.9 1.16666667 1.2 1.16666667 + 0.93333333 0.93333333 0.9 0.8 0.8 0.8 + 0.7 0.7 0.7 0.63333333 0.63333333 0.7 ] +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[1.86666667 1.17777778 0.92222222 0.8 0.7 0.65555556] + + +Messwerte (Zylinder) +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +alle Zeiten +[2.16666667 1.96666667 2.13333333 1.33333333 1.3 1.3 + 1.03333333 1.06666667 1.1 0.93333333 0.93333333 0.96666667 + 0.8 0.83333333 0.76666667 0.73333333 0.7 0.73333333] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[2.08888889 1.31111111 1.06666667 0.94444444 0.8 0.72222222] + + +Output of 'build/report-example-step-3/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +Trägheitsmoment (Kugel) +0.000203588707139895 +Trägheitsmoment (Zylinder) +0.00014610097410365817 +Messwerte (Kugel) +alle Zeiten +[1.86666667 1.83333333 1.9 1.16666667 1.2 1.16666667 + 0.93333333 0.93333333 0.9 0.8 0.8 0.8 + 0.7 0.7 0.7 0.63333333 0.63333333 0.7 ] +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[1.86666667 1.17777778 0.92222222 0.8 0.7 0.65555556] + + +Messwerte (Zylinder) +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +alle Zeiten +[2.16666667 1.96666667 2.13333333 1.33333333 1.3 1.3 + 1.03333333 1.06666667 1.1 0.93333333 0.93333333 0.96666667 + 0.8 0.83333333 0.76666667 0.73333333 0.7 0.73333333] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[2.08888889 1.31111111 1.06666667 0.94444444 0.8 0.72222222] + + +Output of 'build/report-example-step-4/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:219: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:224: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 +Trägheitsmoment (Kugel) +0.000203588707139895 +Trägheitsmoment (Zylinder) +0.00014610097410365817 +Messwerte (Kugel) +alle Zeiten +[1.86666667 1.83333333 1.9 1.16666667 1.2 1.16666667 + 0.93333333 0.93333333 0.9 0.8 0.8 0.8 + 0.7 0.7 0.7 0.63333333 0.63333333 0.7 ] +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[1.86666667 1.17777778 0.92222222 0.8 0.7 0.65555556] + + +Messwerte (Zylinder) +alle Höhen +[0.045 0.045 0.045 0.1 0.1 0.1 0.15 0.15 0.15 0.2 0.2 0.2 + 0.25 0.25 0.25 0.3 0.3 0.3 ] +alle Zeiten +[2.16666667 1.96666667 2.13333333 1.33333333 1.3 1.3 + 1.03333333 1.06666667 1.1 0.93333333 0.93333333 0.96666667 + 0.8 0.83333333 0.76666667 0.73333333 0.7 0.73333333] +Höhe +[0.045 0.1 0.15 0.2 0.25 0.3 ] +gemittlelte Zeit +[2.08888889 1.31111111 1.06666667 0.94444444 0.8 0.72222222] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 1.932 ± 0.304 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-5/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-6/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-7/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-8/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-9/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + +Output of 'build/report-example-step-10/loesung//auswertung.py': + + +qt.qpa.theme.dbus: Session DBus not running. +qt.qpa.theme.dbus: Application will not react to setting changes. + Check your DBus installation. +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 +Trägheitsmoment (Kugel) +0.000204+/-0.000013 +Trägheitsmoment (Zylinder) +0.000146+/-0.000016 +Messwerte (Kugel) +alle Zeiten +[1.8666666666666667+/-0.04714045207910317 + 1.8333333333333333+/-0.04714045207910317 1.9+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 1.2+/-0.04714045207910317 + 1.1666666666666667+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 0.9+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 + 0.6333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317] +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[1.8666666666666665+/-0.027216552697590865 + 1.1777777777777778+/-0.027216552697590865 + 0.9222222222222222+/-0.027216552697590865 + 0.8000000000000002+/-0.027216552697590865 + 0.6999999999999998+/-0.027216552697590865 + 0.6555555555555556+/-0.027216552697590865] + + +Messwerte (Zylinder) +alle Höhen +[0.045+/-0.005 0.045+/-0.005 0.045+/-0.005 0.1+/-0.005 0.1+/-0.005 + 0.1+/-0.005 0.15+/-0.005 0.15+/-0.005 0.15+/-0.005 0.2+/-0.005 + 0.2+/-0.005 0.2+/-0.005 0.25+/-0.005 0.25+/-0.005 0.25+/-0.005 + 0.3+/-0.005 0.3+/-0.005 0.3+/-0.005] +alle Zeiten +[2.1666666666666665+/-0.04714045207910317 + 1.9666666666666666+/-0.04714045207910317 + 2.1333333333333333+/-0.04714045207910317 + 1.3333333333333333+/-0.04714045207910317 1.3+/-0.04714045207910317 + 1.3+/-0.04714045207910317 1.0333333333333334+/-0.04714045207910317 + 1.0666666666666667+/-0.04714045207910317 1.1+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9333333333333333+/-0.04714045207910317 + 0.9666666666666667+/-0.04714045207910317 0.8+/-0.04714045207910317 + 0.8333333333333334+/-0.04714045207910317 + 0.7666666666666667+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317 0.7+/-0.04714045207910317 + 0.7333333333333333+/-0.04714045207910317] +Höhe +[0.045+/-0.005 0.1+/-0.005 0.15+/-0.005 0.2+/-0.005 0.25+/-0.005 + 0.3+/-0.005] +gemittlelte Zeit +[2.0888888888888886+/-0.027216552697590865 + 1.3111111111111111+/-0.027216552697590865 + 1.0666666666666667+/-0.027216552697590865 + 0.9444444444444445+/-0.027216552697590865 + 0.7999999999999999+/-0.027216552697590865 + 0.7222222222222222+/-0.027216552697590865] + + +Fitparameter (Kugel) +g = 9.952 ± 0.431 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +g = 8.892 ± 0.402 +t = -0.135 ± 0.031 + + +Fitparameter (Kugel) +I = 0.417 ± 0.066 +t = -0.148 ± 0.027 + + +Fitparameter (Zylinder) +I = 1.897 ± 0.212 +t = -0.135 ± 0.031 + + From 9ebfcba6e8036af85a9482cbaa62ea6f78cf3fce Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:21:16 +0200 Subject: [PATCH 13/80] add data with uncertainty columns --- .../Messwerte_Bahn.txt | 4 ++++ .../Messwerte_Frames_Kugel.txt | 21 ++++++++++++++++++ .../Messwerte_Frames_Zylinder.txt | 22 +++++++++++++++++++ .../Messwerte_Kamera.txt | 4 ++++ .../Messwerte_Kugel.txt | 5 +++++ .../Messwerte_Zylinder.txt | 5 +++++ 6 files changed, 61 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Bahn.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Kugel.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Zylinder.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kamera.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kugel.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Zylinder.txt diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Bahn.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Bahn.txt new file mode 100644 index 00000000..cc6a4720 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Bahn.txt @@ -0,0 +1,4 @@ +# l,sigma_l +80,0.5 +# Länge der Bahn +# cm (l / cm) diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Kugel.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Kugel.txt new file mode 100644 index 00000000..91bc58b6 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Kugel.txt @@ -0,0 +1,21 @@ +# h,sigma_h,Fi,sigma_Fi,Ff,sigma_Ff +4.5,0.5,436,1,492,1 +4.5,0.5,555,1,610,1 +4.5,0.5,672,1,729,1 +10,0.5,95,1,130,1 +10,0.5,199,1,235,1 +10,0.5,303,1,338,1 +15,0.5,91,1,119,1 +15,0.5,201,1,229,1 +15,0.5,335,1,362,1 +20,0.5,232,1,256,1 +20,0.5,323,1,347,1 +20,0.5,397,1,421,1 +25,0.5,153,1,174,1 +25,0.5,239,1,260,1 +25,0.5,322,1,343,1 +30,0.5,219,1,238,1 +30,0.5,319,1,338,1 +30,0.5,391,1,412,1 +# Messreihe: Kugel +# Höhe(h/cm), Startframe(Fi/1), Endframe(Ff/1) diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Zylinder.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Zylinder.txt new file mode 100644 index 00000000..2321d313 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Frames_Zylinder.txt @@ -0,0 +1,22 @@ +# h,sigma_h,Fi,sigma_Fi,Ff,sigma_Ff +4.5,0.5,1018,1,1083,1 +4.5,0.5,1189,1,1248,1 +4.5,0.5,1340,1,1404,1 +10,0.5,596,1,636,1 +10,0.5,762,1,801,1 +10,0.5,882,1,921,1 +15,0.5,574,1,605,1 +15,0.5,766,1,798,1 +15,0.5,863,1,896,1 +20,0.5,679,1,707,1 +20,0.5,810,1,838,1 +20,0.5,930,1,959,1 +25,0.5,650,1,674,1 +25,0.5,892,1,917,1 +25,0.5,804,1,827,1 +30,0.5,642,1,664,1 +30,0.5,739,1,760,1 +30,0.5,900,1,922,1 + +# Messreihe: Zylinder +# Höhe(h/cm), Startframe(Fi/1), Endframe(Ff/1) diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kamera.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kamera.txt new file mode 100644 index 00000000..add88808 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kamera.txt @@ -0,0 +1,4 @@ +# fps,sigma_fps +30,0 +# Framerate der Videoaufnahmen +# Frames per second (fps / 1/s) diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kugel.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kugel.txt new file mode 100644 index 00000000..48b54cb9 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Kugel.txt @@ -0,0 +1,5 @@ +#m,sigma_m,U,sigma_U +216,1,30.5,0.1 + +# Messdaten der Kugel: Vollkugel +# Umfang (U/cm), Masse (m/g) diff --git a/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Zylinder.txt b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Zylinder.txt new file mode 100644 index 00000000..d9d19ddf --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_with_uncertainties/Messwerte_Zylinder.txt @@ -0,0 +1,5 @@ +#m,sigma_m,U,sigma_U,d,sigma_d +186,1,24.3,0.1,3,1 + +# Messdaten des Zylinders: Hohlzylinder mit Boden aber ohne Deckel +# Umfang (U/cm), Masse (m/g), Wanddicke (Differenz zwischen Innen- und Außenradius) (d/mm) From fb498ae0631f743bb90224543e2c29aa584367f2 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:21:34 +0200 Subject: [PATCH 14/80] add data without uncertainty columns --- .../Messwerte_Bahn.txt | 4 ++++ .../Messwerte_Frames_Kugel.txt | 21 +++++++++++++++++++ .../Messwerte_Frames_Zylinder.txt | 21 +++++++++++++++++++ .../Messwerte_Kamera.txt | 4 ++++ .../Messwerte_Kugel.txt | 5 +++++ .../Messwerte_Zylinder.txt | 5 +++++ 6 files changed, 60 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Bahn.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Kugel.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Zylinder.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kamera.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kugel.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Zylinder.txt diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Bahn.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Bahn.txt new file mode 100644 index 00000000..bc860551 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Bahn.txt @@ -0,0 +1,4 @@ +# l +80 +# Länge der Bahn +# cm (l / cm) diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Kugel.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Kugel.txt new file mode 100644 index 00000000..72cb5208 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Kugel.txt @@ -0,0 +1,21 @@ +# h,Fi,Ff, +4.5,436,492 +4.5,555,610 +4.5,672,729 +10,95,130 +10,199,235 +10,303,338 +15,91,119 +15,201,229 +15,335,362 +20,232,256 +20,323,347 +20,397,421 +25,153,174 +25,239,260 +25,322,343 +30,219,238 +30,319,338 +30,391,412 +# Messreihe: Kugel +# Höhe(h/cm), Startframe(Fi/1), Endframe(Ff/1) diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Zylinder.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Zylinder.txt new file mode 100644 index 00000000..245c87d2 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Frames_Zylinder.txt @@ -0,0 +1,21 @@ +#h,Fi,Ff +4.5,1018,1083 +4.5,1189,1248 +4.5,1340,1404 +10,596,636 +10,762,801 +10,882,921 +15,574,605 +15,766,798 +15,863,896 +20,679,707 +20,810,838 +20,930,959 +25,650,674 +25,892,917 +25,804,827 +30,642,664 +30,739,760 +30,900,922 +# Messreihe: Zylinder +# Höhe(h/cm), Startframe(Fi/1), Endframe(Ff/1) diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kamera.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kamera.txt new file mode 100644 index 00000000..1b429402 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kamera.txt @@ -0,0 +1,4 @@ +# fps +30 +# Framerate der Videoaufnahmen +# Frames per second (fps / 1/s) diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kugel.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kugel.txt new file mode 100644 index 00000000..1dc033ed --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Kugel.txt @@ -0,0 +1,5 @@ +#m,U +216,30.5 + +# Messdaten der Kugel: Vollkugel +# Umfang (U/cm), Masse (m/g) diff --git a/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Zylinder.txt b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Zylinder.txt new file mode 100644 index 00000000..6ba4a540 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/data_without_uncertainties/Messwerte_Zylinder.txt @@ -0,0 +1,5 @@ +#m,U,d +186,24.3,3 + +# Messdaten des Zylinders: Hohlzylinder mit Boden aber ohne Deckel +# Umfang (U/cm), Masse (m/g), Wanddicke (Differenz zwischen Innen- und Außenradius) (d/mm) From 8d0ea12a9898d867c9a81a7263187b5982111d9e Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:22:40 +0200 Subject: [PATCH 15/80] add template for the latex files --- .../templates/latex/auswertung_template | 204 ++++++++++++++++++ .../templates/latex/diskussion_template | 44 ++++ .../templates/latex/durchfuehrung_template | 22 ++ .../templates/latex/header_template | 139 ++++++++++++ .../templates/latex/theorie_template | 74 +++++++ .../templates/latex/v16516_template | 26 +++ 6 files changed, 509 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/auswertung_template create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/diskussion_template create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/header_template create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/theorie_template create mode 100644 exercises-toolbox/8-all/example-report/templates/latex/v16516_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template new file mode 100644 index 00000000..7befe84c --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template @@ -0,0 +1,204 @@ +\section{Auswertung} % <7-10> +\label{sec:Auswertung} % <9-10> +Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-10> +\begin{align} % <8-10> + \label{eq:physical-properties} % <9-10> + m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <8-10> + r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <8-10> + r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <8-10> + + +\qty{0.2160+-0.0010}{\kilo\gram} +\qty{0.2160+-0.0010}{\kilo\gram} + + + m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-10> + r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-10> + r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-10> +\end{align} % <8-10> +Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-10> +\begin{align} % <8-10> + \label{eq:moments-inertia} % <8-10> + I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <8-10> +\end{align} % <8-10> +Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-10> +Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-10> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-10> +berechnet % <7-10> +\begin{equation*} % <8-10> + t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-10> +\end{equation*} % <8-10> + % <7-10> +\begin{table} % <9-10> + \centering % <9-10> + \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-10> + \label{tab:all-measurements} % <9-10> + \begin{tblr}{ % <9-10> + colspec = { % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + }, % <9-10> + row{1} = {guard}, % <9-10> + row{2} = {guard, mode=math}, % <9-10> + vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-10> + } % <9-10> + \toprule % <9-10> + & % <9-10> + \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-10> + \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-10> + \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-10> + h \mathbin{/} \unit{\meter} &% % <9-10> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> + \SetCell[c=2]{c} F_\text{i} & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> + \midrule % <9-10> + 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-10> + 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-10> + 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-10> + 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-10> + 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-10> + 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-10> + 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-10> + 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-10> + 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-10> + 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-10> + 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-10> + 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-10> + 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-10> + 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-10> + 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-10> + 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-10> + \bottomrule % <9-10> + \end{tblr} % <9-10> + \input{build/table_all-measurements.tex} % <10-10> +\end{table} % <9-10> + % <7-10> +Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-10> +in \autoref{tab:averaged-measurements}. Diese Werte werden für die folgenden % <9-10> +Auswertungsschritte verwendet. % <9-10> + % <7-10> +\begin{table} % <9-10> + \centering % <9-10> + \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-10> + \label{tab:averaged-measurements} % <9-10> + % <9-10> + \begin{tblr}{ % <9-9> + colspec = { % <9-9> + S[table-format=1.3] % <9-9> + S[table-format=2.3] % <9-9> + S[table-format=1.4] % <9-9> + S[table-format=3.3] % <9-9> + S[table-format=1.5] % <9-9> + }, % <9-9> + row{1} = {guard}, % <9-9> + row{2} = {guard, mode=math}, % <9-9> + vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, % <9-9> + } % <9-9> + \toprule % <9-9> + & % <9-9> + \SetCell[c=2]{c} Messung: Kugel & & % <9-9> + \SetCell[c=2]{c} Messung: Zylinder &\\ % <9-9> + \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} % <9-9> + h \mathbin{/} \unit{\meter} &% % <9-9> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-9> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-9> + \midrule % <9-9> + 0.045 & 1.867 & 0.027 & 2.089 & 0.027 \\ % <9-9> + 0.100 & 1.178 & 0.027 & 1.311 & 0.027 \\ % <9-9> + 0.150 & 0.922 & 0.027 & 1.067 & 0.027 \\ % <9-9> + 0.200 & 0.800 & 0.027 & 0.944 & 0.027 \\ % <9-9> + 0.250 & 0.700 & 0.027 & 0.800 & 0.027 \\ % <9-9> + 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-9> + \bottomrule % <9-9> + \end{tblr} % <9-9> + \input{build/table_averaged-measurements.tex} % <10-10> +\end{table} % <9-10> + % <7-10> +\subsection{Bestimmung der Fallbeschleunigung} % <7-10> + % <7-10> +Für die Bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> +\eqref{eq:fit-function-g-ball} respektive \eqref{eq:fit-function-g-cylinder} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-g-ball} % <9-10> +und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-g_ball.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-10> + \label{fig:fit-g-ball} % <9-10> +\end{figure} % <9-10> + % <9-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-g_cylinder.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-10> + \label{fig:fit-g-cylinder} % <9-10> +\end{figure} % <9-10> + % <7-10> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> +\begin{align} % <8-10> + \label{eq:parameters-g_ball} % <8-10> + g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <8-10> +\intertext{und für den Zylinder} % <8-10> + \label{eq:parameters-g_cylinder} % <8-10> + g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <8-10> +\end{align} % <8-10> + % <7-10> +\subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-10> + % <7-10> +Für die bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> +\eqref{eq:fit-function-I} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-I-ball} % <9-10> +und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <9-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-I_ball.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-10> + \label{fig:fit-I-ball} % <9-10> +\end{figure} % <9-10> + % <7-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-I_cylinder.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-10> + \label{fig:fit-I-cylinder} % <9-10> +\end{figure} % <9-10> + % <7-10> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> +\begin{align} % <8-10> + \label{eq:parameters-I_ball} % <8-10> + I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <8-10> + \intertext{und für den Zylinder} % <8-10> + \label{eq:parameters-I_cylinder} % <8-10> + I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <8-10> +\end{align} % <8-10> + + diff --git a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template new file mode 100644 index 00000000..dc5ca8eb --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template @@ -0,0 +1,44 @@ +\section{Diskussion} % <7-10> +\label{sec:Diskussion} % <9-10> + % <7-10> +TODO: Diskussion fertig machen ;-) % <7-10> + % <7-10> +Notizen: % <7-10> + % <7-10> +Bestimmung von g: % <7-10> + % <7-10> +Fits % <7-10> + % <7-10> +\autoref{fig:fit-g-ball} % <9-10> + % <7-10> +\autoref{fig:fit-g-cylinder} % <9-10> + % <7-10> +passen zu den Messwerten. % <7-10> + % <7-10> + % <7-10> +Die Fit parameter % <7-10> +\eqref{eq:parameters-g_ball} % <8-10> +\eqref{eq:parameters-g_cylinder} % <8-10> + % <7-10> +passen zum theoretischen Wert $\num{9.81}{\meter\per\second\squared}$ % <8-10> +passen zum theoretischen Wert \input{theoretical-g.tex} % <10-10> +=> TODO: Abweichungen berechnen % <7-10> + % <7-10> +Die übereinstimmung der Fitparameter t0, weist auf eine systematische Unsicherheit % <7-10> +=> TODO: Berechnung des Offsets in Frames % <7-10> + % <7-10> +Analog für die Bestimmung von I: % <7-10> + % <7-10> +Fits: % <7-10> + % <7-10> +\autoref{fig:fit-I-ball} % <9-10> + % <7-10> +\autoref{fig:fit-I-cylinder} % <9-10> + % <7-10> +\eqref{eq:parameters-I_ball} % <9-10> + % <9-10> +\eqref{eq:parameters-I_cylinder} % <9-10> + % <9-10> +\eqref{eq:moments-inertia} % <9-10> + % <7-10> +=> TODO: Abweichungen berechnen % <7-10> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template new file mode 100644 index 00000000..540cac25 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template @@ -0,0 +1,22 @@ +\section{Durchführung} % <7-10> +\label{sec:Durchführung} % <9-10> + % <7-10> +Wie in der Anleitung~\cite{V16516} beschrieben, wird der Versuch wie folgt durchgeführt. % <9-10> + % <9-10> +Wie einst von Galileo Galilei \cite[232]{galilei1623} persönlich, wurden im hier beschriebenen Versuch % <9-10> +Objekte (eine Kugel und Holzylinder in Form eines Glases) eine schiefe Ebene hinab gerollt. % <9-10> + % <9-10> +Notiert wird dabei die Starthöhen $h$. Der Prozess des Herabrollens wird mit einer Kamera % <8-10> +aufgezeichnet, um aus der Zeit $t$ bis zum erreichen des Endes der schiefen Ebene möglichst genau % <8-10> +aus den Einzelbildern (frames) des Films ablesen zu können. % <8-10> + % <7-10> +Die aufgenommenen Messdaten werden für zwei unabhängige Zwecke verwendet: % <7-10> + % <7-10> +\begin{enumerate} % <8-10> + \item {Bestimmung der Fallbeschleunigung $g$, dafür werden % <8-10> + die theoretischen Trägheitsmomente angenommen.} % <8-10> + \item {Bestimmung der Trägheitsmomente $I$ der beiden Objekte unter Annahme der theoretischen % <8-10> + Fallbeschleunigung.} % <8-10> +\end{enumerate} % <8-10> + + diff --git a/exercises-toolbox/8-all/example-report/templates/latex/header_template b/exercises-toolbox/8-all/example-report/templates/latex/header_template new file mode 100644 index 00000000..3362124f --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/header_template @@ -0,0 +1,139 @@ +\documentclass[ % <7-10> + bibliography=totoc, % Literatur im Inhaltsverzeichnis % <9-10> + captions=tableheading, % Tabellenüberschriften % <9-10> + titlepage=firstiscover, % Titelseite ist Deckblatt % <7-10> +]{scrartcl} % <7-10> + % <7-10> +% Paket float verbessern % <7-10> +\usepackage{scrhack} % <9-10> + % <7-10> +% Warnung, falls nochmal kompiliert werden muss % <7-10> +\usepackage[aux]{rerunfilecheck} % <7-10> + % <7-10> +% unverzichtbare Mathe-Befehle % <7-10> +\usepackage{amsmath} % <7-10> +% viele Mathe-Symbole % <7-10> +\usepackage{amssymb} % <7-10> +% Erweiterungen für amsmath % <7-10> +\usepackage{mathtools} % <7-10> + % <7-10> +% Fonteinstellungen % <7-10> +\usepackage{fontspec} % <7-10> +% Latin Modern Fonts werden automatisch geladen % <7-10> +% Alternativ zum Beispiel: % <7-10> +%\setromanfont{Libertinus Serif} % <7-10> +%\setsansfont{Libertinus Sans} % <7-10> +%\setmonofont{Libertinus Mono} % <7-10> + % <7-10> +% Wenn man andere Schriftarten gesetzt hat, % <7-10> +% sollte man das Seiten-Layout neu berechnen lassen % <7-10> +\recalctypearea{} % <7-10> + % <7-10> +% deutsche Spracheinstellungen % <7-10> +\usepackage[ngerman]{babel} % <7-10> + % <7-10> + % <7-10> +\usepackage[ % <7-10> + math-style=ISO, % ┐ % <7-10> + bold-style=ISO, % │ % <7-10> + sans-style=italic, % │ ISO-Standard folgen % <7-10> + nabla=upright, % │ % <7-10> + partial=upright, % │ % <7-10> + mathrm=sym, % ┘ % <7-10> + warnings-off={ % ┐ % <7-10> + mathtools-colon, % │ unnötige Warnungen ausschalten % <7-10> + mathtools-overbracket, % │ % <7-10> + }, % ┘ % <7-10> +]{unicode-math} % <7-10> + % <7-10> +% traditionelle Fonts für Mathematik % <7-10> +\setmathfont{Latin Modern Math} % <7-10> +% Alternativ zum Beispiel: % <7-10> +%\setmathfont{Libertinus Math} % <7-10> + % <7-10> +\setmathfont{XITS Math}[range={scr, bfscr}] % <7-10> +\setmathfont{XITS Math}[range={cal, bfcal}, StylisticSet=1] % <7-10> + % <7-10> +% Zahlen und Einheiten % <8-10> +\usepackage[ % <8-10> + locale=DE, % deutsche Einstellungen % <8-10> + separate-uncertainty=true, % immer Unsicherheit mit \pm % <8-10> + per-mode=symbol-or-fraction, % / in inline math, fraction in display math % <8-10> +]{siunitx} % <8-10> + % <7-10> +% chemische Formeln % <8-10> +\usepackage[ % <8-10> + version=4, % <8-10> + math-greek=default, % ┐ mit unicode-math zusammenarbeiten % <8-10> + text-greek=default, % ┘ % <8-10> +]{mhchem} % <8-10> + % <7-10> +% richtige Anführungszeichen % <7-10> +\usepackage[autostyle]{csquotes} % <7-10> + % <7-10> +% schöne Brüche im Text % <7-10> +\usepackage{xfrac} % <8-10> + % <7-10> +% Standardplatzierung für Floats einstellen % <9-10> +\usepackage{float} % <9-10> +\floatplacement{figure}{htbp} % <9-10> +\floatplacement{table}{htbp} % <9-10> + % <7-10> +% Floats innerhalb einer Section halten % <9-10> +\usepackage[ % <9-10> + section, % Floats innerhalb der Section halten % <9-10> + below, % unterhalb der Section aber auf der selben Seite ist ok % <9-10> +]{placeins} % <9-10> + % <7-10> +% Seite drehen für breite Tabellen: landscape Umgebung % <9-10> +\usepackage{pdflscape} % <9-10> + % <7-10> +% Captions schöner machen. % <9-10> +\usepackage[ % <9-10> + labelfont=bf, % Tabelle x: Abbildung y: ist jetzt fett % <9-10> + font=small, % Schrift etwas kleiner als Dokument % <9-10> + width=0.9\textwidth, % maximale Breite einer Caption schmaler % <9-10> +]{caption} % <9-10> +% subfigure, subtable, subref % <9-10> +\usepackage{subcaption} % <9-10> + % <7-10> + % <7-10> +% Grafiken können eingebunden werden % <7-10> +\usepackage{graphicx} % <9-10> + % <9-10> +% schöne Tabellen % <9-10> +\usepackage{tabularray} % <9-10> +\UseTblrLibrary{booktabs,siunitx} % <9-10> + % <7-10> +% Verbesserungen am Schriftbild % <7-10> +\usepackage{microtype} % <10-10> + % <7-10> +% Literaturverzeichnis % <9-10> +\usepackage[ % <9-10> + backend=biber, % <9-10> +]{biblatex} % <9-10> +% Quellendatenbank % <9-10> +\addbibresource{lit.bib} % <9-10> +\addbibresource{programme.bib} % <9-10> + % <7-10> +% Hyperlinks im Dokument % <7-10> +\usepackage[ % <7-10> + german, % <7-10> + unicode, % Unicode in PDF-Attributen erlauben % <7-10> + pdfusetitle, % Titel, Autoren und Datum als PDF-Attribute % <7-10> + pdfcreator={}, % ┐ PDF-Attribute säubern % <7-10> + pdfproducer={}, % ┘ % <7-10> +]{hyperref} % <7-10> +% erweiterte Bookmarks im PDF % <7-10> +\usepackage{bookmark} % <7-10> + % <7-10> +% Trennung von Wörtern mit Strichen % <7-10> +\usepackage[shortcuts]{extdash} % <7-10> + % <7-10> +\author{% % <7-10> + Joshua Luckey\\% % <7-10> + \href{mailto:joshua.luckey@udo.edu}{joshua.luckey@udo.edu}% % <7-10> + \and% % <7-10> + PeP et al.: Toolbox Workshop\\% % <7-10> + \href{mailto:pep-toolbox.physik@lists.tu-dortmund.de}{pep-toolbox.physik@lists.tu-dortmund.de} % <7-10> +} % <7-10> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_template new file mode 100644 index 00000000..1225e466 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_template @@ -0,0 +1,74 @@ +\section{Theorie} % <7-10> +\label{sec:Theorie} % <9-10> + % <7-10> +Wie in der Abbildung \autoref{fig:experimental-setup} veranschaulicht, beginnen die Objekte % <9-10> +in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <9-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \begin{tikzpicture}[scale=3] % <9-10> + \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <9-10> + \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <9-10> + \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <9-10> + \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <9-10> + \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <9-10> + \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <9-10> + \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <9-10> + \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <9-10> + \end{tikzpicture} % <9-10> + \caption{Schematische Darstellung des Versuchsaufbaus. Das runde Objekt (Kugel oder Zylinder) wird in der Höhe $h$ % <9-10> + auf eine schiefe Ebene gelegt, sodass es aus der Ruhe herabrollt. Die Bewegung ist beschleunigt, sodass sowohl % <9-10> + die Geschwindigkeit $\vec{v}(t)$ sowie die Winkelgeschwindigkeit $\omega(t)$ nicht konstant sind.} % <9-10> + \label{fig:experimental-setup} % <9-10> +\end{figure} % <9-10> + % <7-10> +Zwischen Ebene und Objekten wirkt eine nicht zu vernachlässigende Reibung, wodurch die % <7-10> +Objekte nach dem loslassen in Rotation versetzt werden, also tatsächlich herabrollen. % <7-10> +Thermische Reibungsverluste werden jedoch vernächlässigt, sodass Energieerhaltung % <7-10> +angenommen werden kann. Nach dieser gilt % <7-10> + % <7-10> +\begin{align*} % <8-10> +E^\text{pot}_\text{i} &= E^\text{kin}_\text{f} + E^\text{rot}_\text{f} \\ % <8-10> +mgh &= \frac{m}{2}v^2 + \frac{I}{2}\omega^2 \quad\big|\,\omega = \frac{v}{r} \\ % <8-10> +mgh &= \frac{m}{2}v^2 + \frac{I}{2}\frac{v^2}{r^2}\quad\big|\, :mgh \\ % <8-10> +1 &= \frac{v^2}{2gh} \left(1 + \frac{I}{mr^2} \right)\\ % <8-10> + \intertext{aus der Kinematik~\cite{kuypers2016klassische} ist bekannt, dass die Endgeschwindigkeit einer % <8-10> +beschleunigten Bewegung (in der Zeit $t$, entlang einer Strecke $l$) $v = \frac{2l}{t}$ ist. % <8-10> +Es gilt also} % <8-10> +1 &= \left(\frac{2l}{t}\right)^2 \frac{1}{2gh} \left(1 + \frac{I}{mr^2} \right)\quad\big|\, \cdot t^2 \\ % <8-10> +\addtocounter{equation}{1} % <8-10> +t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)\label{eq:tsquared}\tag{\theequation} % <8-10> +\label{eq:tsquared}\tag{\theequation} % <9-10> +\end{align*} % <8-10> + % <7-10> +Aus \eqref{eq:tsquared} ergeben sich dann die jeweiligen Ausgleichsfunktionen für beide Versuchsteile. % <9-10> + % <7-10> +Für die Bestimmung der Trägheitsmomente wird nur noch die Quadratwurzel von \eqref{eq:tsquared} % <7-10> +berechnet und ein Startzeit als Parameter hinzugefügt, % <7-10> + % <7-10> +\begin{equation} % <8-10> +t(h) = \sqrt{\frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)} + t_0. % <8-10> +\label{eq:fit-function-I} % <9-10> +\end{equation} % <8-10> + % <7-10> +Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <7-10> +Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <7-10> + % <7-10> +Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-10> +für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-10> +\begin{align*} % <7-10> + I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2), % <7-10> +\end{align*} % <7-10> +ergeben sich die folgenden Ausgleichsfunktionen % <7-10> + % <7-10> +\begin{align} % <8-10> +t_\text{K}(h) &= \sqrt{\frac{2l^2}{gh} \left(\frac{7}{5}\right)} + t_0 % <8-10> +\label{eq:fit-function-g-ball} % <9-10> +% % <8-10> +\intertext{und} % <8-10> +% % <8-10> +t_\text{Z}(h) &= \sqrt{\frac{l^2}{gh} \left(3 + \left(\frac{r_{\text{Z},\text{innen}}}{r_{\text{Z},\text{außen}}}\right)^2 \right)} + t_0.% <8-10> +\label{eq:fit-function-g-cylinder} % <9-10> +\end{align} % <8-10> +Dabei sind in diesen Gleichungen $g$ und $t_0$ die Ausgleichsparameter. % <8-10> + diff --git a/exercises-toolbox/8-all/example-report/templates/latex/v16516_template b/exercises-toolbox/8-all/example-report/templates/latex/v16516_template new file mode 100644 index 00000000..661b8fdf --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex/v16516_template @@ -0,0 +1,26 @@ +\input{header.tex} % <7-10> +\usepackage{tikz} % <10-10> + % <7-10> +\subject{V16516} % <7-10> +\title{Die schiefe Ebene} % <7-10> +\date{% % <7-10> + Durchführung: 29.09.2023 % <7-10> + \hspace{3em} % <7-10> + Abgabe: 23.09.2024 % <7-10> +} % <7-10> + % <7-10> +\begin{document} % <7-10> + % <7-10> +\maketitle % <7-10> +\thispagestyle{empty} % <7-10> +\tableofcontents % <7-10> +\newpage % <7-10> + % <7-10> +\input{content/theorie.tex} % <7-10> +\input{content/durchfuehrung.tex} % <7-10> +\input{content/auswertung.tex} % <7-10> +\input{content/diskussion.tex} % <7-10> + % <7-10> +\printbibliography{} % <9-10> + % <9-10> +\end{document} % <7-10> From 14c0b78a5d1df3936daa0156c55d820199eea5c6 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:23:06 +0200 Subject: [PATCH 16/80] add template for the python script --- .../{ => templates}/auswertung_template | 607 +++++++++--------- 1 file changed, 302 insertions(+), 305 deletions(-) rename exercises-toolbox/8-all/example-report/{ => templates}/auswertung_template (94%) diff --git a/exercises-toolbox/8-all/example-report/auswertung_template b/exercises-toolbox/8-all/example-report/templates/auswertung_template similarity index 94% rename from exercises-toolbox/8-all/example-report/auswertung_template rename to exercises-toolbox/8-all/example-report/templates/auswertung_template index 4008743b..1b795ab7 100644 --- a/exercises-toolbox/8-all/example-report/auswertung_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_template @@ -1,148 +1,148 @@ # Erklärung: # <2-2> # Importiere numpy unter dem Namen np # <2-2> -import numpy as np # <2-6> - # <2-6> +import numpy as np # <2-10> + # <2-10> # Erklärung: # <3-3> # Importiere matplotlib.pyplot unter dem Namen plt # <3-3> -import matplotlib.pyplot as plt # <3-6> - # <2-6> - # <2-6> +import matplotlib.pyplot as plt # <3-10> + # <2-10> + # <2-10> # Erklärung: # <4-4> # Importiere curve_fit aus scipy.optimize # <4-4> -from scipy.optimize import curve_fit # <4-6> -from scipy.constants import physical_constants # <4-6> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Importiere uncertainties unter dem Namen unc # <5-6> -# Importiere uncertainties.unumpy unter dem Namen unp # <5-6> -# Importiere der Funktionen nominal_values und std_devs # <5-6> -# aus uncertainties.unumpy, unter den kürzeren Namen # <5-6> -# noms respektive stds # <5-6> -import uncertainties as unc # <5-6> -import uncertainties.unumpy as unp # <5-6> -from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-6> - # <2-6> +from scipy.optimize import curve_fit # <4-10> +from scipy.constants import physical_constants # <4-10> + # <2-10> + # <2-10> +# Erklärung: # <5-10> +# Importiere uncertainties unter dem Namen unc # <5-10> +# Importiere uncertainties.unumpy unter dem Namen unp # <5-10> +# Importiere der Funktionen nominal_values und std_devs # <5-10> +# aus uncertainties.unumpy, unter den kürzeren Namen # <5-10> +# noms respektive stds # <5-10> +import uncertainties as unc # <5-10> +import uncertainties.unumpy as unp # <5-10> +from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-10> + # <2-10> # Erklärung: # <2-2> # Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> # zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> # es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> -# # <2-6> +# # <2-10> # Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> -# # <2-6> +# # <2-10> # Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> # ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> # nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> # Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> -# # <2-6> +# # <2-10> # Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> # (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-6> -# für die meisten Messwerte. # <5-6> -# Beim Importieren der Daten muss beachtet werden, dass: # <5-6> -# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-6> -# Auch hier ist eine konsistente Benennung sinnvoll # <5-6> -# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-6> -# # <5-6> -# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-6> -# entweder durch unc.ufloat oder durch das unp.uarray # <5-6> - # <2-6> - # <2-6> -# Länge der schiefen Ebene # <2-6> + # <2-10> + # <2-10> +# Erklärung: # <5-10> +# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-10> +# für die meisten Messwerte. # <5-10> +# Beim Importieren der Daten muss beachtet werden, dass: # <5-10> +# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-10> +# Auch hier ist eine konsistente Benennung sinnvoll # <5-10> +# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-10> +# # <5-10> +# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-10> +# entweder durch unc.ufloat oder durch das unp.uarray # <5-10> + # <2-10> + # <2-10> +# Länge der schiefen Ebene # <2-10> l = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",")/100 # m # <2-4> -l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-6> -l = unc.ufloat(l, l_unc) # <5-6> - # <2-6> +l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-10> +l = unc.ufloat(l, l_unc) # <5-10> + # <2-10> # Framerate der Kamera # <2-4> -# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-6> +# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-10> fps = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",") # 1/s # <2-4> -fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-6> - # <2-6> +fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-10> + # <2-10> # Erklärung: # <2-2> # Die Daten aus Dateien mit mehreren spalten muss man in einer extra Zeile skalieren # <2-2> -# Masse und Umfang der Kugel # <2-6> +# Masse und Umfang der Kugel # <2-10> m_b, u_b = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <2-4> -m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-6> +m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-10> m_b = m_b/1000 # kg # <2-4> u_b = u_b/100 # m # <2-4> -m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-6> -u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-6> - # <2-6> -# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-6> +m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-10> +u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-10> + # <2-10> +# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-10> h_b, Fi_b, Ff_b = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <2-4> -h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-6> +h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-10> h_b = h_b/100 # m # <2-4> -h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-6> -Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-6> -Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-6> - # <2-6> - # <2-6> -# Masse und Umfang des Zylinders # <2-6> +h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-10> +Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-10> +Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-10> + # <2-10> + # <2-10> +# Masse und Umfang des Zylinders # <2-10> m_c, u_c, d_c = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-10> m_c = m_c/1000 # kg # <2-4> u_c = u_c/100 # m # <2-4> d_c = d_c/100 # m # <2-4> -m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-6> -u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-6> -d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-6> - # <2-6> -# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-6> +m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-10> +u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-10> +d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-10> + # <2-10> +# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-10> h_c, Fi_c, Ff_c = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-6> +h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-10> h_c = h_c/100 # m # <2-4> -h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-6> -Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-6> -Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-6> - # <2-6> +h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-10> +Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-10> +Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-10> + # <2-10> # Erklärung: # <2-2> # Ein gewisses Maß an Struktur in der Benennung von Variablen hilft bei der Orientierung, # <2-2> # gerade in der Zusammenarbeit mit euren jeweiligen Partnern. # <2-2> # Man muss es aber auch nicht übertreiben. Gerade ein Sprachenmix aus deutsch und englisch # <2-2> # ist nicht besonders tragisch: z.B. steht m_b für mass_ball aber u_b für umfang_ball, # <2-2> # aber das p_b für perimeter_ball würde mir persönlich nicht so klar werden. # <2-2> - # <2-6> + # <2-10> # Erklärung: # <2-2> # Auch die einzelnen "Arbeitsschritte" der Auswertung sollten in einem # <2-2> # kurzen Kommentar erklärt werden. # <2-2> # Erklärung: # <2-2> -# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-6> - # <2-6> - # <2-6> -# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-6> - # <2-6> -# Radius der Kugel # <2-6> -r_b = u_b/(2*np.pi) # <2-6> - # <2-6> -# Äußerer Radius des Zylinders # <2-6> -ro_c = u_c/(2*np.pi) # <2-6> - # <2-6> -# Innerer Radius des Zylinders # <2-6> -ri_c = ro_c - d_c # <2-6> - # <2-6> - # <2-6> -# Trägheitsmoment der Kugel # <2-6> -I_b = 2/5 * m_b * r_b**2 # <2-6> - # <2-6> -# Trägheitsmoment des Zylinders # <2-6> -I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-6> - # <2-6> -print("Trägheitsmoment (Kugel)") # <2-6> -print(I_b) # <2-6> - # <2-6> -print("Trägheitsmoment (Zylinder)") # <2-6> -print(I_c) # <2-6> - # <2-6> - # <2-6> -# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-6> -t_b = (Ff_b - Fi_b)/fps # <2-6> -t_c = (Ff_c - Fi_c)/fps # <2-6> - # <2-6> -# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-6> - # <2-6> +# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-10> + # <2-10> + # <2-10> +# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-10> + # <2-10> +# Radius der Kugel # <2-10> +r_b = u_b/(2*np.pi) # <2-10> + # <2-10> +# Äußerer Radius des Zylinders # <2-10> +ro_c = u_c/(2*np.pi) # <2-10> + # <2-10> +# Innerer Radius des Zylinders # <2-10> +ri_c = ro_c - d_c # <2-10> + # <2-10> + # <2-10> +# Trägheitsmoment der Kugel # <2-10> +I_b = 2/5 * m_b * r_b**2 # <2-10> + # <2-10> +# Trägheitsmoment des Zylinders # <2-10> +I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-10> + # <2-10> +print("Trägheitsmoment (Kugel)") # <2-10> +print(I_b) # <2-10> + # <2-10> +print("Trägheitsmoment (Zylinder)") # <2-10> +print(I_c) # <2-10> + # <2-10> + # <2-10> +# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-10> +t_b = (Ff_b - Fi_b)/fps # <2-10> +t_c = (Ff_c - Fi_c)/fps # <2-10> + # <2-10> +# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-10> + # <2-10> # Erklärung: # <2-2> # Es ist ein neuer Name (t_b_mean) notwendig, wenn die alten Werte in t_b # <2-2> # noch verfügbar bleiben sollen # <2-2> @@ -163,9 +163,9 @@ t_c = (Ff_c - Fi_c)/fps # des arrays, über die summiert wird (die danach nur noch einen Wert enthält). # <2-2> # Da jede Zeile genau die drei Werte enthält, die zu mitteln sind, enthält jede # <2-2> # Zeile danach genau den jeweiligen Mittelwert. # <2-2> - # <2-6> -t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-6> - # <2-6> + # <2-10> +t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-10> + # <2-10> # Erklärung: # <2-2> # Das Array h_b enthält jede Höhe dreifach, auch die Auswahl # <2-2> # der einzelnen Höhen kann durch array Manipulation geschehen. # <2-2> @@ -178,42 +178,42 @@ t_b_mean = t_b.reshape(-1,3).mean(axis=1) # [:,0] # <2-2> # Aus jeder Zeile (= erster Index ist ':') wird die 'nullte' Spalte (= zweiter Index ist '0') # <2-2> # ausgewählt, d.h. in jeder Zeile bleibt genau eine Höhe erhalten. # <2-2> - # <2-6> -h_b_mean = h_b.reshape(-1,3)[:,0] # <2-6> - # <2-6> + # <2-10> +h_b_mean = h_b.reshape(-1,3)[:,0] # <2-10> + # <2-10> # Erklärung: # <2-2> # analog für die andere Messreihe # <2-2> - # <2-6> -t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-6> -h_c_mean = h_c.reshape(-1,3)[:,0] # <2-6> - # <2-6> -# Ausgabe verarbeiteten der Messwerte # <2-6> - # <2-6> -print("Messwerte (Kugel)") # <2-6> -print("alle Zeiten") # <2-6> -print(t_b) # <2-6> -print("alle Höhen") # <2-6> -print(h_b) # <2-6> -print("Höhe") # <2-6> -print(h_b_mean) # <2-6> -print("gemittlelte Zeit") # <2-6> -print(t_b_mean) # <2-6> -print("\n") # <2-6> - # <2-6> - # <2-6> -print("Messwerte (Zylinder)") # <2-6> -print("alle Höhen") # <2-6> -print(h_c) # <2-6> -print("alle Zeiten") # <2-6> -print(t_c) # <2-6> -print("Höhe") # <2-6> -print(h_c_mean) # <2-6> -print("gemittlelte Zeit") # <2-6> -print(t_c_mean) # <2-6> -print("\n") # <2-6> - # <2-6> -# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-6> - # <2-6> + # <2-10> +t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-10> +h_c_mean = h_c.reshape(-1,3)[:,0] # <2-10> + # <2-10> +# Ausgabe verarbeiteten der Messwerte # <2-10> + # <2-10> +print("Messwerte (Kugel)") # <2-10> +print("alle Zeiten") # <2-10> +print(t_b) # <2-10> +print("alle Höhen") # <2-10> +print(h_b) # <2-10> +print("Höhe") # <2-10> +print(h_b_mean) # <2-10> +print("gemittlelte Zeit") # <2-10> +print(t_b_mean) # <2-10> +print("\n") # <2-10> + # <2-10> + # <2-10> +print("Messwerte (Zylinder)") # <2-10> +print("alle Höhen") # <2-10> +print(h_c) # <2-10> +print("alle Zeiten") # <2-10> +print(t_c) # <2-10> +print("Höhe") # <2-10> +print(h_c_mean) # <2-10> +print("gemittlelte Zeit") # <2-10> +print(t_c_mean) # <2-10> +print("\n") # <2-10> + # <2-10> +# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-10> + # <2-10> # Erklärung: # <3-3> # Funktionen für die Funktionsgleichungen der Theorie-Funktionen # <3-3> # # <3-3> @@ -221,13 +221,13 @@ print("\n") # wie hier: l, ri_c und ro_c # <3-3> # Solche globalen Variablen können bei größeren Skripten/Programmen zu einem Problem werden # <3-3> # es ist also zumindest Vorsicht geboten # <3-3> - # <2-6> + # <2-10> def theory_t_ball(h): # <3-3> return np.sqrt(7/5 * 1/h * 2* l**2/9.81) # <3-3> - # <2-6> + # <2-10> def theory_t_cylinder(h): # <3-3> return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/9.81 * 1/h) # <3-3> - # <2-6> + # <2-10> # Erklärung: # <4-4> # Umwandeln der Theorie-Funktion zu einer Fit-Funktion: # <4-4> # Die Funktion erhält ein zusätzliches Argument für jeden Fitparameter, hier: g und t0 # <4-4> @@ -236,152 +236,151 @@ def theory_t_cylinder(h): # Namen sind wie immer beliebig und es gibt nicht "den einen richtigen Namen", # <4-4> # aber es bietet sich wie immer an sprechende Namen zu verwenden, hier z.B. # <4-4> # "fit_g_ball" als Abkürzung für "Fitfunktion für den Parameter g aus den Messwerten für die Kugel" # <4-4> - # <2-6> + # <2-10> def fit_g_ball(h, g, t0): # <4-4> return np.sqrt(7/5 * 1/h * 2* l**2/g) + t0 # <4-4> - # <2-6> + # <2-10> def fit_g_cylinder(h, g, t0): # <4-4> return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/g * 1/h) + t0 # <4-4> - # <2-6> - # <2-6> -# Erklärung: # <5-6> -# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-6> -# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-6> -# Messwerten umgehen. # <5-6> -# Folgendes muss dafür geändert werden: # <5-6> -# # <5-6> -# (1) in der Fitfunktion müssen mit der Funktion noms() # <5-6> -# die Unsicherheiten von Konstanten entfernt werden # <5-6> -# # <5-6> -# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-6> -# diese müssen mit noms() entfernt werden. # <5-6> -# # <5-6> -# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-6> -# müssen getrennt übergeben werden: noms() und stds() # <5-6> -# # <5-6> -# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-6> -# um die Unsicherheiten anzeigen zu können # <5-6> -# # <5-6> -# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-6> -# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-6> -# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-6> - # <2-6> -def fit_g_ball(h, g, t0): # <5-6> - return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-6> - # <2-6> -def fit_g_cylinder(h, g, t0): # <5-6> - return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-6> - # <2-6> - # <2-6> - # <2-6> + # <2-10> + # <2-10> +# Erklärung: # <5-10> +# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-10> +# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-10> +# Messwerten umgehen. # <5-10> +# Folgendes muss dafür geändert werden: # <5-10> +# # <5-10> +# (1) in der Fitfunktion müssen mit der Funktion noms() # <5-10> +# # <5-10> +# die Unsicherheiten von Konstanten entfernt werden # <5-10> +# # <5-10> +# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-10> +# diese müssen mit noms() entfernt werden. # <5-10> +# # <5-10> +# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-10> +# müssen getrennt übergeben werden: noms() und stds() # <5-10> +# # <5-10> +# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-10> +# um die Unsicherheiten anzeigen zu können # <5-10> +# # <5-10> +# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-10> +# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-10> +# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-10> + # <2-10> +def fit_g_ball(h, g, t0): # <5-10> + return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-10> + # <2-10> +def fit_g_cylinder(h, g, t0): # <5-10> + return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-10> + # <2-10> + # <2-10> + # <2-10> # Erklärung: # <4-4> # Hier ist Vorsicht geboten, da die Fit-Funktion und Messwerte zusammen passen müssen # <4-4> # an solchen Stellen zahlt sich eine konsistente Benennung aus. # <4-4> -# Berechnung der Fitparameter für die Kugel # <4-6> - # <2-6> +# Berechnung der Fitparameter für die Kugel # <4-10> + # <2-10> params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> +params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> + # <2-10> + # <2-10> # Erklärung: # <4-4> # Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> -print("Fitparameter (Kugel)") # <4-6> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <4-6> - # <2-6> +print("Fitparameter (Kugel)") # <4-10> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +print("\n") # <4-10> + # <2-10> # Erklärung: # <3-3> # Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> # auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> # Der Bereich in dem diese Werte liegen entspricht, aber dem der Messwerte ca. [0.03, 0.33] # <3-3> -h_plot = np.linspace(0.03, 0.33, 205) # <3-6> - # <2-6> - # <2-6> +h_plot = np.linspace(0.03, 0.33, 205) # <3-10> + # <2-10> + # <2-10> # Fit Parameter für den Zylinder # <4-4> -# Fitparameter für den Zylinder # <5-6> - # <2-6> - # <2-6> +# Fitparameter für den Zylinder # <5-10> + # <2-10> + # <2-10> # Erklärung: # <3-3> # Erstellen einer figure mit einem subplot darin (1 Zeile x 1 Spalte an subplots) # <3-3> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> - # <2-6> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-10> + # <2-10> + # <2-10> # Erklärung: # <3-3> # Einstellung der Achsenbeschriftungen # <3-3> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> - # <2-6> +ax.set_xlabel("$h$ / m") # <3-10> +ax.set_ylabel("$t$ / s") # <3-10> + # <2-10> + # <2-10> + # <2-10> # Erklärung: # <3-3> # Darstellen der Messwerte mit Legendeneintrag # <3-3> ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> - # <2-6> + # <2-10> # Erklärung: # <4-4> # Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> - # <2-6> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> + # <2-10> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> +ax.legend() # <3-10> fig.savefig("plot_kugel.pdf") # <3-3> -fig.savefig("plot-g_kugel.pdf") # <4-6> - # <2-6> - # <2-6> +fig.savefig("plot-g_kugel.pdf") # <4-10> + # <2-10> + # <2-10> # Erklärung: # <4-4> # Analog für die Messreihe des Zylinders # <4-4> # Achtung! Copy-and-paste ist natürlich gängige Praxis, # <4-4> # aber alle Variablen müssen angepasst werden. # <4-4> - # <2-6> -# Berechnung der Fitparameter für den Zylinder # <4-6> + # <2-10> +# Berechnung der Fitparameter für den Zylinder # <4-10> params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Zylinder)") # <4-6> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <4-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <3-6> -ax.set_ylabel("$t$ / s") # <3-6> - # <2-6> - # <2-6> +params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> + # <2-10> + # <2-10> +print("Fitparameter (Zylinder)") # <4-10> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +print("\n") # <4-10> + # <2-10> + # <2-10> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-10> + # <2-10> +ax.set_xlabel("$h$ / m") # <3-10> +ax.set_ylabel("$t$ / s") # <3-10> + # <2-10> + # <2-10> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-10> ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <3-6> +ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-10> +ax.legend() # <3-10> fig.savefig("plot_zylinder.pdf") # <3-3> -fig.savefig("plot-g_zylinder.pdf") # <4-6> - # <2-6> - # <2-6> +fig.savefig("plot-g_zylinder.pdf") # <4-10> + # <2-10> + # <2-10> # Erklärung: # <4-4> # Verwenden der physikalischen Konstanten aus scipy # <4-4> # hier: g # <4-4> # physical_constants enthält 3er-tuple, der erste Eintrag # <4-4> # der tuple ist der Wert der Konstante, deswegen [0] # <4-4> - # <2-6> - # <2-6> -def fit_I_ball(h, I, t0): # <4-6> - g = physical_constants["standard acceleration of gravity"][0] # <4-6> + # <2-10> + # <2-10> +def fit_I_ball(h, I, t0): # <4-10> + g = physical_constants["standard acceleration of gravity"][0] # <4-10> return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-6> - # <2-6> - # <2-6> -def fit_I_cylinder(h, I, t0): # <4-6> - g = physical_constants["standard acceleration of gravity"][0] # <4-6> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-10> + # <2-10> + # <2-10> +def fit_I_cylinder(h, I, t0): # <4-10> + g = physical_constants["standard acceleration of gravity"][0] # <4-10> return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-6> - # <2-6> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-10> + # <2-10> # Erklärung: # <4-4> # Durch den Fit wird diese Warnung auf das Terminal ausgegeben: # <4-4> # .../v16515/auswertung.py:197: RuntimeWarning: invalid value encountered in sqrt # <4-4> @@ -397,64 +396,62 @@ def fit_I_cylinder(h, I, t0): # bounds gibt den minimalen und den maximalen Wert für alle Parameter an, # <4-4> # und zwar zuerst alle Minima und dann alle Maxima, # <4-4> # in diesem konkreten Beispiel steht bounds also für: 0 < I < +np.inf und -np.inf < t0 < +np.inf # <4-4> - # <2-6> - # <2-6> -# Berechnung der Fitparameter für die Kugel # <4-6> + # <2-10> + # <2-10> +# Berechnung der Fitparameter für die Kugel # <4-10> params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Kugel)") # <4-6> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> - if name == "I": # <4-6> - value *= 10000 # <4-6> - uncertainty *= 10000 # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <4-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <4-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <4-6> -ax.set_ylabel("$t$ / s") # <4-6> - # <2-6> - # <2-6> +params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> + # <2-10> + # <2-10> +print("Fitparameter (Kugel)") # <4-10> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-10> + if name == "I": # <4-10> + value *= 10000 # <4-10> + uncertainty *= 10000 # <4-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +print("\n") # <4-10> + # <2-10> + # <2-10> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-10> + # <2-10> +ax.set_xlabel("$h$ / m") # <4-10> +ax.set_ylabel("$t$ / s") # <4-10> + # <2-10> + # <2-10> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-6> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <4-6> -fig.savefig("plot-I_kugel.pdf") # <4-6> - # <2-6> - # <2-6> -# Berechnung der Fitparameter für den Zylinder # <4-6> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-10> +ax.legend() # <4-10> +fig.savefig("plot-I_kugel.pdf") # <4-10> + # <2-10> + # <2-10> +# Berechnung der Fitparameter für den Zylinder # <4-10> params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> -params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-6> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-6> - # <2-6> - # <2-6> -print("Fitparameter (Zylinder)") # <4-6> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-6> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-6> - if name == "I": # <4-6> - value *= 10000 # <4-6> - uncertainty *= 10000 # <4-6> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-6> -print("\n") # <4-6> - # <2-6> - # <2-6> - # <2-6> -fig, ax = plt.subplots(1, 1, layout="constrained") # <4-6> - # <2-6> -ax.set_xlabel("$h$ / m") # <4-6> -ax.set_ylabel("$t$ / s") # <4-6> - # <2-6> - # <2-6> -ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <4-6> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-6> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-6> -ax.legend() # <4-6> -fig.savefig("plot-I_zylinder.pdf") # <4-6> +params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> + # <2-10> + # <2-10> +print("Fitparameter (Zylinder)") # <4-10> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-10> + if name == "I": # <4-10> + value *= 10000 # <4-10> + uncertainty *= 10000 # <4-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +print("\n") # <4-10> + # <2-10> + # <2-10> + # <2-10> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-10> + # <2-10> +ax.set_xlabel("$h$ / m") # <4-10> +ax.set_ylabel("$t$ / s") # <4-10> + # <2-10> + # <2-10> +ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <4-4> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-10> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-10> +ax.legend() # <4-10> +fig.savefig("plot-I_zylinder.pdf") # <4-10> From 521f8c6535579a0b67a70f35c97c24703639a475 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:24:46 +0200 Subject: [PATCH 17/80] add task description files --- .../templates/aufgabe-step-1.txt | 31 ++++++++++++++ .../templates/aufgabe-step-10.txt | 0 .../templates/aufgabe-step-2.txt | 21 ++++++++++ .../templates/aufgabe-step-3.txt | 28 +++++++++++++ .../templates/aufgabe-step-4.txt | 35 ++++++++++++++++ .../templates/aufgabe-step-5.txt | 39 +++++++++++++++++ .../templates/aufgabe-step-6.txt | 42 +++++++++++++++++++ .../templates/aufgabe-step-7.txt | 0 .../templates/aufgabe-step-8.txt | 0 .../templates/aufgabe-step-9.txt | 0 10 files changed, 196 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt new file mode 100644 index 00000000..b22f253d --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt @@ -0,0 +1,31 @@ +# Realistisches-Beispiel-Protokoll + +Einleitung: + +Wie der Name der Aufgabe schon verspricht, werdet ihr im Zuge dieser Aufgabe ein vollständiges +und realistisches Versuchsprotokoll erstellen. Diesem Ziel werdet ihr Aufgabe für Aufgabe etwas +näher kommen können, indem ihr jeweils ein Thema des Workshops pro Aufgabe integriert. + +Um zu wissen, wo es hingeht, findet ihr auch in diesem Ordner schon das vollständige Protokoll zum Ansehen. + +Aufgabe: +Heute fällt diese Aufgabe noch nicht zu umfangreich aus. Es geht zunächst nur um das erstellen +des Ordners in dem ihr diese Aufgabe immer weiter ergänzt. + +1) Erstellt (z.B. in einem Ordner unter ~/Documents) einen neuen Ordner mit dem Namem v16516. + +2) Kopiert den Ordner data aus diesem Aufgabenordner in den Ordner v16516. + +Das war es schon, morgen gehts weiter. + +Erklärung: + +Im Ordner 'v16516' befindet sich noch nicht viel, nur eine leere Pythondatei und ein Ordner 'data' in dem sich +die Textdateien mit den Messwerten befinden, die ihr für die Auswertung verwenden werdet. Das spaßige Abtippen +der Messwerte aus dem Laborbuch, haben wir euch schonmal abgenommen. ;) + + + + + + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt new file mode 100644 index 00000000..e69de29b diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt new file mode 100644 index 00000000..df77421e --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt @@ -0,0 +1,21 @@ +# Realistisches Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend +im Aufgabenordner '1-python'. + +Aufgabe: +Mit den Informationen zu numpy habt ihr nun die Möglichkeit die Messwerte aus dem Ordner 'data' +einzulesen und zu verarbeiten. + +1. Importiert numpy in der Datei 'auswertung.py', lest die Messwerte in den Dateien im Ordner 'data' ein + (achtet auf die Angabe der Einheiten zu den Messwerten) +2. Gebt diese auf das Terminal aus um zu sehen ob, die Werte richtig geladen wurden +3. Berechnet mit den Daten folgende Werte (die Gleichungen stehen im fertigen Beispiel-Protokoll) + - Radius r von Ball und Zylinder + - Trägheitsmoment I von Ball und Zylinder + - Zeitdauern t für das Herabrollen beider Objekte +4. Gebt auch diese berechneten Werte auf das Terminal aus, um diese zu überprüfen +5. Die Messung wurde für jede Höhe dreifach durchgeführt. Berechnet für jede Höhe + jeweils den zugehörigen Mittelwert der Zeitdauern diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt new file mode 100644 index 00000000..2b8e8c97 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt @@ -0,0 +1,28 @@ +# Realistisches Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend +im Aufgabenordner '1-python'. + +Aufgabe: +Mit den Informationen über matplotlib könnt ihr nun die zwei Plots aus den Daten erstellen, +die ihr in der letzten Aufgabe verarbeitet habt. + +Erstellt für jede Messreihe (Kugel, Zylinder) jeweils eine Abbildung: +1. Importiert matplotlib.pyplot in eure Datei auswertung.py +2. Erstellt jeweils eine Abbildung mit einem subplot, in dem die Messwerte (die berechneten Mittelwerte) + als schwarze '+' dargestellt werden. + +Die Berechnung von Ausgleichskurven wird erst durch eine weitere Bibliothek (scipy) möglich. +Jedoch könnt ihr den Verlauf der theoretischen Funktionen bereits in die Plots einzeichnen. + +3. Schreibt jeweils eine Python-Funktion für die Gleichungen t_B(h) und t_Z(h) (Gleichungen 4 und 5 im Protokoll). + Lls Wert für g könnt ihr 9.81 verwenden (auch dafür wird scipy noch eine bessere Lösung sein) +4. Erstellt mit np.linspace ein array mit vielen Werten die für den Plot der Theorie-Funktion verwendet werden können. + (da matplotlib im Prinzip einzelne Punkte zeichnet bzw. diese mit Geraden verbindet, braucht man für Theorie-Funktion + sehr viele Punkte und kann nicht einfach nur die Messwerte für h verwenden.) +5. Ergänzt die Theorie-Funktion im jeweiligen plot der Messwerte. + + + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt new file mode 100644 index 00000000..2447217a --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt @@ -0,0 +1,35 @@ +# Realistisches Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend +im Aufgabenordner '1-python'. + + +Aufgabe: +Mit den Informationen zu scipy könnt ihr nun die Theorie-Funktionen aus der letzten Aufgabe +zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter bestimmen. + +1. Ändert die Theorie-Funktionen aus der letzten Aufgabe zu Fit-Funktionen, diese benötigen + zusätzliche Argumente für die Fit-Parameter. Und diese Fit-Parameter müssen auch in der + Funktion verwendet werden. Konkret: + - Die Fallbeschleunigung g die in der letzten Aufgabe als 9.81 angenommen wurde, ist jetzt ein + Fit-Parameter g. + - Außerdem ist noch ein weiterer Parameter t0 nötig, wie ihr dem finalen Beispielprotokoll entnehmen könnt. + +2. Importiert die Funktion curve_fit aus scipy.optimize. + +3. Für jede der beiden Messreihen: + Verwendet curve_fit, um aus den gemittelten Messwerten für Höhe und Zeit die beiden Fit-Parameter + zu berechnen. + +4. Gebt die Parameter mit ihrer zugehörigen Unsicherheit auf das Terminal aus. + +5. Entfernt die Theorie-Funktionen aus den Plots und fügt stattdessen die Fit-Funktionen + mit den berechneten Parametern hinzu. + +6. Im finalen Beispielprotokoll wurden auch das Trägheitsmoment der Objekte durch einen weiteren + Fit bestimmt (dabei ist dann der Theoriewert von g anzunehmen). + Ergänzt die notwendigen Fit-Funktionen und Plots für diesen Auswertungsschritt in dem ihr die + vorangegangenen Schritte für diesen Fit wiederholt. + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt new file mode 100644 index 00000000..6a33b232 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt @@ -0,0 +1,39 @@ +# Realistisches Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend +im Aufgabenordner '1-python'. + + +Aufgabe: +Mit den Informationen zu uncertainties könnt ihr jetzt den Umgang mit Messunsicherheiten +in die Auswertung aufnehmen. Die Messdaten im Ordner vorlage/v16516/data haben jetzt +zusätzliche Spalten mit den jeweiligen Unsicherheiten. + +1. Kopiert diese neuen Messwertdateien in euren eigenen Ordner data, um die Messwerte +mit Unsicherheiten zu haben. Die alten Dateien könnt ihr überschreiben oder vorher löschen. + +2. Importiert uncertainties und uncertainties.unumpy in eurer auswertung.py + +3. Ergänzt das Einlesen der Messdaten um die zusätzlichen Spalten mit Unsicherheiten, + eine Benennung der Form l_unc für "Unsicherheit des Messwerts l" ist hier sinnvoll + +4. Die eingelesenen Messwerte und Unsicherheiten müssen jetzt zu unsicherheitbehafteten + Messwerten zusammengefügt werden. Nutzt dafür ufloat (aus uncertainties) für einzelne Werte + und uarray (aus uncertainties.unumpy) für Messreihen. + +5. In den Fit-Funktionen müsst ihr von allen Konstanten die Unsicherheiten entfernen, + die dafür nötige Funktion heißt nominal_values und es bietet sich an diese in + abgekürzter Form zu importieren (genauso wie die Funktion std_devs): + from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) + dann kann die Funktion noms() verwendet werden, um die Unsicherheit eines Wertes + zu entfernen. + +6. curve_fit kann mit Unsicherheiten nicht direkt umgehen, die unabhängige Variable + darf keine Unsicherheiten haben und den Wert bzw. die Unsicherheit + der abhängige Variable müssen getrennt übergeben werden. + +7. matplotlib kann auch nicht mit den Unsicherheiten umgehen: + Verwendet statt ax.plot die Funktion ax.errorbar um die Messwerte mit ihren + Unsicherheiten darzustellen. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt new file mode 100644 index 00000000..c16906de --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt @@ -0,0 +1,42 @@ +# Realistisches Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend +im Aufgabenordner '1-python'. + + +Aufgabe: +Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt +am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. + +1) Erstellt in dem Ordner, in dem ihr den Ordner v16516 für diese Aufgabe gespeichert habt +einen neuen Ordner (z.B. Beispiel-Praktikum). + +2) Verschiebt den Ordner v16516 in den neuen Ordner Beispiel-Praktikum. + +3) Navigiert mit dem Terminal in den neuen Ordner und initialisiert in diesem ein Git-Repository (init). + +4) Fügt alle Dateien zum Repository hinzu (add, commit). + +Repository auf Github hochladen: + +5) Erstellt euch einen Github-Account, falls ihr noch keinen habt. + +6) Navigiert zu https://github.com/dashboard. Erstellt über den Button "New" ein neues Repository. + Für diese Aufgabe müsst ihr dem Repository nur einen Namen geben, alle optionalen Einstellungen könnt ihr + unverändert lassen. + Nach dem Erstellen werden euch drei Möglichkeiten vorgeschlagen fortzufahren, da wir bereits einen + Repository auf dem Computer haben wählen wir die dritte Option: + "…or push an existing repository from the command line" + git remote add origin git@github.com:/.git + git branch -M main + git push -u origin main + +7) Navigiert mit dem Terminal in euer Beispiel-Praktikum Git-Repository und gebt die drei obigen + Befehle ein, am besten durch Kopieren aus dem Browser. + +8) Schaut euch euer Repository auf https://github.com/ an. + + + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt new file mode 100644 index 00000000..e69de29b diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt new file mode 100644 index 00000000..e69de29b diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt new file mode 100644 index 00000000..e69de29b From 123e036242c87d5aa92ac03aee265ee4bb67cd17 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 20:42:29 +0200 Subject: [PATCH 18/80] change for hardcoded results at first --- .../templates/latex/auswertung_template | 403 +++++++++--------- 1 file changed, 201 insertions(+), 202 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template index 7befe84c..30493500 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template @@ -1,204 +1,203 @@ -\section{Auswertung} % <7-10> -\label{sec:Auswertung} % <9-10> -Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-10> -\begin{align} % <8-10> - \label{eq:physical-properties} % <9-10> - m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <8-10> - r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <8-10> - r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <8-10> - - -\qty{0.2160+-0.0010}{\kilo\gram} -\qty{0.2160+-0.0010}{\kilo\gram} - - - m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-10> - r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-10> - r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-10> -\end{align} % <8-10> -Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-10> -\begin{align} % <8-10> - \label{eq:moments-inertia} % <8-10> - I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <8-10> -\end{align} % <8-10> -Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-10> -Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-10> -dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> -dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-10> -berechnet % <7-10> -\begin{equation*} % <8-10> - t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-10> -\end{equation*} % <8-10> - % <7-10> -\begin{table} % <9-10> - \centering % <9-10> - \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-10> - \label{tab:all-measurements} % <9-10> - \begin{tblr}{ % <9-10> - colspec = { % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=1.3] % <9-10> - % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=1.3] % <9-10> - }, % <9-10> - row{1} = {guard}, % <9-10> - row{2} = {guard, mode=math}, % <9-10> - vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-10> - } % <9-10> - \toprule % <9-10> - & % <9-10> - \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-10> - \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-10> - \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-10> - h \mathbin{/} \unit{\meter} &% % <9-10> - \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> - \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> - \SetCell[c=2]{c} F_\text{i} & &% % <9-10> - \SetCell[c=2]{c} F_\text{f} & &% % <9-10> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> - \midrule % <9-10> - 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-10> - 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-10> - 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-10> - 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-10> - 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-10> - 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-10> - 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-10> - 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-10> - 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-10> - 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-10> - 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-10> - 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-10> - 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-10> - 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-10> - 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-10> - 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-10> - 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-10> - 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-10> - \bottomrule % <9-10> - \end{tblr} % <9-10> - \input{build/table_all-measurements.tex} % <10-10> -\end{table} % <9-10> - % <7-10> -Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-10> -in \autoref{tab:averaged-measurements}. Diese Werte werden für die folgenden % <9-10> -Auswertungsschritte verwendet. % <9-10> - % <7-10> -\begin{table} % <9-10> - \centering % <9-10> - \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-10> - \label{tab:averaged-measurements} % <9-10> - % <9-10> - \begin{tblr}{ % <9-9> - colspec = { % <9-9> - S[table-format=1.3] % <9-9> - S[table-format=2.3] % <9-9> - S[table-format=1.4] % <9-9> - S[table-format=3.3] % <9-9> - S[table-format=1.5] % <9-9> - }, % <9-9> - row{1} = {guard}, % <9-9> - row{2} = {guard, mode=math}, % <9-9> - vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, % <9-9> - } % <9-9> - \toprule % <9-9> - & % <9-9> - \SetCell[c=2]{c} Messung: Kugel & & % <9-9> - \SetCell[c=2]{c} Messung: Zylinder &\\ % <9-9> - \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} % <9-9> - h \mathbin{/} \unit{\meter} &% % <9-9> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-9> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-9> - \midrule % <9-9> - 0.045 & 1.867 & 0.027 & 2.089 & 0.027 \\ % <9-9> - 0.100 & 1.178 & 0.027 & 1.311 & 0.027 \\ % <9-9> - 0.150 & 0.922 & 0.027 & 1.067 & 0.027 \\ % <9-9> - 0.200 & 0.800 & 0.027 & 0.944 & 0.027 \\ % <9-9> - 0.250 & 0.700 & 0.027 & 0.800 & 0.027 \\ % <9-9> - 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-9> - \bottomrule % <9-9> - \end{tblr} % <9-9> - \input{build/table_averaged-measurements.tex} % <10-10> -\end{table} % <9-10> - % <7-10> -\subsection{Bestimmung der Fallbeschleunigung} % <7-10> - % <7-10> -Für die Bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> -\eqref{eq:fit-function-g-ball} respektive \eqref{eq:fit-function-g-cylinder} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> -angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-g-ball} % <9-10> -und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-g_ball.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-10> - \label{fig:fit-g-ball} % <9-10> -\end{figure} % <9-10> - % <9-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-g_cylinder.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-10> - \label{fig:fit-g-cylinder} % <9-10> -\end{figure} % <9-10> - % <7-10> -Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> -\begin{align} % <8-10> - \label{eq:parameters-g_ball} % <8-10> - g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <8-10> -\intertext{und für den Zylinder} % <8-10> - \label{eq:parameters-g_cylinder} % <8-10> - g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <8-10> -\end{align} % <8-10> - % <7-10> -\subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-10> - % <7-10> -Für die bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> -\eqref{eq:fit-function-I} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> -angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-I-ball} % <9-10> -und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <9-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-I_ball.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-10> - \label{fig:fit-I-ball} % <9-10> -\end{figure} % <9-10> - % <7-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-I_cylinder.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-10> - \label{fig:fit-I-cylinder} % <9-10> -\end{figure} % <9-10> - % <7-10> -Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> -\begin{align} % <8-10> - \label{eq:parameters-I_ball} % <8-10> - I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <8-10> - \intertext{und für den Zylinder} % <8-10> - \label{eq:parameters-I_cylinder} % <8-10> - I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <8-10> -\end{align} % <8-10> +\section{Auswertung} % <7-10> +\label{sec:Auswertung} % <9-10> +Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-10> +\begin{align} % <8-10> + \label{eq:physical-properties} % <9-10> + m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-10> + r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-10> + r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-10> + m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-10> + r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-10> + r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-10> +\end{align} % <8-10> +Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-10> +\begin{align} % <8-10> + \label{eq:moments-inertia} % <8-10> + I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-10> + I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <10-10> +\end{align} % <8-10> +Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-10> +Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-10> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-10> +berechnet % <7-10> +\begin{equation*} % <8-10> + t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-10> +\end{equation*} % <8-10> + % <7-10> +\begin{table} % <9-10> + \centering % <9-10> + \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-10> + \label{tab:all-measurements} % <9-10> + \begin{tblr}{ % <9-10> + colspec = { % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + }, % <9-10> + row{1} = {guard}, % <9-10> + row{2} = {guard, mode=math}, % <9-10> + vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-10> + } % <9-10> + \toprule % <9-10> + & % <9-10> + \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-10> + \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-10> + \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-10> + h \mathbin{/} \unit{\meter} &% % <9-10> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> + \SetCell[c=2]{c} F_\text{i} & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> + \midrule % <9-10> + 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-10> + 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-10> + 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-10> + 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-10> + 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-10> + 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-10> + 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-10> + 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-10> + 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-10> + 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-10> + 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-10> + 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-10> + 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-10> + 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-10> + 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-10> + 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-10> + \bottomrule % <9-10> + \end{tblr} % <9-10> + \input{build/table_all-measurements.tex} % <10-10> +\end{table} % <9-10> + % <7-10> +Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-10> +in \autoref{tab:averaged-measurements}. Diese Werte werden für die folgenden % <9-10> +Auswertungsschritte verwendet. % <9-10> + % <7-10> +\begin{table} % <9-10> + \centering % <9-10> + \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-10> + \label{tab:averaged-measurements} % <9-10> + % <9-10> + \begin{tblr}{ % <9-9> + colspec = { % <9-9> + S[table-format=1.3] % <9-9> + S[table-format=2.3] % <9-9> + S[table-format=1.4] % <9-9> + S[table-format=3.3] % <9-9> + S[table-format=1.5] % <9-9> + }, % <9-9> + row{1} = {guard}, % <9-9> + row{2} = {guard, mode=math}, % <9-9> + vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, % <9-9> + } % <9-9> + \toprule % <9-9> + & % <9-9> + \SetCell[c=2]{c} Messung: Kugel & & % <9-9> + \SetCell[c=2]{c} Messung: Zylinder &\\ % <9-9> + \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} % <9-9> + h \mathbin{/} \unit{\meter} &% % <9-9> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-9> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-9> + \midrule % <9-9> + 0.045 & 1.867 & 0.027 & 2.089 & 0.027 \\ % <9-9> + 0.100 & 1.178 & 0.027 & 1.311 & 0.027 \\ % <9-9> + 0.150 & 0.922 & 0.027 & 1.067 & 0.027 \\ % <9-9> + 0.200 & 0.800 & 0.027 & 0.944 & 0.027 \\ % <9-9> + 0.250 & 0.700 & 0.027 & 0.800 & 0.027 \\ % <9-9> + 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-9> + \bottomrule % <9-9> + \end{tblr} % <9-9> + \input{build/table_averaged-measurements.tex} % <10-10> +\end{table} % <9-10> + % <7-10> +\subsection{Bestimmung der Fallbeschleunigung} % <7-10> + % <7-10> +Für die Bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> +\eqref{eq:fit-function-g-ball} respektive \eqref{eq:fit-function-g-cylinder} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-g-ball} % <9-10> +und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-g_ball.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-10> + \label{fig:fit-g-ball} % <9-10> +\end{figure} % <9-10> + % <9-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-g_cylinder.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-10> + \label{fig:fit-g-cylinder} % <9-10> +\end{figure} % <9-10> + % <7-10> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> +\begin{align} % <8-10> + \label{eq:parameters-g_ball} % <8-10> + g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> + g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <10-10> +\intertext{und für den Zylinder} % <8-10> + \label{eq:parameters-g_cylinder} % <8-10> + g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> + g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <10-10> +\end{align} % <8-10> + % <7-10> +\subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-10> + % <7-10> +Für die bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> +\eqref{eq:fit-function-I} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-I-ball} % <9-10> +und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <9-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-I_ball.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-10> + \label{fig:fit-I-ball} % <9-10> +\end{figure} % <9-10> + % <7-10> + % <7-10> +\begin{figure} % <9-10> + \centering % <9-10> + \includegraphics{plot-I_cylinder.pdf} % <9-10> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-10> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-10> + \label{fig:fit-I-cylinder} % <9-10> +\end{figure} % <9-10> + % <7-10> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> +\begin{align} % <8-10> + \label{eq:parameters-I_ball} % <8-10> + I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> + I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <10-10> + \intertext{und für den Zylinder} % <8-10> + \label{eq:parameters-I_cylinder} % <8-10> + I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared} & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> + I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <10-10> +\end{align} % <8-10> From efe5e032c4244a177a41ef266d6862a471854321 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:33:42 +0200 Subject: [PATCH 19/80] fix step range for tikz --- .../templates/latex/theorie_template | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_template index 1225e466..7b80cab6 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_template @@ -6,16 +6,16 @@ in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <7-10> \begin{figure} % <9-10> \centering % <9-10> - \begin{tikzpicture}[scale=3] % <9-10> - \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <9-10> - \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <9-10> - \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <9-10> - \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <9-10> - \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <9-10> - \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <9-10> - \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <9-10> - \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <9-10> - \end{tikzpicture} % <9-10> + \begin{tikzpicture}[scale=3] % <10-10> + \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-10> + \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-10> + \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <10-10> + \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <10-10> + \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <10-10> + \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <10-10> + \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <10-10> + \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <10-10> + \end{tikzpicture} % <10-10> \caption{Schematische Darstellung des Versuchsaufbaus. Das runde Objekt (Kugel oder Zylinder) wird in der Höhe $h$ % <9-10> auf eine schiefe Ebene gelegt, sodass es aus der Ruhe herabrollt. Die Bewegung ist beschleunigt, sodass sowohl % <9-10> die Geschwindigkeit $\vec{v}(t)$ sowie die Winkelgeschwindigkeit $\omega(t)$ nicht konstant sind.} % <9-10> @@ -37,7 +37,7 @@ beschleunigten Bewegung (in der Zeit $t$, entlang einer Strecke $l$) $v = \frac{ Es gilt also} % <8-10> 1 &= \left(\frac{2l}{t}\right)^2 \frac{1}{2gh} \left(1 + \frac{I}{mr^2} \right)\quad\big|\, \cdot t^2 \\ % <8-10> \addtocounter{equation}{1} % <8-10> -t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)\label{eq:tsquared}\tag{\theequation} % <8-10> +t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right) % <8-10> \label{eq:tsquared}\tag{\theequation} % <9-10> \end{align*} % <8-10> % <7-10> From 691df66224a65614c9828e482ca5ebdff59eb655 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:33:51 +0200 Subject: [PATCH 20/80] fix command --- .../8-all/example-report/templates/latex/diskussion_template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template index dc5ca8eb..3045bd7b 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template @@ -20,7 +20,7 @@ Die Fit parameter \eqref{eq:parameters-g_ball} % <8-10> \eqref{eq:parameters-g_cylinder} % <8-10> % <7-10> -passen zum theoretischen Wert $\num{9.81}{\meter\per\second\squared}$ % <8-10> +passen zum theoretischen Wert $\qty{9.81}{\meter\per\second\squared}$ % <8-10> passen zum theoretischen Wert \input{theoretical-g.tex} % <10-10> => TODO: Abweichungen berechnen % <7-10> % <7-10> From b04f16e4ada508a4e6f6cd11376b28955660016c Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:33:57 +0200 Subject: [PATCH 21/80] fix empty line --- .../example-report/templates/latex/auswertung_template | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template index 30493500..d5f30056 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template @@ -38,7 +38,6 @@ berechnet S[table-format=1.0] % <9-10> S[table-format=1.3] % <9-10> S[table-format=1.3] % <9-10> - % <9-10> S[table-format=4.0] % <9-10> S[table-format=1.0] % <9-10> S[table-format=4.0] % <9-10> @@ -136,7 +135,7 @@ und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <7-10> \begin{figure} % <9-10> \centering % <9-10> - \includegraphics{plot-g_ball.pdf} % <9-10> + \includegraphics{plot-g_kugel.pdf} % <9-10> \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-10> zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-10> @@ -145,7 +144,7 @@ und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-10> \begin{figure} % <9-10> \centering % <9-10> - \includegraphics{plot-g_cylinder.pdf} % <9-10> + \includegraphics{plot-g_zylinder.pdf} % <9-10> \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-10> @@ -172,7 +171,7 @@ und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <7-10> \begin{figure} % <9-10> \centering % <9-10> - \includegraphics{plot-I_ball.pdf} % <9-10> + \includegraphics{plot-I_kugel.pdf} % <9-10> \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-10> zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-10> Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-10> @@ -182,7 +181,7 @@ und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <7-10> \begin{figure} % <9-10> \centering % <9-10> - \includegraphics{plot-I_cylinder.pdf} % <9-10> + \includegraphics{plot-I_zylinder.pdf} % <9-10> \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-10> Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-10> From 2edb65b2c4c5a7475dcf1917fcfc7fc636cd3aa7 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:34:15 +0200 Subject: [PATCH 22/80] fix double plot of fitfunction --- .../8-all/example-report/templates/auswertung_template | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_template b/exercises-toolbox/8-all/example-report/templates/auswertung_template index 1b795ab7..04b9420b 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_template @@ -318,13 +318,11 @@ ax.set_ylabel("$t$ / s") # Erklärung: # <3-3> # Darstellen der Messwerte mit Legendeneintrag # <3-3> ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> -ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> # <2-10> # Erklärung: # <4-4> # Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> - # <2-10> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> +ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> ax.legend() # <3-10> fig.savefig("plot_kugel.pdf") # <3-3> From fa789bab500cb1ac9a56499b72935b64bac840df Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:34:29 +0200 Subject: [PATCH 23/80] add templates for the bib files --- .../8-all/example-report/templates/lit.bib | 23 ++++++ .../example-report/templates/programme.bib | 72 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/lit.bib create mode 100644 exercises-toolbox/8-all/example-report/templates/programme.bib diff --git a/exercises-toolbox/8-all/example-report/templates/lit.bib b/exercises-toolbox/8-all/example-report/templates/lit.bib new file mode 100644 index 00000000..f1915e13 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/lit.bib @@ -0,0 +1,23 @@ +@manual{V16516, + organization = {TU Dortmund, Fakultät Physik}, + title = {Anleitung: Versuch zur schiefen Ebene}, + year = 2023 +} + + + +@book{kuypers2016klassische, + title={Klassische Mechanik}, + author={Kuypers, Friedhelm}, + year={2016}, + publisher={John Wiley \& Sons} +} + +@online{galilei1623, +author = {Galilei, Galileo}, +title = {Il Saggiatore}, +url = {https://bibdig.museogalileo.it/tecanew/opera?bid=354802&seq=13}, +booktitle = {Le opere di Galileo Galilei}, +year = {1623} +} + diff --git a/exercises-toolbox/8-all/example-report/templates/programme.bib b/exercises-toolbox/8-all/example-report/templates/programme.bib new file mode 100644 index 00000000..efe7aa60 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/programme.bib @@ -0,0 +1,72 @@ +@article{matplotlib, + author = "Hunter, John D.", + title = "{Matplotlib}: A {2D} Graphics Environment", + publisher = "IEEE", + year = "2007", + journal = "Computing in Science \& Engineering", + volume = "9", + number = "3", + pages = "90--95", + url = "http://matplotlib.org/", + version = "1.4.3", + doi = {10.1109/MCSE.2007.55}, + addendum = {Current version 3.8.0, \textsc{doi}: \href{https://zenodo.org/record/8347255}{\texttt{10.5281/zenodo.8347255}}} +} + +% taken from https://numpy.org/citing-numpy/ but replaced the key 'harris2020array' with 'numpy' +% to keep the neccessary changes to this file +@article{ numpy, + title = {Array programming with {NumPy}}, + author = {Charles R. Harris and K. Jarrod Millman and St{\'{e}}fan J. + van der Walt and Ralf Gommers and Pauli Virtanen and David + Cournapeau and Eric Wieser and Julian Taylor and Sebastian + Berg and Nathaniel J. Smith and Robert Kern and Matti Picus + and Stephan Hoyer and Marten H. van Kerkwijk and Matthew + Brett and Allan Haldane and Jaime Fern{\'{a}}ndez del + R{\'{i}}o and Mark Wiebe and Pearu Peterson and Pierre + G{\'{e}}rard-Marchant and Kevin Sheppard and Tyler Reddy and + Warren Weckesser and Hameer Abbasi and Christoph Gohlke and + Travis E. Oliphant}, + year = {2020}, + month = sep, + journal = {Nature}, + volume = {585}, + number = {7825}, + pages = {357--362}, + doi = {10.1038/s41586-020-2649-2}, + publisher = {Springer Science and Business Media {LLC}}, + url = {https://doi.org/10.1038/s41586-020-2649-2} +} + +% taken from https://scipy.org/citing-scipy/ but replaced the key '2020SciPy-NMeth' with 'scipy' +% to keep the neccessary changes to this file +@article{scipy, + author = {Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E. and + Haberland, Matt and Reddy, Tyler and Cournapeau, David and + Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and + Bright, Jonathan and {van der Walt}, St{\'e}fan J. and + Brett, Matthew and Wilson, Joshua and Millman, K. Jarrod and + Mayorov, Nikolay and Nelson, Andrew R. J. and Jones, Eric and + Kern, Robert and Larson, Eric and Carey, C J and + Polat, {\.I}lhan and Feng, Yu and Moore, Eric W. and + {VanderPlas}, Jake and Laxalde, Denis and Perktold, Josef and + Cimrman, Robert and Henriksen, Ian and Quintero, E. A. and + Harris, Charles R. and Archibald, Anne M. and + Ribeiro, Ant{\^o}nio H. and Pedregosa, Fabian and + {van Mulbregt}, Paul and {SciPy 1.0 Contributors}}, + title = {{{SciPy} 1.0: Fundamental Algorithms for Scientific + Computing in Python}}, + journal = {Nature Methods}, + year = {2020}, + volume = {17}, + pages = {261--272}, + adsurl = {https://rdcu.be/b08Wh}, + doi = {10.1038/s41592-019-0686-2}, +} + +@software{uncertainties, + author = "Lebigot, Eric O.", + title = "Uncertainties: a Python package for calculations with uncertainties", + url = "http://pythonhosted.org/uncertainties/", + version = "3.1.7" +} From 1af7d7a2445370b8eae82a9381edac74ad0a2290 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 21:34:45 +0200 Subject: [PATCH 24/80] add bibfiles rule --- .../8-all/example-report/Makefile | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index a8a21ca8..d787b55b 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -38,6 +38,7 @@ target_texfiles_durchfuehrung = $(addsuffix content/durchfuehrung.tex, $(solutio target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_latex)) target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) +target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) $(addsuffix programme.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) target_datafiles = $(datafiles_template_step-1) $(datafiles_template_step-5) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) @@ -53,6 +54,7 @@ $(target_texfiles_durchfuehrung) \ $(target_texfiles_theorie) \ $(target_texfiles_auswertung) \ $(target_texfiles_diskussion) \ +$(target_bibfiles)\ tests = test1 test2 test3 @@ -61,7 +63,7 @@ test-%: | build # @echo $@ # @echo " " # @echo $< - # @echo " " + @echo " " @echo $(target_scriptfiles) @echo "" @echo $(subst STEP,1, $(target_datafiles_paths)) @@ -73,10 +75,19 @@ test-%: | build @echo $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) @echo "" @echo $(target_taskfiles) + @echo "" + @echo $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) + @echo "" build/report-example-step-%/aufgabe.txt &: $(taskfiles) | $(solution_dirs) cp $(word $*, $(taskfiles)) build/report-example-step-$*/aufgabe.txt +$(target_bibfiles) &: $(taskfiles) | $(solution_dirs_with_latex) + cp templates/lit.bib $(word 1, $(target_bibfiles)) + cp templates/lit.bib $(word 2, $(target_bibfiles)) + cp templates/programme.bib $(word 3, $(target_bibfiles)) + cp templates/programme.bib $(word 4, $(target_bibfiles)) + build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung @@ -167,19 +178,24 @@ clean: test_step_scripts: all @echo @echo Testing: - @echo $(target_scriptfiles) + @echo "auswertung.py" + @echo "v16516.tex" @echo "" echo "" > build/output.txt set -- $(solution_dirs); \ for i do\ cd "$$i"; \ - echo "Output of '$$i/auswertung.py':" >> ../../output.txt; \ - echo >> ../../output.txt; \ - echo "" >> ../../output.txt; \ + echo "Output of '$$i/auswertung.py':" >> ../../python_output.txt; \ + echo "" >> ../../python_output.txt; \ python auswertung.py >> ../../output.txt 2>&1;\ + echo "Output of compilation of '$$i/v16516.tex':" >> ../../lualatex_output.txt; \ + echo "" >> ../../lualatex_output.txt; \ + lualatex v16516.tex >> ../../lualatex_output.txt 2>&1;\ cd - >> /dev/null ;\ done;\ - diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" + diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" + +#diff -u templates/output_snapshot.txt build/output.txt || diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" From 81743eedbb16a9b227603d462a15f93480d333d6 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:15:24 +0200 Subject: [PATCH 25/80] add prefix to destinguish template and target files --- exercises-toolbox/8-all/example-report/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index d787b55b..04c2ab05 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -15,7 +15,8 @@ steps_with_latex = 7 8 9 10 steps = $(steps_without_unc) $(steps_with_unc) -taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) +template_taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) +template_bibfiles = $(addprefix templates/, lit.bib programme.bib) step_dirs = $(foreach step, $(steps),build/report-example-step-$(step)/) solution_dirs = $(addsuffix loesung/, $(step_dirs)) From d8ede60126f1264c6cb9153c75b54440c50fb2cf Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:16:17 +0200 Subject: [PATCH 26/80] change from string substitution to function call --- .../8-all/example-report/Makefile | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 04c2ab05..9217bd44 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -26,7 +26,7 @@ step_dirs_with_latex = $(foreach step, $(steps_with_latex),build/report-example- solution_dirs_with_latex = $(addsuffix loesung/, $(step_dirs_with_latex)) content_dirs_with_latex = $(addsuffix content/, $(solution_dirs_with_latex)) -target_datafiles_paths = $(addprefix build/report-example-step-STEP/loesung/data/, $(datafilenames)) +target_datafiles_paths = $(addprefix build/report-example-step-$(1)/loesung/data/, $(datafilenames)) datafiles_template_step-1 = $(addprefix build/report-example-step-1/data/, $(datafilenames)) datafiles_template_step-5 = $(addprefix build/report-example-step-5/data/, $(datafilenames)) @@ -67,7 +67,6 @@ test-%: | build @echo " " @echo $(target_scriptfiles) @echo "" - @echo $(subst STEP,1, $(target_datafiles_paths)) @echo "" @echo $(target_texfiles_v16516) @echo "" @@ -118,34 +117,34 @@ $(datafiles_template_step-1) &: | build/report-example-step-1 $(datafiles_template_step-5) &: | build/report-example-step-5 cp -r templates/data_with_uncertainties build/report-example-step-5/data -$(subst STEP,1, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) +$(call target_datafiles_paths,1) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 1, $(data_dirs)) -$(subst STEP,2, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) +$(call target_datafiles_paths,2) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 2, $(data_dirs)) -$(subst STEP,3, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) +$(call target_datafiles_paths,3) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 3, $(data_dirs)) -$(subst STEP,4, $(target_datafiles_paths)) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) +$(call target_datafiles_paths,4) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 4, $(data_dirs)) -$(subst STEP,5, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) +$(call target_datafiles_paths,5) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 5, $(data_dirs)) -$(subst STEP,6, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) +$(call target_datafiles_paths,6) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 6, $(data_dirs)) -$(subst STEP,7, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) +$(call target_datafiles_paths,7) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 7, $(data_dirs)) -$(subst STEP,8, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) +$(call target_datafiles_paths,8) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 8, $(data_dirs)) -$(subst STEP,9, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) +$(call target_datafiles_paths,9) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 9, $(data_dirs)) -$(subst STEP,10, $(target_datafiles_paths)) &: $(datafiles_with_unc) | $(word 10, $(solution_dirs)) +$(call target_datafiles_paths,10) &: $(datafiles_with_unc) | $(word 10, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 10, $(data_dirs)) build/report-example-step-7/loesung/content &: | $(solution_dirs) From 66df90a093538077ac58dfa9baed7032c01c87f2 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:18:17 +0200 Subject: [PATCH 27/80] changed naming and order of variables --- .../8-all/example-report/Makefile | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 9217bd44..541008f2 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -31,8 +31,13 @@ datafiles_template_step-1 = $(addprefix build/report-example-step-1/data/, $(dat datafiles_template_step-5 = $(addprefix build/report-example-step-5/data/, $(datafilenames)) +target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) +target_datafiles = $(datafiles_template_step-1) $(datafiles_template_step-5) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) + target_makefiles = $(addsuffix Makefile-loesung, $(step_dirs)) -target_scriptfiles = $(addsuffix auswertung.py, $(solution_dirs)) + +target_pythonfiles = $(addsuffix auswertung.py, $(solution_dirs)) + target_texfiles_v16516 = $(addsuffix v16516.tex, $(solution_dirs_with_latex)) target_texfiles_header = $(addsuffix header.tex, $(solution_dirs_with_latex)) target_texfiles_durchfuehrung = $(addsuffix content/durchfuehrung.tex, $(solution_dirs_with_latex)) @@ -40,15 +45,13 @@ target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_ target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) $(addsuffix programme.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) -target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) -target_datafiles = $(datafiles_template_step-1) $(datafiles_template_step-5) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) all: \ $(target_datafiles) \ $(target_taskfiles) \ -$(target_scriptfiles) \ +$(target_pythonfiles) \ $(target_texfiles_header) \ $(target_texfiles_v16516) \ $(target_texfiles_durchfuehrung) \ @@ -65,7 +68,7 @@ test-%: | build # @echo " " # @echo $< @echo " " - @echo $(target_scriptfiles) + @echo $(target_pythonfiles) @echo "" @echo "" @echo $(target_texfiles_v16516) @@ -79,10 +82,10 @@ test-%: | build @echo $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) @echo "" -build/report-example-step-%/aufgabe.txt &: $(taskfiles) | $(solution_dirs) - cp $(word $*, $(taskfiles)) build/report-example-step-$*/aufgabe.txt +build/report-example-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) + cp $(word $*, $(template_taskfiles)) build/report-example-step-$*/aufgabe.txt -$(target_bibfiles) &: $(taskfiles) | $(solution_dirs_with_latex) +$(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) cp templates/lit.bib $(word 1, $(target_bibfiles)) cp templates/lit.bib $(word 2, $(target_bibfiles)) cp templates/programme.bib $(word 3, $(target_bibfiles)) @@ -107,9 +110,9 @@ $(target_texfiles_auswertung) &: generate-step-scripts.py templates/latex/auswer $(target_texfiles_diskussion) &: generate-step-scripts.py templates/latex/diskussion_template | $(content_dirs_with_latex) python generate-step-scripts.py -t templates/latex/diskussion_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 -$(target_scriptfiles) &: generate-step-scripts.py templates/latex/auswertung_template | $(solution_dirs) - touch $(word 1, $(target_scriptfiles)) - python generate-step-scripts.py -t templates/auswertung_template $(addprefix -o=, $(target_scriptfiles)) +$(target_pythonfiles) &: generate-step-scripts.py templates/latex/auswertung_template | $(solution_dirs) + touch $(word 1, $(target_pythonfiles)) + python generate-step-scripts.py -t templates/auswertung_template $(addprefix -o=, $(target_pythonfiles)) $(datafiles_template_step-1) &: | build/report-example-step-1 cp -r templates/data_without_uncertainties build/report-example-step-1/data From 85527c3f7686627ca96e124f6805d5e86c608cff Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:19:06 +0200 Subject: [PATCH 28/80] reduce snapshot test to python output --- exercises-toolbox/8-all/example-report/Makefile | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 541008f2..fceef7b1 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -182,21 +182,17 @@ test_step_scripts: all @echo @echo Testing: @echo "auswertung.py" - @echo "v16516.tex" @echo "" - echo "" > build/output.txt + echo "" > build/python_output.txt set -- $(solution_dirs); \ for i do\ cd "$$i"; \ echo "Output of '$$i/auswertung.py':" >> ../../python_output.txt; \ echo "" >> ../../python_output.txt; \ - python auswertung.py >> ../../output.txt 2>&1;\ - echo "Output of compilation of '$$i/v16516.tex':" >> ../../lualatex_output.txt; \ - echo "" >> ../../lualatex_output.txt; \ - lualatex v16516.tex >> ../../lualatex_output.txt 2>&1;\ - cd - >> /dev/null ;\ + python auswertung.py >> ../../python_output.txt 2>&1;\ + cd - >> /dev/null; \ done;\ - diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" + diff -u templates/output_snapshot.txt build/python_output.txt && echo "Test Passed!: No changes in output of scripts" #diff -u templates/output_snapshot.txt build/output.txt || diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" From 8a09837ced0383a46c9ca8acd4916e24dac927c7 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:20:08 +0200 Subject: [PATCH 29/80] removed test rule and obsolete content --- .../8-all/example-report/Makefile | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index fceef7b1..b60a121d 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -48,6 +48,7 @@ target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex + all: \ $(target_datafiles) \ $(target_taskfiles) \ @@ -61,27 +62,6 @@ $(target_texfiles_diskussion) \ $(target_bibfiles)\ -tests = test1 test2 test3 -test-%: | build - # @echo " " - # @echo $@ - # @echo " " - # @echo $< - @echo " " - @echo $(target_pythonfiles) - @echo "" - @echo "" - @echo $(target_texfiles_v16516) - @echo "" - @echo $(target_datafiles) - @echo "" - @echo $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) - @echo "" - @echo $(target_taskfiles) - @echo "" - @echo $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) - @echo "" - build/report-example-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) cp $(word $*, $(template_taskfiles)) build/report-example-step-$*/aufgabe.txt From 2d279f48274cc625a8a16de7f633306a2d1cbaa0 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:20:42 +0200 Subject: [PATCH 30/80] update output snapshot --- .../templates/output_snapshot.txt | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt index d3ef7de2..28d6489c 100644 --- a/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt +++ b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt @@ -1,10 +1,8 @@ Output of 'build/report-example-step-1/loesung//auswertung.py': - Output of 'build/report-example-step-2/loesung//auswertung.py': - Trägheitsmoment (Kugel) 0.000203588707139895 Trägheitsmoment (Zylinder) @@ -39,7 +37,6 @@ gemittlelte Zeit Output of 'build/report-example-step-3/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. @@ -77,13 +74,12 @@ gemittlelte Zeit Output of 'build/report-example-step-4/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:219: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:217: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:224: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:222: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 Trägheitsmoment (Kugel) 0.000203588707139895 @@ -139,13 +135,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-5/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 @@ -235,13 +230,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-6/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 @@ -331,13 +325,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-7/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 @@ -427,13 +420,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-8/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 @@ -523,13 +515,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-9/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 @@ -619,13 +610,12 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-10/loesung//auswertung.py': - qt.qpa.theme.dbus: Session DBus not running. qt.qpa.theme.dbus: Application will not react to setting changes. Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:240: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:245: RuntimeWarning: invalid value encountered in sqrt +/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 From 5efbdb0a4326bdc36cffe260d4b0b6c9009e4239 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:29:03 +0200 Subject: [PATCH 31/80] renamed templates to include filetype --- .../8-all/example-report/Makefile | 35 ++++++++++--------- ...ertung_template => auswertung_py_template} | 0 ...rtung_template => auswertung_tex_template} | 0 ...ssion_template => diskussion_tex_template} | 0 ...ng_template => durchfuehrung_tex_template} | 0 .../{header_template => header_tex_template} | 0 ...{theorie_template => theorie_tex_template} | 0 .../{v16516_template => v16516_tex_template} | 0 8 files changed, 18 insertions(+), 17 deletions(-) rename exercises-toolbox/8-all/example-report/templates/{auswertung_template => auswertung_py_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{auswertung_template => auswertung_tex_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{diskussion_template => diskussion_tex_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{durchfuehrung_template => durchfuehrung_tex_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{header_template => header_tex_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{theorie_template => theorie_tex_template} (100%) rename exercises-toolbox/8-all/example-report/templates/latex/{v16516_template => v16516_tex_template} (100%) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index b60a121d..2cd22a67 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -75,24 +75,24 @@ $(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung -$(target_texfiles_v16516) &: generate-step-scripts.py templates/latex/v16516_template | $(solution_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/v16516_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 - -$(target_texfiles_header) &: generate-step-scripts.py templates/latex/header_template | $(solution_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/header_template $(addprefix -o=,$(target_texfiles_header)) -s 7 - -$(target_texfiles_durchfuehrung) &: generate-step-scripts.py templates/latex/durchfuehrung_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/durchfuehrung_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 -$(target_texfiles_theorie) &: generate-step-scripts.py templates/latex/theorie_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/theorie_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 -$(target_texfiles_auswertung) &: generate-step-scripts.py templates/latex/auswertung_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/auswertung_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 -$(target_texfiles_diskussion) &: generate-step-scripts.py templates/latex/diskussion_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/diskussion_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 - -$(target_pythonfiles) &: generate-step-scripts.py templates/latex/auswertung_template | $(solution_dirs) +$(target_texfiles_v16516) &: generate-step-scripts.py templates/latex/v16516_tex_template | $(solution_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/v16516_tex_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 + +$(target_texfiles_header) &: generate-step-scripts.py templates/latex/header_tex_template | $(solution_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/header_tex_template $(addprefix -o=,$(target_texfiles_header)) -s 7 + +$(target_texfiles_durchfuehrung) &: generate-step-scripts.py templates/latex/durchfuehrung_tex_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/durchfuehrung_tex_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 +$(target_texfiles_theorie) &: generate-step-scripts.py templates/latex/theorie_tex_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/theorie_tex_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 +$(target_texfiles_auswertung) &: generate-step-scripts.py templates/latex/auswertung_tex_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/auswertung_tex_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 +$(target_texfiles_diskussion) &: generate-step-scripts.py templates/latex/diskussion_tex_template | $(content_dirs_with_latex) + python generate-step-scripts.py -t templates/latex/diskussion_tex_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 + +$(target_pythonfiles) &: generate-step-scripts.py templates/auswertung_py_template | $(solution_dirs) touch $(word 1, $(target_pythonfiles)) - python generate-step-scripts.py -t templates/auswertung_template $(addprefix -o=, $(target_pythonfiles)) + python generate-step-scripts.py -t templates/auswertung_py_template $(addprefix -o=, $(target_pythonfiles)) $(datafiles_template_step-1) &: | build/report-example-step-1 cp -r templates/data_without_uncertainties build/report-example-step-1/data @@ -167,6 +167,7 @@ test_step_scripts: all set -- $(solution_dirs); \ for i do\ cd "$$i"; \ + echo "$$PWD"; \ echo "Output of '$$i/auswertung.py':" >> ../../python_output.txt; \ echo "" >> ../../python_output.txt; \ python auswertung.py >> ../../python_output.txt 2>&1;\ diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/auswertung_template rename to exercises-toolbox/8-all/example-report/templates/auswertung_py_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/auswertung_template rename to exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_template b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/diskussion_template rename to exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_template rename to exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/header_template b/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/header_template rename to exercises-toolbox/8-all/example-report/templates/latex/header_tex_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/theorie_template rename to exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template diff --git a/exercises-toolbox/8-all/example-report/templates/latex/v16516_template b/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/latex/v16516_template rename to exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template From 6629babefd295e2f5bab87a9581da066a453657f Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:31:13 +0200 Subject: [PATCH 32/80] delete obsolet Makefile --- .../templates/loesung/v16516/Makefile | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100644 exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile diff --git a/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile b/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile deleted file mode 100644 index 3ee00846..00000000 --- a/exercises-toolbox/8-all/example-report/templates/loesung/v16516/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -all: build/v16516.pdf - -# hier Python-Skripte: -build/plot-g_ball.pdf: auswertung.py ../matplotlibrc ../header-matplotlib.tex data/*| build - # so that matplotlib can find the tex header when running - # LaTeX in the tmp directory - # and set the matplotlibrc - TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python auswertung.py - -build/parameter-g_ball.tex: build/plot-g_ball.pdf -build/parameter-t0-g_ball.tex: build/parameter-g_ball.tex - -build/plot-g_cylinder.pdf: build/parameter-t0-g_ball.tex -build/parameter-g_cylinder.tex: build/plot-g_cylinder.pdf -build/parameter-t0-g_cylinder.tex: build/parameter-g_cylinder.tex - -build/plot-I_ball.pdf: build/parameter-g_cylinder.tex -build/parameter-I_ball.tex: build/plot-I_ball.pdf -build/parameter-t0-I_ball.tex: build/parameter-I_ball.tex - -build/plot-I_cylinder.pdf: build/parameter-t0-I_ball.tex -build/parameter-I_cylinder.tex: build/plot-I_cylinder.pdf -build/parameter-t0-I_cylinder.tex: build/parameter-I_cylinder.tex - -build/table_all-measurements.tex: build/parameter-t0-I_cylinder.tex -build/table_averaged-measurements.tex: build/table_all-measurements.tex -build/tracklength.tex: build/table_averaged-measurements.tex -build/framerate.tex: build/tracklength.tex -build/mass_ball.tex: build/framerate.tex -build/radius_ball.tex: build/mass_ball.tex -build/theoretical-I_ball.tex: build/radius_ball.tex -build/mass_cylinder.tex: build/theoretical-I_ball.tex -build/radius-inner_cylinder.tex: build/mass_cylinder.tex -build/radius-outer_cylinder.tex: build/radius-inner_cylinder.tex -build/theoretical-I_cylinder.tex: build/radius-outer_cylinder.tex - -# hier weitere Abhängigkeiten für build/vXXX.pdf deklarieren: -build/v16516.pdf: build/plot-g_ball.pdf -build/v16516.pdf: build/parameter-g_ball.tex -build/v16516.pdf: build/parameter-t0-g_ball.tex -build/v16516.pdf: build/plot-g_cylinder.pdf -build/v16516.pdf: build/parameter-g_cylinder.tex -build/v16516.pdf: build/parameter-t0-g_cylinder.tex -build/v16516.pdf: build/plot-I_ball.pdf -build/v16516.pdf: build/parameter-I_ball.tex -build/v16516.pdf: build/parameter-t0-I_ball.tex -build/v16516.pdf: build/plot-I_cylinder.pdf -build/v16516.pdf: build/parameter-I_cylinder.tex -build/v16516.pdf: build/parameter-t0-I_cylinder.tex -build/v16516.pdf: build/framerate.tex -build/v16516.pdf: build/theoretical-I_ball.tex -build/v16516.pdf: build/theoretical-I_cylinder.tex -build/v16516.pdf: build/tracklength.tex -build/v16516.pdf: build/mass_ball.tex -build/v16516.pdf: build/mass_cylinder.tex -build/v16516.pdf: build/radius_ball.tex -build/v16516.pdf: build/radius-inner_cylinder.tex -build/v16516.pdf: build/radius-outer_cylinder.tex -build/v16516.pdf: build/table_all-measurements.tex -build/v16516.pdf: build/table_averaged-measurements.tex - -build/v16516.pdf: FORCE | build - # to find header and bib files in the main directory - TEXINPUTS=..: \ - BIBINPUTS=..: \ - max_print_line=1048576 \ - latexmk \ - --lualatex \ - --output-directory=build \ - --interaction=nonstopmode \ - --halt-on-error \ - v16516.tex - -build: - mkdir -p build - -clean: - rm -rf build - -FORCE: - -.PHONY: all clean From f62a718692ac39408c338e0d43dc3c10787fc243 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:36:18 +0200 Subject: [PATCH 33/80] remove stderr from snapshot test and updated snapshot --- .../8-all/example-report/Makefile | 2 +- .../templates/output_snapshot.txt | 52 ------------------- 2 files changed, 1 insertion(+), 53 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 2cd22a67..965a21f4 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -170,7 +170,7 @@ test_step_scripts: all echo "$$PWD"; \ echo "Output of '$$i/auswertung.py':" >> ../../python_output.txt; \ echo "" >> ../../python_output.txt; \ - python auswertung.py >> ../../python_output.txt 2>&1;\ + python auswertung.py >> ../../python_output.txt;\ cd - >> /dev/null; \ done;\ diff -u templates/output_snapshot.txt build/python_output.txt && echo "Test Passed!: No changes in output of scripts" diff --git a/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt index 28d6489c..e19c03c1 100644 --- a/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt +++ b/exercises-toolbox/8-all/example-report/templates/output_snapshot.txt @@ -37,9 +37,6 @@ gemittlelte Zeit Output of 'build/report-example-step-3/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. Trägheitsmoment (Kugel) 0.000203588707139895 Trägheitsmoment (Zylinder) @@ -74,13 +71,6 @@ gemittlelte Zeit Output of 'build/report-example-step-4/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:217: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-4/loesung/auswertung.py:222: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 Trägheitsmoment (Kugel) 0.000203588707139895 Trägheitsmoment (Zylinder) @@ -135,13 +125,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-5/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-5/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) @@ -230,13 +213,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-6/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-6/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) @@ -325,13 +301,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-7/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-7/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) @@ -420,13 +389,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-8/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-8/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) @@ -515,13 +477,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-9/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-9/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) @@ -610,13 +565,6 @@ t = -0.135 ± 0.031 Output of 'build/report-example-step-10/loesung//auswertung.py': -qt.qpa.theme.dbus: Session DBus not running. -qt.qpa.theme.dbus: Application will not react to setting changes. - Check your DBus installation. -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:238: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 -/home/luckyjosh/Documents/Toolbox/branch_example-report-exercise-steps/exercises-toolbox/8-all/example-report/build/report-example-step-10/loesung/auswertung.py:243: RuntimeWarning: invalid value encountered in sqrt - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 Trägheitsmoment (Kugel) 0.000204+/-0.000013 Trägheitsmoment (Zylinder) From f3313817878d1c37ea15884f058e490705a9e674 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Tue, 1 Oct 2024 22:40:57 +0200 Subject: [PATCH 34/80] change name since texfiles are not really 'scripts' --- .../8-all/example-report/Makefile | 34 +++++++++---------- ...step-scripts.py => generate-step-files.py} | 0 2 files changed, 17 insertions(+), 17 deletions(-) rename exercises-toolbox/8-all/example-report/{generate-step-scripts.py => generate-step-files.py} (100%) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 965a21f4..1950ac02 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -75,24 +75,24 @@ $(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung -$(target_texfiles_v16516) &: generate-step-scripts.py templates/latex/v16516_tex_template | $(solution_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/v16516_tex_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 - -$(target_texfiles_header) &: generate-step-scripts.py templates/latex/header_tex_template | $(solution_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/header_tex_template $(addprefix -o=,$(target_texfiles_header)) -s 7 - -$(target_texfiles_durchfuehrung) &: generate-step-scripts.py templates/latex/durchfuehrung_tex_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/durchfuehrung_tex_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 -$(target_texfiles_theorie) &: generate-step-scripts.py templates/latex/theorie_tex_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/theorie_tex_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 -$(target_texfiles_auswertung) &: generate-step-scripts.py templates/latex/auswertung_tex_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/auswertung_tex_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 -$(target_texfiles_diskussion) &: generate-step-scripts.py templates/latex/diskussion_tex_template | $(content_dirs_with_latex) - python generate-step-scripts.py -t templates/latex/diskussion_tex_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 - -$(target_pythonfiles) &: generate-step-scripts.py templates/auswertung_py_template | $(solution_dirs) +$(target_texfiles_v16516) &: generate-step-files.py templates/latex/v16516_tex_template | $(solution_dirs_with_latex) + python generate-step-files.py -t templates/latex/v16516_tex_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 + +$(target_texfiles_header) &: generate-step-files.py templates/latex/header_tex_template | $(solution_dirs_with_latex) + python generate-step-files.py -t templates/latex/header_tex_template $(addprefix -o=,$(target_texfiles_header)) -s 7 + +$(target_texfiles_durchfuehrung) &: generate-step-files.py templates/latex/durchfuehrung_tex_template | $(content_dirs_with_latex) + python generate-step-files.py -t templates/latex/durchfuehrung_tex_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 +$(target_texfiles_theorie) &: generate-step-files.py templates/latex/theorie_tex_template | $(content_dirs_with_latex) + python generate-step-files.py -t templates/latex/theorie_tex_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 +$(target_texfiles_auswertung) &: generate-step-files.py templates/latex/auswertung_tex_template | $(content_dirs_with_latex) + python generate-step-files.py -t templates/latex/auswertung_tex_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 +$(target_texfiles_diskussion) &: generate-step-files.py templates/latex/diskussion_tex_template | $(content_dirs_with_latex) + python generate-step-files.py -t templates/latex/diskussion_tex_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 + +$(target_pythonfiles) &: generate-step-files.py templates/auswertung_py_template | $(solution_dirs) touch $(word 1, $(target_pythonfiles)) - python generate-step-scripts.py -t templates/auswertung_py_template $(addprefix -o=, $(target_pythonfiles)) + python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=, $(target_pythonfiles)) $(datafiles_template_step-1) &: | build/report-example-step-1 cp -r templates/data_without_uncertainties build/report-example-step-1/data diff --git a/exercises-toolbox/8-all/example-report/generate-step-scripts.py b/exercises-toolbox/8-all/example-report/generate-step-files.py similarity index 100% rename from exercises-toolbox/8-all/example-report/generate-step-scripts.py rename to exercises-toolbox/8-all/example-report/generate-step-files.py From 95b7f29cb37780ac82144c5a34eab4461a7cded8 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 10:13:13 +0200 Subject: [PATCH 35/80] add comments and clean up generation script --- .../example-report/generate-step-files.py | 110 +++++++++++------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index f83e5c53..43bad87b 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -5,6 +5,8 @@ from dataclasses import dataclass from collections.abc import Iterable +STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") + @dataclass class Templateline: linenumber: int @@ -15,53 +17,80 @@ def __str__(self): return f"{self.linenumber:>3} {self.line}" - -STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") - def setup_arg_parser(): parser = argparse.ArgumentParser( - prog="generate-step-scripts", - description="Generate multiple files with lines from a template file", + prog="generate-step-files", + description="Generate multiple (step)files containing lines from a template file", epilog='') - parser.add_argument('-v', '--verbose', action='store_true') - parser.add_argument('-n', '--dry-run', action='store_true') - parser.add_argument('-s', '--start-step', type=int) - parser.add_argument('-t','--template_filepath', dest='template_filepath', required=True) - parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append", required=True) + parser.add_argument('-v', '--verbose', action='store_true', + help="Get info on parsed args, the step maximum steprange in the template and to be removed lines.") + parser.add_argument('-n', '--dry-run', action='store_true', + help="Print the content of each output file to stdout instead of generating any files.") + # This option allows to use the same step numbering in differnt independent files + parser.add_argument('-s', '--start-step', type=int, default=1, + help="Set the step that should be considered step 1 for this file") + parser.add_argument('-t','--template_filepath', dest='template_filepath', required=True, + help="Filepath to the template file.") + parser.add_argument('-o', '--output_filepaths', dest='output_filepaths', action="append", required=True, + help="Filepaths to the output files (you need to use one Option -o for each file). Hint: use -o=file{1,2,3} for example, to generate the multiple options.)") return parser def parse_lines_and_stepranges(lines, max_upper_limit): #step_ranges = [] - script_lines = [] + template_lines = [] removed_lines = [] for i,l in enumerate(lines, start=1): found = STEPRANGEREGEX.search(l) + + # a line containing no pattern will not be saved to any output file, hence 'removed' if found is None: removed_lines.append(Templateline(i,l, (None, None))) continue groups = found.groups() - - lower_limit = int(groups[0]) + + try: + lower_limit = int(groups[0]) + except ValueError: + raise ValueError(f"The pattern in line {i} of the template file has not starting step") + + # The dash and second number can be omitted: + # e.g. <4> is equivalent to <4-4> if (not groups[1]) and (groups[2] is None): - step_limits = (lower_limit, lower_limit + 1) + # The upper limit has to be increased by one to be inclusive as a range + step_limits = (lower_limit, lower_limit + 1) + + # If the second number is omitted but the dash is not, the upper limit is the last step: + # e.g. <4-> is equivalent to <4-10> if 10 output files are generated elif not groups[2]: step_limits = (lower_limit, max_upper_limit + 1) + + # both numbers are present in the pattern else: step_limits = (lower_limit, int(groups[2]) + 1) - script_lines.append(Templateline(i, STEPRANGEREGEX.sub("", l).rstrip(), range(*step_limits))) - return script_lines, removed_lines + num_files_with_line = step_limits[1] - step_limits[0] + if num_files_with_line > max_upper_limit: + raise ValueError(f"The number of given output files is {max_upper_limit}," + f" but line {i} of the template file is expected to appear in {num_files_with_line} output files (pattern: {found.group()}).") + + # remove the steprange pattern and spaces between line content and pattern + line_content = STEPRANGEREGEX.sub("", l).rstrip() + template_lines.append(Templateline(i, line_content, range(*step_limits))) + + return template_lines, removed_lines -def generate_step_file_lines(script_lines): - step_files_lines = defaultdict(list) - for line in script_lines: - +def split_stepfile_lines(template_lines, output_filepaths, start_step): + # mapping the start_step to the first given output file + map_first_step = lambda step: step - (start_step - 1) + + lines_per_stepfile = defaultdict(list) + for line in template_lines: for step in line.step_range: - step_files_lines[step].append(line) - - return step_files_lines + lines_per_stepfile[output_filepaths[map_first_step(step)-1]].append(line) + + return lines_per_stepfile def main(): @@ -76,43 +105,34 @@ def main(): print("Input:") print(' '.join(sys.argv)) print("Parsed:") - print(f" - Templatefile: {template_filepath}") - print(f" - Outputfiles: {output_filepaths}") - print(f" - Start step: {args.start_step}") - - map_step = lambda step: step - if args.start_step: - map_step = lambda step: step - (args.start_step - 1) - - - + print(f" - template file: {template_filepath}") + print(f" - output files: {output_filepaths}") + print(f" - start step: {args.start_step}") + with open(template_filepath) as fh: template_lines = fh.readlines() - script_lines, removed_lines = parse_lines_and_stepranges(template_lines, len(output_filepaths)) + template_lines, removed_lines = parse_lines_and_stepranges(template_lines, len(output_filepaths)) - step_files_lines = generate_step_file_lines(script_lines) + lines_per_stepfiles = split_stepfile_lines(template_lines, output_filepaths, args.start_step) if args.verbose: print("Removed lines:") print(f"{'\n'.join(str(rl) for rl in removed_lines)}") - print(f"Found steps: {step_files_lines.keys()}") + print(f"Found steps: {lines_per_stepfiles.keys()}") + if args.dry_run: - for step,lines in step_files_lines.items(): - print(f"\nOutputfile '{output_filepaths[map_step(step)-1]}' (Step: {step}) would these lines from the template file:") + for stepfile, lines in lines_per_stepfiles.items(): + print(f"\nOutput file '{stepfile}' would these lines from the template file:") print(f"{"\n".join(str(l) for l in lines)}") return - try: - for step, lines in step_files_lines.items(): - - with open(output_filepaths[map_step(step)-1], "w") as fh: - fh.write("\n".join(l.line for l in lines).strip()) - except IndexError: - raise ValueError(f"Expecting {max(step_files_lines.keys())} output files, but got only {len(output_filepaths)}.") + for stepfile, lines in lines_per_stepfiles.items(): + with open(stepfile, "w") as fh: + fh.write("\n".join(l.line for l in lines).strip()) if __name__ == "__main__": main() From 6580ed18f17f09d3d6dbd0268e83891cde695cc3 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 10:21:11 +0200 Subject: [PATCH 36/80] removed the hardcoded last step since the script can infer it --- .../templates/auswertung_py_template | 598 +++++++++--------- .../templates/latex/auswertung_tex_template | 340 +++++----- .../templates/latex/diskussion_tex_template | 88 +-- .../latex/durchfuehrung_tex_template | 40 +- .../templates/latex/header_tex_template | 278 ++++---- .../templates/latex/theorie_tex_template | 146 ++--- .../templates/latex/v16516_tex_template | 53 +- 7 files changed, 772 insertions(+), 771 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template index 04b9420b..461f1370 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template @@ -1,148 +1,148 @@ # Erklärung: # <2-2> # Importiere numpy unter dem Namen np # <2-2> -import numpy as np # <2-10> - # <2-10> +import numpy as np # <2-> + # <2-> # Erklärung: # <3-3> # Importiere matplotlib.pyplot unter dem Namen plt # <3-3> -import matplotlib.pyplot as plt # <3-10> - # <2-10> - # <2-10> +import matplotlib.pyplot as plt # <3-> + # <2-> + # <2-> # Erklärung: # <4-4> # Importiere curve_fit aus scipy.optimize # <4-4> -from scipy.optimize import curve_fit # <4-10> -from scipy.constants import physical_constants # <4-10> - # <2-10> - # <2-10> -# Erklärung: # <5-10> -# Importiere uncertainties unter dem Namen unc # <5-10> -# Importiere uncertainties.unumpy unter dem Namen unp # <5-10> -# Importiere der Funktionen nominal_values und std_devs # <5-10> -# aus uncertainties.unumpy, unter den kürzeren Namen # <5-10> -# noms respektive stds # <5-10> -import uncertainties as unc # <5-10> -import uncertainties.unumpy as unp # <5-10> -from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-10> - # <2-10> +from scipy.optimize import curve_fit # <4-> +from scipy.constants import physical_constants # <4-> + # <2-> + # <2-> +# Erklärung: # <5-> +# Importiere uncertainties unter dem Namen unc # <5-> +# Importiere uncertainties.unumpy unter dem Namen unp # <5-> +# Importiere der Funktionen nominal_values und std_devs # <5-> +# aus uncertainties.unumpy, unter den kürzeren Namen # <5-> +# noms respektive stds # <5-> +import uncertainties as unc # <5-> +import uncertainties.unumpy as unp # <5-> +from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-> + # <2-> # Erklärung: # <2-2> # Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> # zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> # es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> -# # <2-10> +# # <2-> # Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> -# # <2-10> +# # <2-> # Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> # ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> # nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> # Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> -# # <2-10> +# # <2-> # Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> # (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> - # <2-10> - # <2-10> -# Erklärung: # <5-10> -# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-10> -# für die meisten Messwerte. # <5-10> -# Beim Importieren der Daten muss beachtet werden, dass: # <5-10> -# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-10> -# Auch hier ist eine konsistente Benennung sinnvoll # <5-10> -# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-10> -# # <5-10> -# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-10> -# entweder durch unc.ufloat oder durch das unp.uarray # <5-10> - # <2-10> - # <2-10> -# Länge der schiefen Ebene # <2-10> + # <2-> + # <2-> +# Erklärung: # <5-> +# Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-> +# für die meisten Messwerte. # <5-> +# Beim Importieren der Daten muss beachtet werden, dass: # <5-> +# (1) Messgröße und Unsicherheit jeweils eine eigene Variablennamen brauchen. # <5-> +# Auch hier ist eine konsistente Benennung sinnvoll # <5-> +# z.B. l (Messwerte) und l_unc (zugehörige Unsicherheiten) # <5-> +# # <5-> +# (2) die Unsicherheitbehafteten Messwerte noch erstellt werden müssen, # <5-> +# entweder durch unc.ufloat oder durch das unp.uarray # <5-> + # <2-> + # <2-> +# Länge der schiefen Ebene # <2-> l = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",")/100 # m # <2-4> -l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-10> -l = unc.ufloat(l, l_unc) # <5-10> - # <2-10> +l, l_unc = np.genfromtxt("data/Messwerte_Bahn.txt", delimiter=",", unpack=True)/100 # m # <5-> +l = unc.ufloat(l, l_unc) # <5-> + # <2-> # Framerate der Kamera # <2-4> -# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-10> +# Framerate der Kamera (hat keine Unsicherheit, fps_unc = 0) # <5-> fps = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",") # 1/s # <2-4> -fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-10> - # <2-10> +fps, fps_unc = np.genfromtxt("data/Messwerte_Kamera.txt", delimiter=",", unpack=True) # 1/s # <5-> + # <2-> # Erklärung: # <2-2> # Die Daten aus Dateien mit mehreren spalten muss man in einer extra Zeile skalieren # <2-2> -# Masse und Umfang der Kugel # <2-10> +# Masse und Umfang der Kugel # <2-> m_b, u_b = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <2-4> -m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-10> +m_b, m_b_unc, u_b, u_b_unc = np.genfromtxt("data/Messwerte_Kugel.txt", delimiter=",", unpack=True) # <5-> m_b = m_b/1000 # kg # <2-4> u_b = u_b/100 # m # <2-4> -m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-10> -u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-10> - # <2-10> -# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-10> +m_b = unc.ufloat(m_b,m_b_unc)/1000 # kg # <5-> +u_b = unc.ufloat(u_b,m_b_unc)/100 # m # <5-> + # <2-> +# Messreihe: Starthöhe und Startframe und Endframe (Kugel) # <2-> h_b, Fi_b, Ff_b = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <2-4> -h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-10> +h_b, h_b_unc, Fi_b, Fi_b_unc, Ff_b, Ff_b_unc = np.genfromtxt("data/Messwerte_Frames_Kugel.txt", delimiter=",", unpack=True) # <5-> h_b = h_b/100 # m # <2-4> -h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-10> -Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-10> -Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-10> - # <2-10> - # <2-10> -# Masse und Umfang des Zylinders # <2-10> +h_b = unp.uarray(h_b, h_b_unc)/100 # m # <5-> +Fi_b = unp.uarray(Fi_b, Fi_b_unc) # <5-> +Ff_b = unp.uarray(Ff_b, Ff_b_unc) # <5-> + # <2-> + # <2-> +# Masse und Umfang des Zylinders # <2-> m_c, u_c, d_c = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-10> +m_c, m_c_unc, u_c, u_c_unc, d_c, d_c_unc = np.genfromtxt("data/Messwerte_Zylinder.txt", delimiter=",", unpack=True) # <5-> m_c = m_c/1000 # kg # <2-4> u_c = u_c/100 # m # <2-4> d_c = d_c/100 # m # <2-4> -m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-10> -u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-10> -d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-10> - # <2-10> -# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-10> +m_c = unc.ufloat(m_c, m_c_unc)/1000 # kg # <5-> +u_c = unc.ufloat(u_c, u_c_unc)/100 # m # <5-> +d_c = unc.ufloat(d_c, d_c_unc)/100 # m # <5-> + # <2-> +# Messreihe: Starthöhe und Startframe und Endframe (Zylinder) # <2-> h_c, Fi_c, Ff_c = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <2-4> -h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-10> +h_c, h_c_unc, Fi_c, Fi_c_unc, Ff_c, Ff_c_unc = np.genfromtxt("data/Messwerte_Frames_Zylinder.txt", delimiter=",", unpack=True) # <5-> h_c = h_c/100 # m # <2-4> -h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-10> -Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-10> -Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-10> - # <2-10> +h_c = unp.uarray(h_c, h_c_unc)/100 # m # <5-> +Fi_c = unp.uarray(Fi_c, Fi_c_unc) # <5-> +Ff_c = unp.uarray(Ff_c, Ff_c_unc) # <5-> + # <2-> # Erklärung: # <2-2> # Ein gewisses Maß an Struktur in der Benennung von Variablen hilft bei der Orientierung, # <2-2> # gerade in der Zusammenarbeit mit euren jeweiligen Partnern. # <2-2> # Man muss es aber auch nicht übertreiben. Gerade ein Sprachenmix aus deutsch und englisch # <2-2> # ist nicht besonders tragisch: z.B. steht m_b für mass_ball aber u_b für umfang_ball, # <2-2> # aber das p_b für perimeter_ball würde mir persönlich nicht so klar werden. # <2-2> - # <2-10> + # <2-> # Erklärung: # <2-2> # Auch die einzelnen "Arbeitsschritte" der Auswertung sollten in einem # <2-2> # kurzen Kommentar erklärt werden. # <2-2> # Erklärung: # <2-2> -# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-10> - # <2-10> - # <2-10> -# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-10> - # <2-10> -# Radius der Kugel # <2-10> -r_b = u_b/(2*np.pi) # <2-10> - # <2-10> -# Äußerer Radius des Zylinders # <2-10> -ro_c = u_c/(2*np.pi) # <2-10> - # <2-10> -# Innerer Radius des Zylinders # <2-10> -ri_c = ro_c - d_c # <2-10> - # <2-10> - # <2-10> -# Trägheitsmoment der Kugel # <2-10> -I_b = 2/5 * m_b * r_b**2 # <2-10> - # <2-10> -# Trägheitsmoment des Zylinders # <2-10> -I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-10> - # <2-10> -print("Trägheitsmoment (Kugel)") # <2-10> -print(I_b) # <2-10> - # <2-10> -print("Trägheitsmoment (Zylinder)") # <2-10> -print(I_c) # <2-10> - # <2-10> - # <2-10> -# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-10> -t_b = (Ff_b - Fi_b)/fps # <2-10> -t_c = (Ff_c - Fi_c)/fps # <2-10> - # <2-10> -# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-10> - # <2-10> +# Die folgenden Berechnungen funktionieren alle weiterhin, nur jetzt mit automatischer Fehlerrechnung # <5-> + # <2-> + # <2-> +# Berechnung der benötigten Größen: Radius und Trägheitsmoment # <2-> + # <2-> +# Radius der Kugel # <2-> +r_b = u_b/(2*np.pi) # <2-> + # <2-> +# Äußerer Radius des Zylinders # <2-> +ro_c = u_c/(2*np.pi) # <2-> + # <2-> +# Innerer Radius des Zylinders # <2-> +ri_c = ro_c - d_c # <2-> + # <2-> + # <2-> +# Trägheitsmoment der Kugel # <2-> +I_b = 2/5 * m_b * r_b**2 # <2-> + # <2-> +# Trägheitsmoment des Zylinders # <2-> +I_c = 1/2 * m_c * (ro_c**2 + ri_c**2) # <2-> + # <2-> +print("Trägheitsmoment (Kugel)") # <2-> +print(I_b) # <2-> + # <2-> +print("Trägheitsmoment (Zylinder)") # <2-> +print(I_c) # <2-> + # <2-> + # <2-> +# Berechnung der Rollzeiten aus den Messwerten der Frames und Framerate # <2-> +t_b = (Ff_b - Fi_b)/fps # <2-> +t_c = (Ff_c - Fi_c)/fps # <2-> + # <2-> +# Berechnung des Mittelwerts für die Zeitdauer t für jede (dreifach gemessene) Höhe # <2-> + # <2-> # Erklärung: # <2-2> # Es ist ein neuer Name (t_b_mean) notwendig, wenn die alten Werte in t_b # <2-2> # noch verfügbar bleiben sollen # <2-2> @@ -163,9 +163,9 @@ t_c = (Ff_c - Fi_c)/fps # des arrays, über die summiert wird (die danach nur noch einen Wert enthält). # <2-2> # Da jede Zeile genau die drei Werte enthält, die zu mitteln sind, enthält jede # <2-2> # Zeile danach genau den jeweiligen Mittelwert. # <2-2> - # <2-10> -t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-10> - # <2-10> + # <2-> +t_b_mean = t_b.reshape(-1,3).mean(axis=1) # <2-> + # <2-> # Erklärung: # <2-2> # Das Array h_b enthält jede Höhe dreifach, auch die Auswahl # <2-2> # der einzelnen Höhen kann durch array Manipulation geschehen. # <2-2> @@ -178,42 +178,42 @@ t_b_mean = t_b.reshape(-1,3).mean(axis=1) # [:,0] # <2-2> # Aus jeder Zeile (= erster Index ist ':') wird die 'nullte' Spalte (= zweiter Index ist '0') # <2-2> # ausgewählt, d.h. in jeder Zeile bleibt genau eine Höhe erhalten. # <2-2> - # <2-10> -h_b_mean = h_b.reshape(-1,3)[:,0] # <2-10> - # <2-10> + # <2-> +h_b_mean = h_b.reshape(-1,3)[:,0] # <2-> + # <2-> # Erklärung: # <2-2> # analog für die andere Messreihe # <2-2> - # <2-10> -t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-10> -h_c_mean = h_c.reshape(-1,3)[:,0] # <2-10> - # <2-10> -# Ausgabe verarbeiteten der Messwerte # <2-10> - # <2-10> -print("Messwerte (Kugel)") # <2-10> -print("alle Zeiten") # <2-10> -print(t_b) # <2-10> -print("alle Höhen") # <2-10> -print(h_b) # <2-10> -print("Höhe") # <2-10> -print(h_b_mean) # <2-10> -print("gemittlelte Zeit") # <2-10> -print(t_b_mean) # <2-10> -print("\n") # <2-10> - # <2-10> - # <2-10> -print("Messwerte (Zylinder)") # <2-10> -print("alle Höhen") # <2-10> -print(h_c) # <2-10> -print("alle Zeiten") # <2-10> -print(t_c) # <2-10> -print("Höhe") # <2-10> -print(h_c_mean) # <2-10> -print("gemittlelte Zeit") # <2-10> -print(t_c_mean) # <2-10> -print("\n") # <2-10> - # <2-10> -# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-10> - # <2-10> + # <2-> +t_c_mean = t_c.reshape(-1,3).mean(axis=1) # <2-> +h_c_mean = h_c.reshape(-1,3)[:,0] # <2-> + # <2-> +# Ausgabe verarbeiteten der Messwerte # <2-> + # <2-> +print("Messwerte (Kugel)") # <2-> +print("alle Zeiten") # <2-> +print(t_b) # <2-> +print("alle Höhen") # <2-> +print(h_b) # <2-> +print("Höhe") # <2-> +print(h_b_mean) # <2-> +print("gemittlelte Zeit") # <2-> +print(t_b_mean) # <2-> +print("\n") # <2-> + # <2-> + # <2-> +print("Messwerte (Zylinder)") # <2-> +print("alle Höhen") # <2-> +print(h_c) # <2-> +print("alle Zeiten") # <2-> +print(t_c) # <2-> +print("Höhe") # <2-> +print(h_c_mean) # <2-> +print("gemittlelte Zeit") # <2-> +print(t_c_mean) # <2-> +print("\n") # <2-> + # <2-> +# Erstelle Plots der Messwerte t_._mean und h_._mean # <3-> + # <2-> # Erklärung: # <3-3> # Funktionen für die Funktionsgleichungen der Theorie-Funktionen # <3-3> # # <3-3> @@ -221,13 +221,13 @@ print("\n") # wie hier: l, ri_c und ro_c # <3-3> # Solche globalen Variablen können bei größeren Skripten/Programmen zu einem Problem werden # <3-3> # es ist also zumindest Vorsicht geboten # <3-3> - # <2-10> + # <2-> def theory_t_ball(h): # <3-3> return np.sqrt(7/5 * 1/h * 2* l**2/9.81) # <3-3> - # <2-10> + # <2-> def theory_t_cylinder(h): # <3-3> return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/9.81 * 1/h) # <3-3> - # <2-10> + # <2-> # Erklärung: # <4-4> # Umwandeln der Theorie-Funktion zu einer Fit-Funktion: # <4-4> # Die Funktion erhält ein zusätzliches Argument für jeden Fitparameter, hier: g und t0 # <4-4> @@ -236,149 +236,149 @@ def theory_t_cylinder(h): # Namen sind wie immer beliebig und es gibt nicht "den einen richtigen Namen", # <4-4> # aber es bietet sich wie immer an sprechende Namen zu verwenden, hier z.B. # <4-4> # "fit_g_ball" als Abkürzung für "Fitfunktion für den Parameter g aus den Messwerten für die Kugel" # <4-4> - # <2-10> + # <2-> def fit_g_ball(h, g, t0): # <4-4> return np.sqrt(7/5 * 1/h * 2* l**2/g) + t0 # <4-4> - # <2-10> + # <2-> def fit_g_cylinder(h, g, t0): # <4-4> return np.sqrt((3 + ri_c**2/ro_c**2) * l**2/g * 1/h) + t0 # <4-4> - # <2-10> - # <2-10> -# Erklärung: # <5-10> -# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-10> -# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-10> -# Messwerten umgehen. # <5-10> -# Folgendes muss dafür geändert werden: # <5-10> -# # <5-10> -# (1) in der Fitfunktion müssen mit der Funktion noms() # <5-10> -# # <5-10> -# die Unsicherheiten von Konstanten entfernt werden # <5-10> -# # <5-10> -# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-10> -# diese müssen mit noms() entfernt werden. # <5-10> -# # <5-10> -# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-10> -# müssen getrennt übergeben werden: noms() und stds() # <5-10> -# # <5-10> -# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-10> -# um die Unsicherheiten anzeigen zu können # <5-10> -# # <5-10> -# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-10> -# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-10> -# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-10> - # <2-10> -def fit_g_ball(h, g, t0): # <5-10> - return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-10> - # <2-10> -def fit_g_cylinder(h, g, t0): # <5-10> - return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-10> - # <2-10> - # <2-10> - # <2-10> + # <2-> + # <2-> +# Erklärung: # <5-> +# Nur für die Erstellung der Plots und Fits ändert sich etwas: # <5-> +# Weder scipy noch matplotlib können direkt mit den unsicherheitbehafteten # <5-> +# Messwerten umgehen. # <5-> +# Folgendes muss dafür geändert werden: # <5-> +# # <5-> +# (1) in der Fitfunktion müssen mit der Funktion noms() # <5-> +# # <5-> +# die Unsicherheiten von Konstanten entfernt werden # <5-> +# # <5-> +# (2) mit Unsicherheiten der unabhängigen Variable kann curve_fit nicht umgehen, # <5-> +# diese müssen mit noms() entfernt werden. # <5-> +# # <5-> +# (3) die Werte und Unsicherheiten der abhängigen Variable (gemessene Funktionswerte) # <5-> +# müssen getrennt übergeben werden: noms() und stds() # <5-> +# # <5-> +# (4) die Darstellung der Messwerte im Plot wird durch errorbar() ersetzt, # <5-> +# um die Unsicherheiten anzeigen zu können # <5-> +# # <5-> +# In der Aufgabe 3-curve_fit muss eine Funktion ucurve_fit geschrieben werden, # <5-> +# die die scipy Funktion curve_fit verwendet, die aber den Umgang mit den # <5-> +# Unsicherheiten abstrahiert, sodass man das nicht jedes Mal aufs neue machen muss. # <5-> + # <2-> +def fit_g_ball(h, g, t0): # <5-> + return np.sqrt(7/5 * 1/h * 2* noms(l)**2/g) + t0 # <5-> + # <2-> +def fit_g_cylinder(h, g, t0): # <5-> + return np.sqrt((3 + noms(ri_c**2/ro_c**2)) * noms(l)**2/g * 1/h) + t0 # <5-> + # <2-> + # <2-> + # <2-> # Erklärung: # <4-4> # Hier ist Vorsicht geboten, da die Fit-Funktion und Messwerte zusammen passen müssen # <4-4> # an solchen Stellen zahlt sich eine konsistente Benennung aus. # <4-4> -# Berechnung der Fitparameter für die Kugel # <4-10> - # <2-10> +# Berechnung der Fitparameter für die Kugel # <4-> + # <2-> params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> - # <2-10> - # <2-10> +params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> + # <2-> + # <2-> # Erklärung: # <4-4> # Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> -print("Fitparameter (Kugel)") # <4-10> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-10> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> -print("\n") # <4-10> - # <2-10> +print("Fitparameter (Kugel)") # <4-> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> +print("\n") # <4-> + # <2-> # Erklärung: # <3-3> # Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> # auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> # Der Bereich in dem diese Werte liegen entspricht, aber dem der Messwerte ca. [0.03, 0.33] # <3-3> -h_plot = np.linspace(0.03, 0.33, 205) # <3-10> - # <2-10> - # <2-10> +h_plot = np.linspace(0.03, 0.33, 205) # <3-> + # <2-> + # <2-> # Fit Parameter für den Zylinder # <4-4> -# Fitparameter für den Zylinder # <5-10> - # <2-10> - # <2-10> +# Fitparameter für den Zylinder # <5-> + # <2-> + # <2-> # Erklärung: # <3-3> # Erstellen einer figure mit einem subplot darin (1 Zeile x 1 Spalte an subplots) # <3-3> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-10> - # <2-10> - # <2-10> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-> + # <2-> + # <2-> # Erklärung: # <3-3> # Einstellung der Achsenbeschriftungen # <3-3> -ax.set_xlabel("$h$ / m") # <3-10> -ax.set_ylabel("$t$ / s") # <3-10> - # <2-10> - # <2-10> - # <2-10> +ax.set_xlabel("$h$ / m") # <3-> +ax.set_ylabel("$t$ / s") # <3-> + # <2-> + # <2-> + # <2-> # Erklärung: # <3-3> # Darstellen der Messwerte mit Legendeneintrag # <3-3> ax.plot(h_b_mean, t_b_mean, "k+", label="Daten: Kugel") # <3-4> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> - # <2-10> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-> + # <2-> # Erklärung: # <4-4> # Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> -ax.legend() # <3-10> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-> +ax.legend() # <3-> fig.savefig("plot_kugel.pdf") # <3-3> -fig.savefig("plot-g_kugel.pdf") # <4-10> - # <2-10> - # <2-10> +fig.savefig("plot-g_kugel.pdf") # <4-> + # <2-> + # <2-> # Erklärung: # <4-4> # Analog für die Messreihe des Zylinders # <4-4> # Achtung! Copy-and-paste ist natürlich gängige Praxis, # <4-4> # aber alle Variablen müssen angepasst werden. # <4-4> - # <2-10> -# Berechnung der Fitparameter für den Zylinder # <4-10> + # <2-> +# Berechnung der Fitparameter für den Zylinder # <4-> params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> - # <2-10> - # <2-10> -print("Fitparameter (Zylinder)") # <4-10> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-10> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> -print("\n") # <4-10> - # <2-10> - # <2-10> -fig, ax = plt.subplots(1, 1, layout="constrained") # <3-10> - # <2-10> -ax.set_xlabel("$h$ / m") # <3-10> -ax.set_ylabel("$t$ / s") # <3-10> - # <2-10> - # <2-10> +params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> + # <2-> + # <2-> +print("Fitparameter (Zylinder)") # <4-> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> +print("\n") # <4-> + # <2-> + # <2-> +fig, ax = plt.subplots(1, 1, layout="constrained") # <3-> + # <2-> +ax.set_xlabel("$h$ / m") # <3-> +ax.set_ylabel("$t$ / s") # <3-> + # <2-> + # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-10> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-> ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-10> -ax.legend() # <3-10> +ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-> +ax.legend() # <3-> fig.savefig("plot_zylinder.pdf") # <3-3> -fig.savefig("plot-g_zylinder.pdf") # <4-10> - # <2-10> - # <2-10> +fig.savefig("plot-g_zylinder.pdf") # <4-> + # <2-> + # <2-> # Erklärung: # <4-4> # Verwenden der physikalischen Konstanten aus scipy # <4-4> # hier: g # <4-4> # physical_constants enthält 3er-tuple, der erste Eintrag # <4-4> # der tuple ist der Wert der Konstante, deswegen [0] # <4-4> - # <2-10> - # <2-10> -def fit_I_ball(h, I, t0): # <4-10> - g = physical_constants["standard acceleration of gravity"][0] # <4-10> + # <2-> + # <2-> +def fit_I_ball(h, I, t0): # <4-> + g = physical_constants["standard acceleration of gravity"][0] # <4-> return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_b * r_b**2)) ) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-10> - # <2-10> - # <2-10> -def fit_I_cylinder(h, I, t0): # <4-10> - g = physical_constants["standard acceleration of gravity"][0] # <4-10> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_b * r_b)**2)) ) + t0 # <5-> + # <2-> + # <2-> +def fit_I_cylinder(h, I, t0): # <4-> + g = physical_constants["standard acceleration of gravity"][0] # <4-> return np.sqrt(2/g * 1/h * l**2 * (1 + I/(m_c * ro_c**2) )) + t0 # <4-4> - return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-10> - # <2-10> + return np.sqrt(2/g * 1/h * noms(l)**2 * (1 + I/(noms(m_c * ro_c**2)) )) + t0 # <5-> + # <2-> # Erklärung: # <4-4> # Durch den Fit wird diese Warnung auf das Terminal ausgegeben: # <4-4> # .../v16515/auswertung.py:197: RuntimeWarning: invalid value encountered in sqrt # <4-4> @@ -394,62 +394,62 @@ def fit_I_cylinder(h, I, t0): # bounds gibt den minimalen und den maximalen Wert für alle Parameter an, # <4-4> # und zwar zuerst alle Minima und dann alle Maxima, # <4-4> # in diesem konkreten Beispiel steht bounds also für: 0 < I < +np.inf und -np.inf < t0 < +np.inf # <4-4> - # <2-10> - # <2-10> -# Berechnung der Fitparameter für die Kugel # <4-10> + # <2-> + # <2-> +# Berechnung der Fitparameter für die Kugel # <4-> params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> - # <2-10> - # <2-10> -print("Fitparameter (Kugel)") # <4-10> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-10> - if name == "I": # <4-10> - value *= 10000 # <4-10> - uncertainty *= 10000 # <4-10> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> -print("\n") # <4-10> - # <2-10> - # <2-10> -fig, ax = plt.subplots(1, 1, layout="constrained") # <4-10> - # <2-10> -ax.set_xlabel("$h$ / m") # <4-10> -ax.set_ylabel("$t$ / s") # <4-10> - # <2-10> - # <2-10> +params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> + # <2-> + # <2-> +print("Fitparameter (Kugel)") # <4-> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-> + if name == "I": # <4-> + value *= 10000 # <4-> + uncertainty *= 10000 # <4-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> +print("\n") # <4-> + # <2-> + # <2-> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-> + # <2-> +ax.set_xlabel("$h$ / m") # <4-> +ax.set_ylabel("$t$ / s") # <4-> + # <2-> + # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> -ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-10> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-10> -ax.legend() # <4-10> -fig.savefig("plot-I_kugel.pdf") # <4-10> - # <2-10> - # <2-10> -# Berechnung der Fitparameter für den Zylinder # <4-10> +ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-> +ax.legend() # <4-> +fig.savefig("plot-I_kugel.pdf") # <4-> + # <2-> + # <2-> +# Berechnung der Fitparameter für den Zylinder # <4-> params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> - # <2-10> - # <2-10> -print("Fitparameter (Zylinder)") # <4-10> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> - # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-10> - if name == "I": # <4-10> - value *= 10000 # <4-10> - uncertainty *= 10000 # <4-10> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> -print("\n") # <4-10> - # <2-10> - # <2-10> - # <2-10> -fig, ax = plt.subplots(1, 1, layout="constrained") # <4-10> - # <2-10> -ax.set_xlabel("$h$ / m") # <4-10> -ax.set_ylabel("$t$ / s") # <4-10> - # <2-10> - # <2-10> +params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> + # <2-> + # <2-> +print("Fitparameter (Zylinder)") # <4-> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-> + if name == "I": # <4-> + value *= 10000 # <4-> + uncertainty *= 10000 # <4-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> +print("\n") # <4-> + # <2-> + # <2-> + # <2-> +fig, ax = plt.subplots(1, 1, layout="constrained") # <4-> + # <2-> +ax.set_xlabel("$h$ / m") # <4-> +ax.set_ylabel("$t$ / s") # <4-> + # <2-> + # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <4-4> -ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-10> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-10> -ax.legend() # <4-10> -fig.savefig("plot-I_zylinder.pdf") # <4-10> +ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-> +ax.legend() # <4-> +fig.savefig("plot-I_zylinder.pdf") # <4-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template index d5f30056..b2214cfd 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template @@ -1,99 +1,99 @@ -\section{Auswertung} % <7-10> -\label{sec:Auswertung} % <9-10> -Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-10> -\begin{align} % <8-10> - \label{eq:physical-properties} % <9-10> - m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-10> - r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-10> - r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-10> - m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-10> - r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-10> - r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-10> -\end{align} % <8-10> -Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-10> -\begin{align} % <8-10> - \label{eq:moments-inertia} % <8-10> - I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-10> - I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <10-10> -\end{align} % <8-10> -Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-10> -Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-10> +\section{Auswertung} % <7-> +\label{sec:Auswertung} % <9-> +Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-> +\begin{align} % <8-> + \label{eq:physical-properties} % <9-> + m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-> + r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-> + r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-> + m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-> + r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-> + r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-> +\end{align} % <8-> +Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-> +\begin{align} % <8-> + \label{eq:moments-inertia} % <8-> + I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-> + I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <10-> +\end{align} % <8-> +Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-> +Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-> dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> -dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-10> -berechnet % <7-10> -\begin{equation*} % <8-10> - t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-10> -\end{equation*} % <8-10> - % <7-10> -\begin{table} % <9-10> - \centering % <9-10> - \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-10> - \label{tab:all-measurements} % <9-10> - \begin{tblr}{ % <9-10> - colspec = { % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=4.0] % <9-10> - S[table-format=1.0] % <9-10> - S[table-format=1.3] % <9-10> - S[table-format=1.3] % <9-10> - }, % <9-10> - row{1} = {guard}, % <9-10> - row{2} = {guard, mode=math}, % <9-10> - vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-10> - } % <9-10> - \toprule % <9-10> - & % <9-10> - \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-10> - \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-10> - \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-10> - h \mathbin{/} \unit{\meter} &% % <9-10> - \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> - \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> - \SetCell[c=2]{c} F_\text{i} & &% % <9-10> - \SetCell[c=2]{c} F_\text{f} & &% % <9-10> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> - \midrule % <9-10> - 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-10> - 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-10> - 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-10> - 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-10> - 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-10> - 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-10> - 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-10> - 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-10> - 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-10> - 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-10> - 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-10> - 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-10> - 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-10> - 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-10> - 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-10> - 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-10> - 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-10> - 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-10> - \bottomrule % <9-10> - \end{tblr} % <9-10> - \input{build/table_all-measurements.tex} % <10-10> -\end{table} % <9-10> - % <7-10> -Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-10> -in \autoref{tab:averaged-measurements}. Diese Werte werden für die folgenden % <9-10> -Auswertungsschritte verwendet. % <9-10> - % <7-10> -\begin{table} % <9-10> - \centering % <9-10> - \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-10> - \label{tab:averaged-measurements} % <9-10> - % <9-10> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-> +berechnet % <7-> +\begin{equation*} % <8-> + t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-> +\end{equation*} % <8-> + % <7-> +\begin{table} % <9-> + \centering % <9-> + \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-> + \label{tab:all-measurements} % <9-> + \begin{tblr}{ % <9-> + colspec = { % <9-> + S[table-format=1.3] % <9-> + S[table-format=4.0] % <9-> + S[table-format=1.0] % <9-> + S[table-format=4.0] % <9-> + S[table-format=1.0] % <9-> + S[table-format=1.3] % <9-> + S[table-format=1.3] % <9-> + S[table-format=4.0] % <9-> + S[table-format=1.0] % <9-> + S[table-format=4.0] % <9-> + S[table-format=1.0] % <9-> + S[table-format=1.3] % <9-> + S[table-format=1.3] % <9-> + }, % <9-> + row{1} = {guard}, % <9-> + row{2} = {guard, mode=math}, % <9-> + vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-> + } % <9-> + \toprule % <9-> + & % <9-> + \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-> + \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-> + \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-> + h \mathbin{/} \unit{\meter} &% % <9-> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-> + \SetCell[c=2]{c} F_\text{i} & &% % <9-> + \SetCell[c=2]{c} F_\text{f} & &% % <9-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-> + \midrule % <9-> + 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-> + 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-> + 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-> + 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-> + 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-> + 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-> + 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-> + 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-> + 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-> + 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-> + 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-> + 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-> + 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-> + 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-> + 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-> + 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-> + 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-> + 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-> + \bottomrule % <9-> + \end{tblr} % <9-> + \input{build/table_all-measurements.tex} % <10-> +\end{table} % <9-> + % <7-> +Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-> +in \autoref{tab:averaged-measurements}. Diese Werte werden für die folgenden % <9-> +Auswertungsschritte verwendet. % <9-> + % <7-> +\begin{table} % <9-> + \centering % <9-> + \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-> + \label{tab:averaged-measurements} % <9-> + % <9-> \begin{tblr}{ % <9-9> colspec = { % <9-9> S[table-format=1.3] % <9-9> @@ -123,80 +123,80 @@ Auswertungsschritte verwendet. 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-9> \bottomrule % <9-9> \end{tblr} % <9-9> - \input{build/table_averaged-measurements.tex} % <10-10> -\end{table} % <9-10> - % <7-10> -\subsection{Bestimmung der Fallbeschleunigung} % <7-10> - % <7-10> -Für die Bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> -\eqref{eq:fit-function-g-ball} respektive \eqref{eq:fit-function-g-cylinder} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> -angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-g-ball} % <9-10> -und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-g_kugel.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-10> - \label{fig:fit-g-ball} % <9-10> -\end{figure} % <9-10> - % <9-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-g_zylinder.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-10> - \label{fig:fit-g-cylinder} % <9-10> -\end{figure} % <9-10> - % <7-10> -Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> -\begin{align} % <8-10> - \label{eq:parameters-g_ball} % <8-10> - g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> - g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <10-10> -\intertext{und für den Zylinder} % <8-10> - \label{eq:parameters-g_cylinder} % <8-10> - g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> - g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <10-10> -\end{align} % <8-10> - % <7-10> -\subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-10> - % <7-10> -Für die bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-10> -\eqref{eq:fit-function-I} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-10> -angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-I-ball} % <9-10> -und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <9-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-I_kugel.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-10> - \label{fig:fit-I-ball} % <9-10> -\end{figure} % <9-10> - % <7-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \includegraphics{plot-I_zylinder.pdf} % <9-10> - \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-10> - zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-10> - Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-10> - \label{fig:fit-I-cylinder} % <9-10> -\end{figure} % <9-10> - % <7-10> -Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-10> -\begin{align} % <8-10> - \label{eq:parameters-I_ball} % <8-10> - I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> - I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <10-10> - \intertext{und für den Zylinder} % <8-10> - \label{eq:parameters-I_cylinder} % <8-10> - I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared} & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> - I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <10-10> -\end{align} % <8-10> + \input{build/table_averaged-measurements.tex} % <10-> +\end{table} % <9-> + % <7-> +\subsection{Bestimmung der Fallbeschleunigung} % <7-> + % <7-> +Für die Bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-> +\eqref{eq:fit-function-g-ball} respektive \eqref{eq:fit-function-g-cylinder} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-g-ball} % <9-> +und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. % <9-> + % <7-> +\begin{figure} % <9-> + \centering % <9-> + \includegraphics{plot-g_kugel.pdf} % <9-> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für die Kugel, % <9-> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-ball} für die Bestimmung der Fallbeschleunigung $g$. % <9-> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_ball} angegeben.} % <9-> + \label{fig:fit-g-ball} % <9-> +\end{figure} % <9-> + % <9-> +\begin{figure} % <9-> + \centering % <9-> + \includegraphics{plot-g_zylinder.pdf} % <9-> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-g-cylinder} für die Bestimmung der Fallbeschleunigung $g$. % <9-> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-g_cylinder} angegeben.} % <9-> + \label{fig:fit-g-cylinder} % <9-> +\end{figure} % <9-> + % <7-> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> +\begin{align} % <8-> + \label{eq:parameters-g_ball} % <8-> + g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> + g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <10-> +\intertext{und für den Zylinder} % <8-> + \label{eq:parameters-g_cylinder} % <8-> + g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> + g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <10-> +\end{align} % <8-> + % <7-> +\subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-> + % <7-> +Für die bestimmung der Fallbeschleunigung wurden eine Ausgleichsfunktion der Form % <7-> +\eqref{eq:fit-function-I} an die Messwerte aus \autoref{tab:averaged-measurements} % <9-> +angepasst. Die Daten und Ausgleichsfunktion sind für die Kugel in \autoref{fig:fit-I-ball} % <9-> +und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. % <9-> + % <7-> +\begin{figure} % <9-> + \centering % <9-> + \includegraphics{plot-I_kugel.pdf} % <9-> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Kugel, % <9-> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{K}$. % <9-> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_ball} angegeben.} % <9-> + \label{fig:fit-I-ball} % <9-> +\end{figure} % <9-> + % <7-> + % <7-> +\begin{figure} % <9-> + \centering % <9-> + \includegraphics{plot-I_zylinder.pdf} % <9-> + \caption{Dargestellt sind die für je eine Höhe gemittelten Messwerte aus \autoref{tab:averaged-measurements} für den Zylinder, % <9-> + zusammen mit einer Ausgleichsfunktion der Form \eqref{eq:fit-function-I} für die Bestimmung des Trägheitsmoments $I_\text{Z}$. % <9-> + Die Parameter der Ausgleichsrechnung sind in \eqref{eq:parameters-I_cylinder} angegeben.} % <9-> + \label{fig:fit-I-cylinder} % <9-> +\end{figure} % <9-> + % <7-> +Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> +\begin{align} % <8-> + \label{eq:parameters-I_ball} % <8-> + I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> + I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <10-> + \intertext{und für den Zylinder} % <8-> + \label{eq:parameters-I_cylinder} % <8-> + I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared} & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> + I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <10-> +\end{align} % <8-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template index 3045bd7b..666da842 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template @@ -1,44 +1,44 @@ -\section{Diskussion} % <7-10> -\label{sec:Diskussion} % <9-10> - % <7-10> -TODO: Diskussion fertig machen ;-) % <7-10> - % <7-10> -Notizen: % <7-10> - % <7-10> -Bestimmung von g: % <7-10> - % <7-10> -Fits % <7-10> - % <7-10> -\autoref{fig:fit-g-ball} % <9-10> - % <7-10> -\autoref{fig:fit-g-cylinder} % <9-10> - % <7-10> -passen zu den Messwerten. % <7-10> - % <7-10> - % <7-10> -Die Fit parameter % <7-10> -\eqref{eq:parameters-g_ball} % <8-10> -\eqref{eq:parameters-g_cylinder} % <8-10> - % <7-10> -passen zum theoretischen Wert $\qty{9.81}{\meter\per\second\squared}$ % <8-10> -passen zum theoretischen Wert \input{theoretical-g.tex} % <10-10> -=> TODO: Abweichungen berechnen % <7-10> - % <7-10> -Die übereinstimmung der Fitparameter t0, weist auf eine systematische Unsicherheit % <7-10> -=> TODO: Berechnung des Offsets in Frames % <7-10> - % <7-10> -Analog für die Bestimmung von I: % <7-10> - % <7-10> -Fits: % <7-10> - % <7-10> -\autoref{fig:fit-I-ball} % <9-10> - % <7-10> -\autoref{fig:fit-I-cylinder} % <9-10> - % <7-10> -\eqref{eq:parameters-I_ball} % <9-10> - % <9-10> -\eqref{eq:parameters-I_cylinder} % <9-10> - % <9-10> -\eqref{eq:moments-inertia} % <9-10> - % <7-10> -=> TODO: Abweichungen berechnen % <7-10> +\section{Diskussion} % <7-> +\label{sec:Diskussion} % <9-> + % <7-> +TODO: Diskussion fertig machen ;-) % <7-> + % <7-> +Notizen: % <7-> + % <7-> +Bestimmung von g: % <7-> + % <7-> +Fits % <7-> + % <7-> +\autoref{fig:fit-g-ball} % <9-> + % <7-> +\autoref{fig:fit-g-cylinder} % <9-> + % <7-> +passen zu den Messwerten. % <7-> + % <7-> + % <7-> +Die Fit parameter % <7-> +\eqref{eq:parameters-g_ball} % <8-> +\eqref{eq:parameters-g_cylinder} % <8-> + % <7-> +passen zum theoretischen Wert $\qty{9.81}{\meter\per\second\squared}$ % <8-> +passen zum theoretischen Wert \input{theoretical-g.tex} % <10-> +=> TODO: Abweichungen berechnen % <7-> + % <7-> +Die übereinstimmung der Fitparameter t0, weist auf eine systematische Unsicherheit % <7-> +=> TODO: Berechnung des Offsets in Frames % <7-> + % <7-> +Analog für die Bestimmung von I: % <7-> + % <7-> +Fits: % <7-> + % <7-> +\autoref{fig:fit-I-ball} % <9-> + % <7-> +\autoref{fig:fit-I-cylinder} % <9-> + % <7-> +\eqref{eq:parameters-I_ball} % <9-> + % <9-> +\eqref{eq:parameters-I_cylinder} % <9-> + % <9-> +\eqref{eq:moments-inertia} % <9-> + % <7-> +=> TODO: Abweichungen berechnen % <7-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template index 540cac25..633327b7 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template @@ -1,22 +1,22 @@ -\section{Durchführung} % <7-10> -\label{sec:Durchführung} % <9-10> - % <7-10> -Wie in der Anleitung~\cite{V16516} beschrieben, wird der Versuch wie folgt durchgeführt. % <9-10> - % <9-10> -Wie einst von Galileo Galilei \cite[232]{galilei1623} persönlich, wurden im hier beschriebenen Versuch % <9-10> -Objekte (eine Kugel und Holzylinder in Form eines Glases) eine schiefe Ebene hinab gerollt. % <9-10> - % <9-10> -Notiert wird dabei die Starthöhen $h$. Der Prozess des Herabrollens wird mit einer Kamera % <8-10> -aufgezeichnet, um aus der Zeit $t$ bis zum erreichen des Endes der schiefen Ebene möglichst genau % <8-10> -aus den Einzelbildern (frames) des Films ablesen zu können. % <8-10> - % <7-10> -Die aufgenommenen Messdaten werden für zwei unabhängige Zwecke verwendet: % <7-10> - % <7-10> -\begin{enumerate} % <8-10> - \item {Bestimmung der Fallbeschleunigung $g$, dafür werden % <8-10> - die theoretischen Trägheitsmomente angenommen.} % <8-10> - \item {Bestimmung der Trägheitsmomente $I$ der beiden Objekte unter Annahme der theoretischen % <8-10> - Fallbeschleunigung.} % <8-10> -\end{enumerate} % <8-10> +\section{Durchführung} % <7-> +\label{sec:Durchführung} % <9-> + % <7-> +Wie in der Anleitung~\cite{V16516} beschrieben, wird der Versuch wie folgt durchgeführt. % <9-> + % <9-> +Wie einst von Galileo Galilei \cite[232]{galilei1623} persönlich, wurden im hier beschriebenen Versuch % <9-> +Objekte (eine Kugel und Holzylinder in Form eines Glases) eine schiefe Ebene hinab gerollt. % <9-> + % <9-> +Notiert wird dabei die Starthöhen $h$. Der Prozess des Herabrollens wird mit einer Kamera % <8-> +aufgezeichnet, um aus der Zeit $t$ bis zum erreichen des Endes der schiefen Ebene möglichst genau % <8-> +aus den Einzelbildern (frames) des Films ablesen zu können. % <8-> + % <7-> +Die aufgenommenen Messdaten werden für zwei unabhängige Zwecke verwendet: % <7-> + % <7-> +\begin{enumerate} % <8-> + \item {Bestimmung der Fallbeschleunigung $g$, dafür werden % <8-> + die theoretischen Trägheitsmomente angenommen.} % <8-> + \item {Bestimmung der Trägheitsmomente $I$ der beiden Objekte unter Annahme der theoretischen % <8-> + Fallbeschleunigung.} % <8-> +\end{enumerate} % <8-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template index 3362124f..fd47cce2 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template @@ -1,139 +1,139 @@ -\documentclass[ % <7-10> - bibliography=totoc, % Literatur im Inhaltsverzeichnis % <9-10> - captions=tableheading, % Tabellenüberschriften % <9-10> - titlepage=firstiscover, % Titelseite ist Deckblatt % <7-10> -]{scrartcl} % <7-10> - % <7-10> -% Paket float verbessern % <7-10> -\usepackage{scrhack} % <9-10> - % <7-10> -% Warnung, falls nochmal kompiliert werden muss % <7-10> -\usepackage[aux]{rerunfilecheck} % <7-10> - % <7-10> -% unverzichtbare Mathe-Befehle % <7-10> -\usepackage{amsmath} % <7-10> -% viele Mathe-Symbole % <7-10> -\usepackage{amssymb} % <7-10> -% Erweiterungen für amsmath % <7-10> -\usepackage{mathtools} % <7-10> - % <7-10> -% Fonteinstellungen % <7-10> -\usepackage{fontspec} % <7-10> -% Latin Modern Fonts werden automatisch geladen % <7-10> -% Alternativ zum Beispiel: % <7-10> -%\setromanfont{Libertinus Serif} % <7-10> -%\setsansfont{Libertinus Sans} % <7-10> -%\setmonofont{Libertinus Mono} % <7-10> - % <7-10> -% Wenn man andere Schriftarten gesetzt hat, % <7-10> -% sollte man das Seiten-Layout neu berechnen lassen % <7-10> -\recalctypearea{} % <7-10> - % <7-10> -% deutsche Spracheinstellungen % <7-10> -\usepackage[ngerman]{babel} % <7-10> - % <7-10> - % <7-10> -\usepackage[ % <7-10> - math-style=ISO, % ┐ % <7-10> - bold-style=ISO, % │ % <7-10> - sans-style=italic, % │ ISO-Standard folgen % <7-10> - nabla=upright, % │ % <7-10> - partial=upright, % │ % <7-10> - mathrm=sym, % ┘ % <7-10> - warnings-off={ % ┐ % <7-10> - mathtools-colon, % │ unnötige Warnungen ausschalten % <7-10> - mathtools-overbracket, % │ % <7-10> - }, % ┘ % <7-10> -]{unicode-math} % <7-10> - % <7-10> -% traditionelle Fonts für Mathematik % <7-10> -\setmathfont{Latin Modern Math} % <7-10> -% Alternativ zum Beispiel: % <7-10> -%\setmathfont{Libertinus Math} % <7-10> - % <7-10> -\setmathfont{XITS Math}[range={scr, bfscr}] % <7-10> -\setmathfont{XITS Math}[range={cal, bfcal}, StylisticSet=1] % <7-10> - % <7-10> -% Zahlen und Einheiten % <8-10> -\usepackage[ % <8-10> - locale=DE, % deutsche Einstellungen % <8-10> - separate-uncertainty=true, % immer Unsicherheit mit \pm % <8-10> - per-mode=symbol-or-fraction, % / in inline math, fraction in display math % <8-10> -]{siunitx} % <8-10> - % <7-10> -% chemische Formeln % <8-10> -\usepackage[ % <8-10> - version=4, % <8-10> - math-greek=default, % ┐ mit unicode-math zusammenarbeiten % <8-10> - text-greek=default, % ┘ % <8-10> -]{mhchem} % <8-10> - % <7-10> -% richtige Anführungszeichen % <7-10> -\usepackage[autostyle]{csquotes} % <7-10> - % <7-10> -% schöne Brüche im Text % <7-10> -\usepackage{xfrac} % <8-10> - % <7-10> -% Standardplatzierung für Floats einstellen % <9-10> -\usepackage{float} % <9-10> -\floatplacement{figure}{htbp} % <9-10> -\floatplacement{table}{htbp} % <9-10> - % <7-10> -% Floats innerhalb einer Section halten % <9-10> -\usepackage[ % <9-10> - section, % Floats innerhalb der Section halten % <9-10> - below, % unterhalb der Section aber auf der selben Seite ist ok % <9-10> -]{placeins} % <9-10> - % <7-10> -% Seite drehen für breite Tabellen: landscape Umgebung % <9-10> -\usepackage{pdflscape} % <9-10> - % <7-10> -% Captions schöner machen. % <9-10> -\usepackage[ % <9-10> - labelfont=bf, % Tabelle x: Abbildung y: ist jetzt fett % <9-10> - font=small, % Schrift etwas kleiner als Dokument % <9-10> - width=0.9\textwidth, % maximale Breite einer Caption schmaler % <9-10> -]{caption} % <9-10> -% subfigure, subtable, subref % <9-10> -\usepackage{subcaption} % <9-10> - % <7-10> - % <7-10> -% Grafiken können eingebunden werden % <7-10> -\usepackage{graphicx} % <9-10> - % <9-10> -% schöne Tabellen % <9-10> -\usepackage{tabularray} % <9-10> -\UseTblrLibrary{booktabs,siunitx} % <9-10> - % <7-10> -% Verbesserungen am Schriftbild % <7-10> -\usepackage{microtype} % <10-10> - % <7-10> -% Literaturverzeichnis % <9-10> -\usepackage[ % <9-10> - backend=biber, % <9-10> -]{biblatex} % <9-10> -% Quellendatenbank % <9-10> -\addbibresource{lit.bib} % <9-10> -\addbibresource{programme.bib} % <9-10> - % <7-10> -% Hyperlinks im Dokument % <7-10> -\usepackage[ % <7-10> - german, % <7-10> - unicode, % Unicode in PDF-Attributen erlauben % <7-10> - pdfusetitle, % Titel, Autoren und Datum als PDF-Attribute % <7-10> - pdfcreator={}, % ┐ PDF-Attribute säubern % <7-10> - pdfproducer={}, % ┘ % <7-10> -]{hyperref} % <7-10> -% erweiterte Bookmarks im PDF % <7-10> -\usepackage{bookmark} % <7-10> - % <7-10> -% Trennung von Wörtern mit Strichen % <7-10> -\usepackage[shortcuts]{extdash} % <7-10> - % <7-10> -\author{% % <7-10> - Joshua Luckey\\% % <7-10> - \href{mailto:joshua.luckey@udo.edu}{joshua.luckey@udo.edu}% % <7-10> - \and% % <7-10> - PeP et al.: Toolbox Workshop\\% % <7-10> - \href{mailto:pep-toolbox.physik@lists.tu-dortmund.de}{pep-toolbox.physik@lists.tu-dortmund.de} % <7-10> -} % <7-10> +\documentclass[ % <7-> + bibliography=totoc, % Literatur im Inhaltsverzeichnis % <9-> + captions=tableheading, % Tabellenüberschriften % <9-> + titlepage=firstiscover, % Titelseite ist Deckblatt % <7-> +]{scrartcl} % <7-> + % <7-> +% Paket float verbessern % <7-> +\usepackage{scrhack} % <9-> + % <7-> +% Warnung, falls nochmal kompiliert werden muss % <7-> +\usepackage[aux]{rerunfilecheck} % <7-> + % <7-> +% unverzichtbare Mathe-Befehle % <7-> +\usepackage{amsmath} % <7-> +% viele Mathe-Symbole % <7-> +\usepackage{amssymb} % <7-> +% Erweiterungen für amsmath % <7-> +\usepackage{mathtools} % <7-> + % <7-> +% Fonteinstellungen % <7-> +\usepackage{fontspec} % <7-> +% Latin Modern Fonts werden automatisch geladen % <7-> +% Alternativ zum Beispiel: % <7-> +%\setromanfont{Libertinus Serif} % <7-> +%\setsansfont{Libertinus Sans} % <7-> +%\setmonofont{Libertinus Mono} % <7-> + % <7-> +% Wenn man andere Schriftarten gesetzt hat, % <7-> +% sollte man das Seiten-Layout neu berechnen lassen % <7-> +\recalctypearea{} % <7-> + % <7-> +% deutsche Spracheinstellungen % <7-> +\usepackage[ngerman]{babel} % <7-> + % <7-> + % <7-> +\usepackage[ % <7-> + math-style=ISO, % ┐ % <7-> + bold-style=ISO, % │ % <7-> + sans-style=italic, % │ ISO-Standard folgen % <7-> + nabla=upright, % │ % <7-> + partial=upright, % │ % <7-> + mathrm=sym, % ┘ % <7-> + warnings-off={ % ┐ % <7-> + mathtools-colon, % │ unnötige Warnungen ausschalten % <7-> + mathtools-overbracket, % │ % <7-> + }, % ┘ % <7-> +]{unicode-math} % <7-> + % <7-> +% traditionelle Fonts für Mathematik % <7-> +\setmathfont{Latin Modern Math} % <7-> +% Alternativ zum Beispiel: % <7-> +%\setmathfont{Libertinus Math} % <7-> + % <7-> +\setmathfont{XITS Math}[range={scr, bfscr}] % <7-> +\setmathfont{XITS Math}[range={cal, bfcal}, StylisticSet=1] % <7-> + % <7-> +% Zahlen und Einheiten % <8-> +\usepackage[ % <8-> + locale=DE, % deutsche Einstellungen % <8-> + separate-uncertainty=true, % immer Unsicherheit mit \pm % <8-> + per-mode=symbol-or-fraction, % / in inline math, fraction in display math % <8-> +]{siunitx} % <8-> + % <7-> +% chemische Formeln % <8-> +\usepackage[ % <8-> + version=4, % <8-> + math-greek=default, % ┐ mit unicode-math zusammenarbeiten % <8-> + text-greek=default, % ┘ % <8-> +]{mhchem} % <8-> + % <7-> +% richtige Anführungszeichen % <7-> +\usepackage[autostyle]{csquotes} % <7-> + % <7-> +% schöne Brüche im Text % <7-> +\usepackage{xfrac} % <8-> + % <7-> +% Standardplatzierung für Floats einstellen % <9-> +\usepackage{float} % <9-> +\floatplacement{figure}{htbp} % <9-> +\floatplacement{table}{htbp} % <9-> + % <7-> +% Floats innerhalb einer Section halten % <9-> +\usepackage[ % <9-> + section, % Floats innerhalb der Section halten % <9-> + below, % unterhalb der Section aber auf der selben Seite ist ok % <9-> +]{placeins} % <9-> + % <7-> +% Seite drehen für breite Tabellen: landscape Umgebung % <9-> +\usepackage{pdflscape} % <9-> + % <7-> +% Captions schöner machen. % <9-> +\usepackage[ % <9-> + labelfont=bf, % Tabelle x: Abbildung y: ist jetzt fett % <9-> + font=small, % Schrift etwas kleiner als Dokument % <9-> + width=0.9\textwidth, % maximale Breite einer Caption schmaler % <9-> +]{caption} % <9-> +% subfigure, subtable, subref % <9-> +\usepackage{subcaption} % <9-> + % <7-> + % <7-> +% Grafiken können eingebunden werden % <7-> +\usepackage{graphicx} % <9-> + % <9-> +% schöne Tabellen % <9-> +\usepackage{tabularray} % <9-> +\UseTblrLibrary{booktabs,siunitx} % <9-> + % <7-> +% Verbesserungen am Schriftbild % <7-> +\usepackage{microtype} % <10-> + % <7-> +% Literaturverzeichnis % <9-> +\usepackage[ % <9-> + backend=biber, % <9-> +]{biblatex} % <9-> +% Quellendatenbank % <9-> +\addbibresource{lit.bib} % <9-> +\addbibresource{programme.bib} % <9-> + % <7-> +% Hyperlinks im Dokument % <7-> +\usepackage[ % <7-> + german, % <7-> + unicode, % Unicode in PDF-Attributen erlauben % <7-> + pdfusetitle, % Titel, Autoren und Datum als PDF-Attribute % <7-> + pdfcreator={}, % ┐ PDF-Attribute säubern % <7-> + pdfproducer={}, % ┘ % <7-> +]{hyperref} % <7-> +% erweiterte Bookmarks im PDF % <7-> +\usepackage{bookmark} % <7-> + % <7-> +% Trennung von Wörtern mit Strichen % <7-> +\usepackage[shortcuts]{extdash} % <7-> + % <7-> +\author{% % <7-> + Joshua Luckey\\% % <7-> + \href{mailto:joshua.luckey@udo.edu}{joshua.luckey@udo.edu}% % <7-> + \and% % <7-> + PeP et al.: Toolbox Workshop\\% % <7-> + \href{mailto:pep-toolbox.physik@lists.tu-dortmund.de}{pep-toolbox.physik@lists.tu-dortmund.de} % <7-> +} % <7-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 7b80cab6..6e1374bf 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -1,74 +1,74 @@ -\section{Theorie} % <7-10> -\label{sec:Theorie} % <9-10> - % <7-10> -Wie in der Abbildung \autoref{fig:experimental-setup} veranschaulicht, beginnen die Objekte % <9-10> -in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <9-10> - % <7-10> -\begin{figure} % <9-10> - \centering % <9-10> - \begin{tikzpicture}[scale=3] % <10-10> - \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-10> - \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-10> - \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <10-10> - \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <10-10> - \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <10-10> - \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <10-10> - \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <10-10> - \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <10-10> - \end{tikzpicture} % <10-10> - \caption{Schematische Darstellung des Versuchsaufbaus. Das runde Objekt (Kugel oder Zylinder) wird in der Höhe $h$ % <9-10> - auf eine schiefe Ebene gelegt, sodass es aus der Ruhe herabrollt. Die Bewegung ist beschleunigt, sodass sowohl % <9-10> - die Geschwindigkeit $\vec{v}(t)$ sowie die Winkelgeschwindigkeit $\omega(t)$ nicht konstant sind.} % <9-10> - \label{fig:experimental-setup} % <9-10> -\end{figure} % <9-10> - % <7-10> -Zwischen Ebene und Objekten wirkt eine nicht zu vernachlässigende Reibung, wodurch die % <7-10> -Objekte nach dem loslassen in Rotation versetzt werden, also tatsächlich herabrollen. % <7-10> -Thermische Reibungsverluste werden jedoch vernächlässigt, sodass Energieerhaltung % <7-10> -angenommen werden kann. Nach dieser gilt % <7-10> - % <7-10> -\begin{align*} % <8-10> -E^\text{pot}_\text{i} &= E^\text{kin}_\text{f} + E^\text{rot}_\text{f} \\ % <8-10> -mgh &= \frac{m}{2}v^2 + \frac{I}{2}\omega^2 \quad\big|\,\omega = \frac{v}{r} \\ % <8-10> -mgh &= \frac{m}{2}v^2 + \frac{I}{2}\frac{v^2}{r^2}\quad\big|\, :mgh \\ % <8-10> -1 &= \frac{v^2}{2gh} \left(1 + \frac{I}{mr^2} \right)\\ % <8-10> - \intertext{aus der Kinematik~\cite{kuypers2016klassische} ist bekannt, dass die Endgeschwindigkeit einer % <8-10> -beschleunigten Bewegung (in der Zeit $t$, entlang einer Strecke $l$) $v = \frac{2l}{t}$ ist. % <8-10> -Es gilt also} % <8-10> -1 &= \left(\frac{2l}{t}\right)^2 \frac{1}{2gh} \left(1 + \frac{I}{mr^2} \right)\quad\big|\, \cdot t^2 \\ % <8-10> -\addtocounter{equation}{1} % <8-10> -t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right) % <8-10> -\label{eq:tsquared}\tag{\theequation} % <9-10> -\end{align*} % <8-10> - % <7-10> -Aus \eqref{eq:tsquared} ergeben sich dann die jeweiligen Ausgleichsfunktionen für beide Versuchsteile. % <9-10> - % <7-10> -Für die Bestimmung der Trägheitsmomente wird nur noch die Quadratwurzel von \eqref{eq:tsquared} % <7-10> -berechnet und ein Startzeit als Parameter hinzugefügt, % <7-10> - % <7-10> -\begin{equation} % <8-10> -t(h) = \sqrt{\frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)} + t_0. % <8-10> -\label{eq:fit-function-I} % <9-10> -\end{equation} % <8-10> - % <7-10> -Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <7-10> -Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <7-10> - % <7-10> -Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-10> -für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-10> -\begin{align*} % <7-10> - I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2), % <7-10> -\end{align*} % <7-10> -ergeben sich die folgenden Ausgleichsfunktionen % <7-10> - % <7-10> -\begin{align} % <8-10> -t_\text{K}(h) &= \sqrt{\frac{2l^2}{gh} \left(\frac{7}{5}\right)} + t_0 % <8-10> -\label{eq:fit-function-g-ball} % <9-10> -% % <8-10> -\intertext{und} % <8-10> -% % <8-10> -t_\text{Z}(h) &= \sqrt{\frac{l^2}{gh} \left(3 + \left(\frac{r_{\text{Z},\text{innen}}}{r_{\text{Z},\text{außen}}}\right)^2 \right)} + t_0.% <8-10> -\label{eq:fit-function-g-cylinder} % <9-10> -\end{align} % <8-10> -Dabei sind in diesen Gleichungen $g$ und $t_0$ die Ausgleichsparameter. % <8-10> +\section{Theorie} % <7-> +\label{sec:Theorie} % <9-> + % <7-> +Wie in der Abbildung \autoref{fig:experimental-setup} veranschaulicht, beginnen die Objekte % <9-> +in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <9-> + % <7-> +\begin{figure} % <9-> + \centering % <9-> + \begin{tikzpicture}[scale=3] % <10-> + \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-> + \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-> + \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <10-> + \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <10-> + \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <10-> + \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <10-> + \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <10-> + \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <10-> + \end{tikzpicture} % <10-> + \caption{Schematische Darstellung des Versuchsaufbaus. Das runde Objekt (Kugel oder Zylinder) wird in der Höhe $h$ % <9-> + auf eine schiefe Ebene gelegt, sodass es aus der Ruhe herabrollt. Die Bewegung ist beschleunigt, sodass sowohl % <9-> + die Geschwindigkeit $\vec{v}(t)$ sowie die Winkelgeschwindigkeit $\omega(t)$ nicht konstant sind.} % <9-> + \label{fig:experimental-setup} % <9-> +\end{figure} % <9-> + % <7-> +Zwischen Ebene und Objekten wirkt eine nicht zu vernachlässigende Reibung, wodurch die % <7-> +Objekte nach dem loslassen in Rotation versetzt werden, also tatsächlich herabrollen. % <7-> +Thermische Reibungsverluste werden jedoch vernächlässigt, sodass Energieerhaltung % <7-> +angenommen werden kann. Nach dieser gilt % <7-> + % <7-> +\begin{align*} % <8-> +E^\text{pot}_\text{i} &= E^\text{kin}_\text{f} + E^\text{rot}_\text{f} \\ % <8-> +mgh &= \frac{m}{2}v^2 + \frac{I}{2}\omega^2 \quad\big|\,\omega = \frac{v}{r} \\ % <8-> +mgh &= \frac{m}{2}v^2 + \frac{I}{2}\frac{v^2}{r^2}\quad\big|\, :mgh \\ % <8-> +1 &= \frac{v^2}{2gh} \left(1 + \frac{I}{mr^2} \right)\\ % <8-> + \intertext{aus der Kinematik~\cite{kuypers2016klassische} ist bekannt, dass die Endgeschwindigkeit einer % <8-> +beschleunigten Bewegung (in der Zeit $t$, entlang einer Strecke $l$) $v = \frac{2l}{t}$ ist. % <8-> +Es gilt also} % <8-> +1 &= \left(\frac{2l}{t}\right)^2 \frac{1}{2gh} \left(1 + \frac{I}{mr^2} \right)\quad\big|\, \cdot t^2 \\ % <8-> +\addtocounter{equation}{1} % <8-> +t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right) % <8-> +\label{eq:tsquared}\tag{\theequation} % <9-> +\end{align*} % <8-> + % <7-> +Aus \eqref{eq:tsquared} ergeben sich dann die jeweiligen Ausgleichsfunktionen für beide Versuchsteile. % <9-> + % <7-> +Für die Bestimmung der Trägheitsmomente wird nur noch die Quadratwurzel von \eqref{eq:tsquared} % <7-> +berechnet und ein Startzeit als Parameter hinzugefügt, % <7-> + % <7-> +\begin{equation} % <8-> +t(h) = \sqrt{\frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)} + t_0. % <8-> +\label{eq:fit-function-I} % <9-> +\end{equation} % <8-> + % <7-> +Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <7-> +Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <7-> + % <7-> +Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-> +für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-> +\begin{align*} % <7-> + I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2), % <7-> +\end{align*} % <7-> +ergeben sich die folgenden Ausgleichsfunktionen % <7-> + % <7-> +\begin{align} % <8-> +t_\text{K}(h) &= \sqrt{\frac{2l^2}{gh} \left(\frac{7}{5}\right)} + t_0 % <8-> +\label{eq:fit-function-g-ball} % <9-> +% % <8-> +\intertext{und} % <8-> +% % <8-> +t_\text{Z}(h) &= \sqrt{\frac{l^2}{gh} \left(3 + \left(\frac{r_{\text{Z},\text{innen}}}{r_{\text{Z},\text{außen}}}\right)^2 \right)} + t_0.% <8-> +\label{eq:fit-function-g-cylinder} % <9-> +\end{align} % <8-> +Dabei sind in diesen Gleichungen $g$ und $t_0$ die Ausgleichsparameter. % <8-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template index 661b8fdf..f59a96d2 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template @@ -1,26 +1,27 @@ -\input{header.tex} % <7-10> -\usepackage{tikz} % <10-10> - % <7-10> -\subject{V16516} % <7-10> -\title{Die schiefe Ebene} % <7-10> -\date{% % <7-10> - Durchführung: 29.09.2023 % <7-10> - \hspace{3em} % <7-10> - Abgabe: 23.09.2024 % <7-10> -} % <7-10> - % <7-10> -\begin{document} % <7-10> - % <7-10> -\maketitle % <7-10> -\thispagestyle{empty} % <7-10> -\tableofcontents % <7-10> -\newpage % <7-10> - % <7-10> -\input{content/theorie.tex} % <7-10> -\input{content/durchfuehrung.tex} % <7-10> -\input{content/auswertung.tex} % <7-10> -\input{content/diskussion.tex} % <7-10> - % <7-10> -\printbibliography{} % <9-10> - % <9-10> -\end{document} % <7-10> +\input{header.tex} % <7-> + +\usepackage{tikz} % <10-> + % <7-> +\subject{V16516} % <7-> +\title{Die schiefe Ebene} % <7-> +\date{% % <7-> + Durchführung: 29.09.2023 % <7-> + \hspace{3em} % <7-> + Abgabe: 23.09.2024 % <7-> +} % <7-> + % <7-> +\begin{document} % <7-> + % <7-> +\maketitle % <7-> +\thispagestyle{empty} % <7-> +\tableofcontents % <7-> +\newpage % <7-> + % <7-> +\input{content/theorie.tex} % <7-> +\input{content/durchfuehrung.tex} % <7-> +\input{content/auswertung.tex} % <7-> +\input{content/diskussion.tex} % <7-> + % <7-> +\printbibliography{} % <9-> + % <9-> +\end{document} % <7-> From ebb3dca04b4e12b7024f0f97f6110556350097f9 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 10:27:11 +0200 Subject: [PATCH 37/80] changed required space to optional spaces --- exercises-toolbox/8-all/example-report/generate-step-files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index 43bad87b..c68ab5b5 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from collections.abc import Iterable -STEPRANGEREGEX = re.compile(r"(?:#|%)\s<(\d*)(-(\d*)|)>") +STEPRANGEREGEX = re.compile(r"(?:#|%)\s*<(\d*)(-(\d*)|)>") @dataclass class Templateline: From fa43d8ba5ea321fa18ed5902abd71dfe77c9b3d0 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 10:49:55 +0200 Subject: [PATCH 38/80] fixed regression introduced by the cleanup process internally the step numbers from the file now get mapped to indicies into the outputfiles list --- .../example-report/generate-step-files.py | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index c68ab5b5..10db2b45 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -11,7 +11,7 @@ class Templateline: linenumber: int line: str - step_range: Iterable + outputfile_index_range: Iterable def __str__(self): return f"{self.linenumber:>3} {self.line}" @@ -36,8 +36,7 @@ def setup_arg_parser(): help="Filepaths to the output files (you need to use one Option -o for each file). Hint: use -o=file{1,2,3} for example, to generate the multiple options.)") return parser -def parse_lines_and_stepranges(lines, max_upper_limit): - #step_ranges = [] +def parse_lines_and_stepranges(lines, start_step, end_step): template_lines = [] removed_lines = [] for i,l in enumerate(lines, start=1): @@ -52,27 +51,35 @@ def parse_lines_and_stepranges(lines, max_upper_limit): try: lower_limit = int(groups[0]) except ValueError: - raise ValueError(f"The pattern in line {i} of the template file has not starting step") - + raise ValueError(f"The pattern ({found.group()}) in line {i} of the template file has not starting step") + + + # The dash and second number can be omitted: # e.g. <4> is equivalent to <4-4> if (not groups[1]) and (groups[2] is None): - # The upper limit has to be increased by one to be inclusive as a range - step_limits = (lower_limit, lower_limit + 1) + # Since the end_step is calculated from the number of output files given + # the lower limit has to be changed to be less then the upper limit + step_limits = (lower_limit - start_step, lower_limit - start_step) # If the second number is omitted but the dash is not, the upper limit is the last step: # e.g. <4-> is equivalent to <4-10> if 10 output files are generated elif not groups[2]: - step_limits = (lower_limit, max_upper_limit + 1) + step_limits = (lower_limit - start_step, end_step) # both numbers are present in the pattern else: - step_limits = (lower_limit, int(groups[2]) + 1) + upper_limit = int(groups[2]) + # if upper and lower step are the same, both have to be reduced by start_step + if upper_limit == lower_limit: + upper_limit -= start_step + + step_limits = (lower_limit - start_step, upper_limit) - num_files_with_line = step_limits[1] - step_limits[0] - if num_files_with_line > max_upper_limit: - raise ValueError(f"The number of given output files is {max_upper_limit}," - f" but line {i} of the template file is expected to appear in {num_files_with_line} output files (pattern: {found.group()}).") + num_files_with_current_line = (step_limits[1] - step_limits[0]) + if num_files_with_current_line > end_step: + raise ValueError(f"The number of given output files is {end_step}," + f" but line {i} of the template file is expected to appear in {num_files_with_current_line} output files (pattern: {found.group()}).") # remove the steprange pattern and spaces between line content and pattern line_content = STEPRANGEREGEX.sub("", l).rstrip() @@ -83,12 +90,11 @@ def parse_lines_and_stepranges(lines, max_upper_limit): def split_stepfile_lines(template_lines, output_filepaths, start_step): # mapping the start_step to the first given output file - map_first_step = lambda step: step - (start_step - 1) lines_per_stepfile = defaultdict(list) for line in template_lines: - for step in line.step_range: - lines_per_stepfile[output_filepaths[map_first_step(step)-1]].append(line) + for step in line.outputfile_index_range: + lines_per_stepfile[output_filepaths[step]].append(line) return lines_per_stepfile @@ -113,7 +119,7 @@ def main(): with open(template_filepath) as fh: template_lines = fh.readlines() - template_lines, removed_lines = parse_lines_and_stepranges(template_lines, len(output_filepaths)) + template_lines, removed_lines = parse_lines_and_stepranges(template_lines, args.start_step, len(output_filepaths)) lines_per_stepfiles = split_stepfile_lines(template_lines, output_filepaths, args.start_step) From c1ac356820030352a8df9518367a70b7bf7471f6 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 10:55:54 +0200 Subject: [PATCH 39/80] fixed copy-paste mistake in the pythonscript template --- .../8-all/example-report/templates/auswertung_py_template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template index 461f1370..4529dae4 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template @@ -420,7 +420,7 @@ ax.set_ylabel("$t$ / s") # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_I_ball(h_plot, *params), label="Fit") # <4-> ax.legend() # <4-> fig.savefig("plot-I_kugel.pdf") # <4-> # <2-> From 8c88df0350f1c4de4834389ec3cc1fcab13bff48 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 11:33:57 +0200 Subject: [PATCH 40/80] add pattern data to template line for debug/dry-run output --- .../8-all/example-report/generate-step-files.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index 10db2b45..c1e4b50b 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -12,9 +12,12 @@ class Templateline: linenumber: int line: str outputfile_index_range: Iterable + pattern: str def __str__(self): - return f"{self.linenumber:>3} {self.line}" + pattern_length = len(self.pattern) + # magic number 10: the amount of padding necessary to print a pattern with two two-digit numbers + return f"({self.pattern}) {" "*(10-pattern_length)} {self.linenumber:>3} {self.line}" def setup_arg_parser(): @@ -44,7 +47,7 @@ def parse_lines_and_stepranges(lines, start_step, end_step): # a line containing no pattern will not be saved to any output file, hence 'removed' if found is None: - removed_lines.append(Templateline(i,l, (None, None))) + removed_lines.append(Templateline(i,l, (None, None), "")) continue groups = found.groups() @@ -83,7 +86,7 @@ def parse_lines_and_stepranges(lines, start_step, end_step): # remove the steprange pattern and spaces between line content and pattern line_content = STEPRANGEREGEX.sub("", l).rstrip() - template_lines.append(Templateline(i, line_content, range(*step_limits))) + template_lines.append(Templateline(i, line_content, range(*step_limits), found.group())) return template_lines, removed_lines From 0b1d58988fb9ed26231ae1249d699609456b444b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 11:34:51 +0200 Subject: [PATCH 41/80] fixed naming and parsing of the upperlimit in a pattern --- .../example-report/generate-step-files.py | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index c1e4b50b..bc803e20 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -52,32 +52,37 @@ def parse_lines_and_stepranges(lines, start_step, end_step): groups = found.groups() try: - lower_limit = int(groups[0]) + lower_step_limit = int(groups[0]) except ValueError: - raise ValueError(f"The pattern ({found.group()}) in line {i} of the template file has not starting step") + raise ValueError(f"The pattern ({found.group()}) in line {i} of the template file has not starting step.") + if lower_step_limit > end_step: + raise ValueError(f"The number of output filepaths ({end_step}) is lower then the lower limit in the pattern '{found.group()}' in line {i} of the template file.") - - + # Since the end_step is calculated from the number of output files given + # the lower index has to be changed to be less then the upper index + lower_index = lower_step_limit - start_step + if lower_index < 0: + raise ValueError(f"The given star_step {start_step} is higher then the lower limit in the pattern '{found.group()}' in line {i} of the template file.") + # The dash and second number can be omitted: # e.g. <4> is equivalent to <4-4> if (not groups[1]) and (groups[2] is None): - # Since the end_step is calculated from the number of output files given - # the lower limit has to be changed to be less then the upper limit - step_limits = (lower_limit - start_step, lower_limit - start_step) + # To include anything the upper index has to be increased by 1 + step_limits = (lower_index, lower_index + 1) # If the second number is omitted but the dash is not, the upper limit is the last step: # e.g. <4-> is equivalent to <4-10> if 10 output files are generated elif not groups[2]: - step_limits = (lower_limit - start_step, end_step) + # the number of files given is used for the upper index (it is already 1 greater then the highest possible index) + upper_index = end_step + step_limits = (lower_index, upper_index) # both numbers are present in the pattern else: - upper_limit = int(groups[2]) - # if upper and lower step are the same, both have to be reduced by start_step - if upper_limit == lower_limit: - upper_limit -= start_step + upper_step_limit = int(groups[2]) + upper_index = upper_step_limit - start_step - step_limits = (lower_limit - start_step, upper_limit) + step_limits = (lower_index, upper_index) num_files_with_current_line = (step_limits[1] - step_limits[0]) if num_files_with_current_line > end_step: From 98b160c725f484cf08324419a4d51f16bff3426b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 11:35:11 +0200 Subject: [PATCH 42/80] remove obsolete comment --- exercises-toolbox/8-all/example-report/generate-step-files.py | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index bc803e20..9c6bccc0 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -97,7 +97,6 @@ def parse_lines_and_stepranges(lines, start_step, end_step): def split_stepfile_lines(template_lines, output_filepaths, start_step): - # mapping the start_step to the first given output file lines_per_stepfile = defaultdict(list) for line in template_lines: From d481918864ec62c7a0fa9473a7ffb8aec94aac0f Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 11:35:46 +0200 Subject: [PATCH 43/80] remove obsolete argument --- exercises-toolbox/8-all/example-report/generate-step-files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index 9c6bccc0..71a2eaf8 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -96,7 +96,7 @@ def parse_lines_and_stepranges(lines, start_step, end_step): return template_lines, removed_lines -def split_stepfile_lines(template_lines, output_filepaths, start_step): +def split_stepfile_lines(template_lines, output_filepaths): lines_per_stepfile = defaultdict(list) for line in template_lines: @@ -128,7 +128,7 @@ def main(): template_lines, removed_lines = parse_lines_and_stepranges(template_lines, args.start_step, len(output_filepaths)) - lines_per_stepfiles = split_stepfile_lines(template_lines, output_filepaths, args.start_step) + lines_per_stepfiles = split_stepfile_lines(template_lines, output_filepaths) if args.verbose: print("Removed lines:") From 7b9360e8580b79e0e0d1732ff468ded9b0c2a86e Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 12:10:46 +0200 Subject: [PATCH 44/80] removed incorrect exception fixed upper index --- .../8-all/example-report/generate-step-files.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index 71a2eaf8..afafe608 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -55,8 +55,6 @@ def parse_lines_and_stepranges(lines, start_step, end_step): lower_step_limit = int(groups[0]) except ValueError: raise ValueError(f"The pattern ({found.group()}) in line {i} of the template file has not starting step.") - if lower_step_limit > end_step: - raise ValueError(f"The number of output filepaths ({end_step}) is lower then the lower limit in the pattern '{found.group()}' in line {i} of the template file.") # Since the end_step is calculated from the number of output files given # the lower index has to be changed to be less then the upper index @@ -80,9 +78,9 @@ def parse_lines_and_stepranges(lines, start_step, end_step): # both numbers are present in the pattern else: upper_step_limit = int(groups[2]) - upper_index = upper_step_limit - start_step + upper_index = upper_step_limit - start_step + 1 - step_limits = (lower_index, upper_index) + step_limits = (lower_index, upper_index) num_files_with_current_line = (step_limits[1] - step_limits[0]) if num_files_with_current_line > end_step: From ea0480e8c02a31c8667a87f834824fb9be80855f Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 12:17:36 +0200 Subject: [PATCH 45/80] change range to list for debug/dry-run output --- .../8-all/example-report/generate-step-files.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index afafe608..f80d2f4c 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -11,13 +11,14 @@ class Templateline: linenumber: int line: str - outputfile_index_range: Iterable + output_file_indices: Iterable pattern: str def __str__(self): pattern_length = len(self.pattern) + indicies = f"{self.output_file_indices[0]},...,{self.output_file_indices[-1]}" # magic number 10: the amount of padding necessary to print a pattern with two two-digit numbers - return f"({self.pattern}) {" "*(10-pattern_length)} {self.linenumber:>3} {self.line}" + return f"({self.pattern} -> {indicies}) {" "*(10-pattern_length)} {self.linenumber:>3} {self.line}" def setup_arg_parser(): @@ -47,7 +48,7 @@ def parse_lines_and_stepranges(lines, start_step, end_step): # a line containing no pattern will not be saved to any output file, hence 'removed' if found is None: - removed_lines.append(Templateline(i,l, (None, None), "")) + removed_lines.append(Templateline(i,l, [], "")) continue groups = found.groups() @@ -89,7 +90,7 @@ def parse_lines_and_stepranges(lines, start_step, end_step): # remove the steprange pattern and spaces between line content and pattern line_content = STEPRANGEREGEX.sub("", l).rstrip() - template_lines.append(Templateline(i, line_content, range(*step_limits), found.group())) + template_lines.append(Templateline(i, line_content, list(range(*step_limits)), found.group())) return template_lines, removed_lines @@ -98,7 +99,8 @@ def split_stepfile_lines(template_lines, output_filepaths): lines_per_stepfile = defaultdict(list) for line in template_lines: - for step in line.outputfile_index_range: + print(line.output_file_indices) + for step in line.output_file_indices: lines_per_stepfile[output_filepaths[step]].append(line) return lines_per_stepfile From 7e3d2b24d7f3813fe4dc3d16e72b07845664db07 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 13:23:07 +0200 Subject: [PATCH 46/80] fix python outputfiles --- exercises-toolbox/8-all/example-report/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 1950ac02..1183f595 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -92,7 +92,7 @@ $(target_texfiles_diskussion) &: generate-step-files.py templates/latex/diskussi $(target_pythonfiles) &: generate-step-files.py templates/auswertung_py_template | $(solution_dirs) touch $(word 1, $(target_pythonfiles)) - python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=, $(target_pythonfiles)) + python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=, $(wordlist 2,10,$(target_pythonfiles))) -s 2 $(datafiles_template_step-1) &: | build/report-example-step-1 cp -r templates/data_without_uncertainties build/report-example-step-1/data From a32af7dc563792e033a8d11bbb789f9df02d8087 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 13:23:16 +0200 Subject: [PATCH 47/80] fix output of test rule --- exercises-toolbox/8-all/example-report/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 1183f595..22d2b2db 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -168,7 +168,7 @@ test_step_scripts: all for i do\ cd "$$i"; \ echo "$$PWD"; \ - echo "Output of '$$i/auswertung.py':" >> ../../python_output.txt; \ + echo "Output of '$${i}auswertung.py':" >> ../../python_output.txt; \ echo "" >> ../../python_output.txt; \ python auswertung.py >> ../../python_output.txt;\ cd - >> /dev/null; \ From 4b67c638386b07fae0a42fe697645589661063cf Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 13:23:30 +0200 Subject: [PATCH 48/80] remove debug print --- exercises-toolbox/8-all/example-report/generate-step-files.py | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index f80d2f4c..75781f62 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -99,7 +99,6 @@ def split_stepfile_lines(template_lines, output_filepaths): lines_per_stepfile = defaultdict(list) for line in template_lines: - print(line.output_file_indices) for step in line.output_file_indices: lines_per_stepfile[output_filepaths[step]].append(line) From 8306fb6b0b018645081ac83772c4b3fcbbafa547 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 21:57:19 +0200 Subject: [PATCH 49/80] changes to taskfiles --- ...aufgabe-step-1.txt => aufgabe-step-01.txt} | 0 ...aufgabe-step-2.txt => aufgabe-step-02.txt} | 5 +-- ...aufgabe-step-3.txt => aufgabe-step-03.txt} | 5 +-- ...aufgabe-step-4.txt => aufgabe-step-04.txt} | 5 +-- ...aufgabe-step-5.txt => aufgabe-step-05.txt} | 5 +-- .../templates/aufgabe-step-06.txt | 37 ++++++++++++++++ .../templates/aufgabe-step-07.txt | 5 +++ .../templates/aufgabe-step-08.txt | 5 +++ .../templates/aufgabe-step-09.txt | 5 +++ .../templates/aufgabe-step-10.txt | 5 +++ .../templates/aufgabe-step-11.txt | 5 +++ .../templates/aufgabe-step-6.txt | 42 ------------------- .../templates/aufgabe-step-7.txt | 0 .../templates/aufgabe-step-8.txt | 0 .../templates/aufgabe-step-9.txt | 0 15 files changed, 70 insertions(+), 54 deletions(-) rename exercises-toolbox/8-all/example-report/templates/{aufgabe-step-1.txt => aufgabe-step-01.txt} (100%) rename exercises-toolbox/8-all/example-report/templates/{aufgabe-step-2.txt => aufgabe-step-02.txt} (85%) rename exercises-toolbox/8-all/example-report/templates/{aufgabe-step-3.txt => aufgabe-step-03.txt} (89%) rename exercises-toolbox/8-all/example-report/templates/{aufgabe-step-4.txt => aufgabe-step-04.txt} (90%) rename exercises-toolbox/8-all/example-report/templates/{aufgabe-step-5.txt => aufgabe-step-05.txt} (91%) create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt create mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt delete mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt delete mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt delete mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt delete mode 100644 exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/aufgabe-step-1.txt rename to exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt similarity index 85% rename from exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt rename to exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt index df77421e..4bda13cc 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-2.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt @@ -1,9 +1,8 @@ -# Realistisches Beispiel Protokoll +# Beispiel Protokoll Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den -Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend -im Aufgabenordner '1-python'. +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: Mit den Informationen zu numpy habt ihr nun die Möglichkeit die Messwerte aus dem Ordner 'data' diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt similarity index 89% rename from exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt rename to exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt index 2b8e8c97..a7ae8c2f 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-3.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt @@ -1,9 +1,8 @@ -# Realistisches Beispiel Protokoll +# Beispiel Protokoll Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den -Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend -im Aufgabenordner '1-python'. +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: Mit den Informationen über matplotlib könnt ihr nun die zwei Plots aus den Daten erstellen, diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt similarity index 90% rename from exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt rename to exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt index 2447217a..48e2659f 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-4.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt @@ -1,9 +1,8 @@ -# Realistisches Beispiel Protokoll +# Beispiel Protokoll Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den -Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend -im Aufgabenordner '1-python'. +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt similarity index 91% rename from exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt rename to exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt index 6a33b232..3762460f 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-5.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt @@ -1,9 +1,8 @@ -# Realistisches Beispiel Protokoll +# Beispiel Protokoll Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den -Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend -im Aufgabenordner '1-python'. +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt new file mode 100644 index 00000000..49f1ce55 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt @@ -0,0 +1,37 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + + +Aufgabe: +Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt +am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. +Die ersten zwei Schritte könnt ihr überspringen, falls ihr keinen Github-Account anlegen wollt. + +1) Erstellt euch einen Github-Account und einen ssh-key für die Authentifikation (siehe git-Foliensatz). + +2) Erstellt unter eurem Github-Account ein neues Repository 'Beispiel-Praktikum'. +Das Repository könnt ihr nach Abschluss dieser Übungsreihe auch wieder löschen. +Readme und Lizenz (MIT) könnt ihr trotzdem mit anlegen, um gute Angewohnheiten einzuüben. + +3) Mit Github: Klont das Repository an einen Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) + + Ohne Github: Erstellt an einem Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) einen neuen Ordner 'Beispiel-Praktikum'. + Navigiert mit dem Terminal in den Ordner 'Beispiel-Praktikum' und initialisiert in diesem ein Git-Repository. + +4) Kopiert den Ordner v16516 in dem ihr bisher diese Übungsreihe bearbeitet habt in den neuen Ordner 'Beispiel-Praktikum' + +5) Erstellt in dem neuen Ordner 'Beispiel-Praktikum' eine neue Datei mit dem Namen '.gitignore'. + Schreibt in die erste Zeile dieser neuen Datei '*.pdf', damit git alle pdf-Dateien zu ignorieren. + Verschafft euch einen Überblick über die Dateien im git-Repository (git status) + und fügt dem Repository alle notwendigen Dateien hinzu (git add, git commit). + + Mit Github: Laded die Änderungen auf Github hoch. + +6) Mit Github (Optional): Ihr könntet die nächsten Schritte in dieser Übungsreihe im Team machen + (z.B. abwechselnd) und so noch etwas Erfahrung im gemeinsamen Umgang mit git und Github sammeln. + + + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt new file mode 100644 index 00000000..5a2d8278 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt @@ -0,0 +1,5 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt new file mode 100644 index 00000000..5a2d8278 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt @@ -0,0 +1,5 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt new file mode 100644 index 00000000..5a2d8278 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt @@ -0,0 +1,5 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt index e69de29b..5a2d8278 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt @@ -0,0 +1,5 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt new file mode 100644 index 00000000..5a2d8278 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt @@ -0,0 +1,5 @@ +# Beispiel Protokoll + +Einleitung: +Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt deleted file mode 100644 index c16906de..00000000 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-6.txt +++ /dev/null @@ -1,42 +0,0 @@ -# Realistisches Beispiel Protokoll - -Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den -Anweisungen in den 'aufgabe.txt' Dateien im Ordner 'Realistisches-Beispiel-Protokoll', beginnend -im Aufgabenordner '1-python'. - - -Aufgabe: -Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt -am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. - -1) Erstellt in dem Ordner, in dem ihr den Ordner v16516 für diese Aufgabe gespeichert habt -einen neuen Ordner (z.B. Beispiel-Praktikum). - -2) Verschiebt den Ordner v16516 in den neuen Ordner Beispiel-Praktikum. - -3) Navigiert mit dem Terminal in den neuen Ordner und initialisiert in diesem ein Git-Repository (init). - -4) Fügt alle Dateien zum Repository hinzu (add, commit). - -Repository auf Github hochladen: - -5) Erstellt euch einen Github-Account, falls ihr noch keinen habt. - -6) Navigiert zu https://github.com/dashboard. Erstellt über den Button "New" ein neues Repository. - Für diese Aufgabe müsst ihr dem Repository nur einen Namen geben, alle optionalen Einstellungen könnt ihr - unverändert lassen. - Nach dem Erstellen werden euch drei Möglichkeiten vorgeschlagen fortzufahren, da wir bereits einen - Repository auf dem Computer haben wählen wir die dritte Option: - "…or push an existing repository from the command line" - git remote add origin git@github.com:/.git - git branch -M main - git push -u origin main - -7) Navigiert mit dem Terminal in euer Beispiel-Praktikum Git-Repository und gebt die drei obigen - Befehle ein, am besten durch Kopieren aus dem Browser. - -8) Schaut euch euer Repository auf https://github.com/ an. - - - diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-7.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-8.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-9.txt deleted file mode 100644 index e69de29b..00000000 From bfb3c9f7586a23099613012bd83bc22a2db1294d Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 21:57:51 +0200 Subject: [PATCH 50/80] add image of the experimental setup --- .../templates/experimental-setup.png | Bin 0 -> 25194 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 exercises-toolbox/8-all/example-report/templates/experimental-setup.png diff --git a/exercises-toolbox/8-all/example-report/templates/experimental-setup.png b/exercises-toolbox/8-all/example-report/templates/experimental-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..16dbdf8c39b9791c1e130fb7a53900b1d59d9c09 GIT binary patch literal 25194 zcmd43Wmwf))GaQE3Mf+24FUoJ(j7|Ira`2;yE_!=MmiJ_q`O;MN~cYofz5zZosee_j7)DJlr`Xj2D`R~UNFp*IZLR=(C<3G~<_f1&V-Vgu%m?-&k zr03HV?h1st|9%V^d?CUARbSY4vOO_uHPSTAQ`<9#XcUAAJ2I=9kc|M7tnj?N(8t|3=dgJKGrPn6d96S-adW z!OFizpLwkWAvLaj9F!}2_dr&E?q=XD;aFz%PVI^7-Yqs_F+ zl}k-n?PT|cBJCi`PZTb6>R)&Kn7K*s@?_KS;ZtI>o9lgFxa1Kyh9op1&LpZR{?U?x zdG9lA$4UJljdmBUb$|S(hZInVX^4Ye7^CxhG{9@D+5T*evpqn4RyML|{3D*F(qxeJ zF&-0p$44|a@YCr$e|{;;-QHYNPiov~jGTxGBmJc%A341xI2R01%od;ecAyO7>B@B> z@!TnIiITeiFE%F=p#Vp{dl&yl1N`Z^soq$w+}a@5JiAOH69=Em&Z|b(ea=Rg-HO}m z)kIyZJ$B!XUgy&(Q#ik6@?H1|n_xwoJvyjYnne1tHk_B~LpXtKIbL8a6H{X|%Ug2n zRQB(m9e~$-|0vvLZ^k^s_s0Err*b%@ShKcUfWE>0Fz9y*K7&nXqhU|v+Cc|;)RhPC z>$|s2?gj<7P#lNl@3-X{?B=l->zTf%1akRGUu9<-oaLq}j0Z6#i1lw3u+w-Kw|^J2 zk@@~Dzh<^(cdQga7x<;+zWS-=nr8jSzXE6R(S=!V=y~P(8AJ7f@rqp+oQ<0 z>fqhvVpgrfaM+F}U8s(IFUY&L^ zxBhkDt8sf$>r<-Jyu>5c^Dj+4_Xp1f1>?8@seasb)>%E0oW(J%58+|+?0|ENroriTGlf>W#ee% zlwdgeuVZ(8`R5}!PtRL>U57sEIh&Hof0wgF zLp~BoG<73S?z}zcxzEvhb6F^G&~_i4-TU%{1-yExqx4wEde?dHi5aIcIUa`&A`S~9 zkJBA<7|&`vF&EFpO59+S(2d#p2?&yu>`2}pUI*=u`UrwcDDQHAG&4B3mS6+Eg*bUZ zmfATF%cq!zT|c%O+zyw@wL5#VAEFT&iARy98zPBTQqA=cJBCB~vPg!6@30da?P3+b zr?ZiEZ<*cM5_)^c9N^=yNasN^Fu31D%%D+`gTqSM(P0E7ruy9)_>=J|;%x4IjtMQp z$w#-_rL9)u9HDK|yle4q(>bkE^hm zUph^0_mz7Ajr+8x5Q3AUrRNfU7yX{s!v>1f;1~m zxvUWZQq!zdV=L41yJIVZjx8-Sl*O<+=@F?Ld8}i^RZ<(8<;GbJCkVt|chsYiQE*i) z+N-?c4cGzcq2k0j>Vs)KW8`T?HI9}vvGYGIe-{y8+A)i1F*WY6R(f4HIJO}?5^V@t zbs2t-E;!lJ8U6e86mGlD_3~Ql?rF7Afz^gDV8BqretlEy5SQn(*~FKR+I*E&i}Enr z5zppeCj6;x(Pz3~hhB=HBv9?9gu;iV*!p*yuwmTo2{P8;bYua)Q{4jMaVNHXrxQBKzr(>G17AnnL z+{qvD!IKB_gq&7p4BrmFw+XuFxGVryh!t# z22UleYym#CSjdmap5G<`wYR!J_f62)mB&R;Z`gw+8t@_at;p{UnObhym@=NQHEHP>Ej<5i# zxuVWlm&?t()SK%o&BRuCZ)2_m7sD~g=kG?MOm)+}?WUvuOS!QUpd9ii)aw9D;cl|h z8{;y*jbCE)&QJ%WW;*Pxrrc_SE>t+_FKx#(!~C^`i2`^%ZoAux$ufm-FRgrrl^a3( zTkSEafhqXfyxm0{obg{4lza*f-hq41@sn-KMK}NX!u#K7d-zu!>3ps=OOoWtnc^zk z2!^&zhvG)~XoT#qa;jpwaSI2N*?Po(Vj~Cjd!HXHa&i>CtF}0e`v2^kpdRbu2m7L( zgkR@%6s1*3&F|Cn+tV_44lhy)qQv6%T`h+U;?g=Yyj&jg37B3@!k?PJ6ClS6i0z z`cVK0XQG=8a&LzX0G3nrj(OLIpd88tJte`)`8oz*4_FWu1=zUX95@e3MxHQ$H6JJZ zBxO^!0zt=FI#d4OG4ABM4c334#~0Kc>;<18p7o>%BCcr$g>N68swbO>1U;>$v&1*I zWao|vxm)$Q2q^e5jhX{yt{0$^xHT!2$!D{h1L%N;Gxuudb_f3d!k)V^?jU&%0(fjq z%P_MNMCMc1!|>p?icUFq(!yqvz%&h03gz)lFUK2b6}>MJv8>UDULb(twtD@N5ij{Au)?gyP2 zISkYdZvSelsnH^x=4oP=N&U6uC?U?1?jc;yt^B;5FjVmc5(Kw@hvt8R2|m8vqbHIi zSFQNn=@T`$>zunOv1!olPconL_B4kdbS{+1N*9cO<;B>b4bng#pK)5GQ7L=2H@izP zm2xQxSDcPA0643X^wED9zyoY-dBLlnu{J4RId7V6LqPj35e|imY~B;6eHE@!#_POg z)ZNMc_^xUqKnW9lvuX^+2Cuc{!l74r6@NY;PK6QS$G+44h%7wbeo!1Yr4owkoKz6k z;!8;BBM#V>^DWI^6eVlkeWF(#ux-6IDQP;AX0uypv+DZn4#lYOGze%z(Y?80(pP$Z zn;_+do0`n&%cXL1Y)_QdzBV7rlOJwEu@HyC6GH)P4xenmaah1~uWtFNCp#KDQ~gRT z{_sFkhfTvK4Vz*26XhniL&@RYfz+=iciFz33LuojPc_5`<>D}*_e_orPW{~JAv&p5hS!ml=gCT6ob`I46$cX0;>}s> zt+n9o-{b$^7GQ}CN@->4I__O*cHdE0GLqeccr+h8BDV9JsxntzlT%>BfA`BG2nT6LKJ-8}hRqKQ$Ce^|qF-^EvFoOXhk#C<#3;L}~DTm){czdevR*``%hc z4V`9D!hEeku_PlUxkD3Dlwf<9&-3L3JWs16gaGDQ3wX>Fd^j+`w{zG-#)U5Qw@ht1 z`OJ)i3i|fDjroC&(EMGkjdfJ+XXHS!igBCPYZo^2(dUj(bp^eW5yQhlO=tn5Py(Sk zvWC})ZCO<=?Tr_zhnv#emi05Y&g@KA_osmxnkx}Sy0(!W1-p?ub?kad!kYw8T7Nu~ z_Vi2b2KM5!--CCVD-~SyvfHInjw^?` zm!F8-$Nb-+Y7}l(s!`dkQuLPPYcVBB`AY!WG+MmeJu(zXUG?RYn~i&t__}n>EMldv zz*DkX`73n$*O1qB&uXvvY))kkHUTAR1WY^3UgVLRt-?}S0A`Ez&UWEk#?I|iJ;p+K zn#~^7bXs*~rDQbI?{C(HZp*!kNwS-^KEHlHuoy&^5nH~9+anMO@`HCS=y&MqqnPOb z!&&}6!%jg~7=REZRK1S@IGQFXY(b)AhY}&cT|VEH@nFSx<}mwe8tF z`2hvHNMX$Vu}Im~*}g3Vlu8o^j``oB6LAjQ@WUB8s7XqgUO?Y*fq~p?wwxg*9L2qa zTeTSEYSrHnR=MQ$M~HFQnSGglHw6u=B=~cx-$@nY9GXf3AMV z$5TQ)U9WNiUMI6R6JveQ`z1#_!~}bRkgCbw^TXfN;R>J=x^l5it;mM@oe$y_h}APp z4mwYn8aA@dgY!1c0!BAv*Ct~mNX_+DS5iC)9_l;VM5WkAH;{g(gKf3e52vMQ(~XWhHuuC1h`Lmb{;hqJ3d3Whdsk+H4(WsNOUi=m zv$9Ok6l-=3*e5U3m{9xt8CUnD6fhkk9{VbT=eY;Y#r#JCB(-0rG8rJ48gXJ!E^}L(5~2u@*w~Xu+SLNU zW0YrXZQFyCT_g9%apKAP*9V8)*XgMO#{+C@8J>IPLJcRQGK0|+B3|k5ZJ3~?Pf3%X zWbK~R=gK`-Z2$?$I4K_GeTpHl2KD)4%g+BSZXxXPwoNo{Ix|rO(zzn58kc5vjAm$?^dpl_Ie2=z+B^eAANA$}RW z&IQKtX1=DKna!F##xOggy`>WE#=SEF1$(RYq4bZc^q$=zxGYku_vh!Uvs0t%qNs&Z zop}DGK0jaR+Jd)04`7C(q|(*=?lb@=k%vitJw+>9HktKzgx6ZK>6(X>D>hnIK}gBd zLdBG4==U8R!V@vnmh!(Dld8c8YoU^S{u*4(Y@@5~@u&>5hD%>jkX$@Z$s*{xxsSBW zFy2f*E9S|L*fLb1=&&mmx;`26;UCVKiQ^FjRM(YO;p_JgIcxc*BHqTbnrVwdb)mvf zSUiODswCK&6)lkmr}LX-Bxdqlp*r(ewnUV-jpOkkmxOfQXiMz4`(*eDk15$zl3`>y zg8QCB*+5VhyBl}xR4}zw8oLhkdJozoG&6nKr}$lUC_5I)JKD0pZQ;Z`qvAt`WjPpVBPTm!$NPJDln&D&Gq&?B-ad)r z!~fuEtSGtu2+dK-^{~=c>EzL`GVm9M^s$FQAiarfa(89!w_FWb&9}_n_2_@+A?6h% zB)CexQWvf$1!#`bB&_X9+J}8_uU$pN*luK%+@f9`k^ zh=w`6kp9XmUc$*>(H#(TCR>i1=O*=*KDR!5A?z8QL8hFOyPDS8iVL52e=_s2;kaDC z(ticc0_FM3=^hf-v_a+5j^2I~R_ zW~+T4t4~ z1EeK>Jlz`4Q(C_m!R^kMqHs`BcPcHWD!#sMGKLn2frN+>=5q4f&J(+6HP}jLmxwOR z{qJE9e2mL>ZYTKxgO)_ql<#UkXL|SJ$4rh&Ux}BgKU~|W74JN#RNt9Ip-t2CR9vr) zmFt<5+BD$Ubwizu6s`lrAJN$^nfnSRo7H3)@p`#Km+{_LOqrSc2X2Uemi8OAnM6{@ zXDC-uYBbCA{J+dFz)9|qIWnSuPMAwkoPm5w*7K0i8czOYBWF>NWtXC^PVjOo8a16HBD-T=@+f=`8Lqs4fE31AFbghl}OJNb#jU;*EegxxH< zoyd>x`jfg&UpYOk2Pwij_h|wNvnYSuRJCQI`)>7wRiT1T=*&`|bMPax(VP(NYrc`a zLoJ~MLwAbTbtnf8L>Uh{;qGhYS`6bo3h_bB)-zW~>;_G5%T?QMB^s}l1xU4Zp|o^F z1=dp;wHyCHPPA$^U%Dzh=R!>3iK5;r;92*2qZ^zy4aA7D8*vM@Pdl>jpCfB^6w9`- z`@SuYQ|tMWG`*42au^h9?M5e=N5#!F9ZdI4yRk-lP+~nkFBZF4`jB3<_9b;`YU0DS zmD(7O;MyR;B`cx>;tf2Qar4FT`XhsIAGXnJkb45e+PFqceDUxY6JCx80#IJez%AK5 zN4Iwf#1u}}mq?FUXjuuUJczhXiENwnf0ydoI!-ndGPq<-%JZx~8*6a3Bud`TD_=5M z-JQb{ex~89>pZS%kA@aQEw>Gb47rrgM_659q*oKauog&>axp*CK!DEwGvaZIz!?*gPEVueQrk(N4X|C!e?kQKG^>#&_FUwL=t(1 zsyBk1mGT(n^Y__^dsrbb6_4Y!LAekt>HtpX?OchvS-H3P&zW(9U5l7;PhPHfeMA&2 zTYNyRcm*iR-SucUr0@lv8kRe>gdvL90_sC^{6%Lh^>ki_heb|~IfgzPjn-OG6Q+Jo zN%QHuZB~hJwy9tyiKauEx`;OB&QwOfYXW8ukRZyKnR3P`7W!Tx64*BGayCXq=wYie z-|dhb3+xaO|Hh#4!|FEz$_FRfkFb&LlxF?#X3f0XnncU5+r%@A!5x51r>r%)O}Siq z8s`+z6?KKNAm&pGKOiof7@WJh8JPX~;WMYJJ(18_mgim3=0!QDna=seeVrUfJ*|I* zmG_aSxp7twX66~vpLTsA%V|LP)>-0=)HLk9s;f?Ozy5d5`(664nw~wAx??VcIWfT6 z(ph7KVWL&(!jvT)a~lB1iJZ*@Ytak_o7weDwu+_2CQFcrzWVh_qA5MLW(Yrj=%d?u zwS@e;nXCO)TlBmo;;W0h4Abj$cZ8|&p|ZJVWA&Qz^;0 zX6!_i#8UZ<&IIib4)^)q9F1siPhBH$~Mc@~59hfKVC;k?r;e5L`5oZZHILsPl0P?(N^RB7`4 z*>T!^p513AU%scpd-)`q`b1pAyI&5Wrho2i@xC%)Cz68!LZlHoc5shjCz&+rzb#WD zG^>ucCZGM5_zQp+oJrp)#UXsg>H{B6^^f*5vaDvXMZMi$u3M!D^a#O zUaXCR`zDtYGrViybD(!%-fg#CTss}|T&C*c$fdSjmXJD=SyYFO$+01jN4!r>Z7HYT zxB{~**iCtO)>?FeYR)v>Ibra)r~msLcZ5*y{8Izda#ckW=9Ob*8m}mOdF7mJ_DhrANA~;V)hPlJ{(rkc(vaZic@KS zFIi_y;B%B@2Ov8n5ugR)9RB7m|G=da4i z+4gMsiD5ta;q|dS?GO)iow!o@8kMb+|Q zu%QKejqqMoKpo9GXPC_h4VuNlLVNOo7XKhZWZl5L$98e=1t`Sq*H>rrd9On9h;j~| zH$8A)ovc)%d6yx1@tCQut>z@0)1mP~R*{Zz`kUe2o@vH+^NrCvSfm6VVNK(UhgX$4 zmR5~on$6L-XO(Y0<5Hdjy;W3@zpAR!Sf@ZGKi=mvRy}us49O|iyw{il!P7(`bFC3^ z*eyub)>qLJrMmNJjzc`TZvs&{3rH7TD0^lV*O0FPCBP>5V{UK@P|wwx4@IY!+qpMB zzdzN#0NH>j@;wf-gpMydw)-BhI(R8AP)1;QL)pu66n&v|Xkaq}bjnJ!&e&^agfm>E z+o;JHBKf#aWs_@zsc7Si$aQcaAfd5S1qe=K5YKF_*y1tk%qT3yTjSL#N=3f7l4X|d zNXzeoF?t@&_?|C5f}?WQ5}xLamVZ^rl_h8-c^y>md%dlzf8l19Mj7o4#jLBRn3}4} z<&nY8)KI3-e1bU13iiNDwoqm!vr-SH3~ZK5Xh6G!;sfv{wtQCt#*S zDiR}#ut@Svif}IvSTm;PilLsh?hYq#3AI}g8>BN?$>3^bbK|TdEreJh0>tyI2v7H2 zcQTV9!bW7I2w`&3Df2b0VbK6J3i->+-b@crGg2L7>DU^;?QZ>UJssBXgE2jjA8OHr*IAllS7s|=N3GY4qYb&#vsn_HfSrMsYmISa`v-Lj@5=f$0 zPc@Xb(*g8rMOef=M!68yc>p(7ka&$2S!q>e z6MPVX%_FS+xC&SS#>x$Qw6^guk|f|th&{pblGQA^fIo%XI3itAEI@V27a8eI6<~C< zQ@<~FA?N7JKivi-VUGESL`&mso{k{&`MlT}@K&rm&i2xaCB2fl_B@mL5RBNz%_qyg zFdO#m=DL|3^eSva;^+dpzi{v=AO;M_oSKp}tIWrf%snf0lH7QL1auwN)3+S7vPDC% zT*l?j*fq9L6dbC(uTD7$)4V`C1622yj~jR}FHsd9U&f7|v-*RWN!9xT8VQf3OEsNKSSxY4hP8#Ua!g-Xy;$lvInJn2ABFG@n`*U=_n-0J z2XsxZnfR?0jOUQa?L-ZzZ1m^Ja#ff{w&SC_M1;LiKdnQ+DxU%bU+%jJAOx?Qf3z9N z{ed%HV$?@1{F!W(aq7&a2q1B_rVyHhE{S{o*_|)DV0Q0=yp02W1&9r%ZK)j)?HUq4u$F1y(}O* zmq+sS*xQVV%f9XERg%|R{2ut*7`9hpD2l$!I$S*Oye080lCSL1Oo=vMV?%CF?L^Ae zVp6drQ(BAP1aqGJeA8 zN&6nWwv@4pu3r$*D*Ir^oq&wfD(R@Ua-ZrmL0&Kvd)JDkioKvDQL5)l(p~0s+G)Hq zTwAVC=_aW>O0=!p)D1MdxXJ7W$2mF^`T^#vE7uLk z+^i?YGI1he>HzT_NP~r2YNL5zA z9u`-=r##&iOJWbi7WnVHJG?FV0eTOkIa0Yk*OwV@2b}1FsA>%@@UPQ9tV#KxFq| z3`a*0AhEn2eNBmRAB2MorNK6?wGLthMIGJ8b;1;p4YxnNR8ja%jFFi75t_+2vlRp6 zuRKo7wzc!sOEbKG>+f475Xg&FB2(S{w2gJG8Epj@X?IYfl%dbnZtWd03gVD*j9#~; z$y)SHOX2Ssu@(+4(sW7xtP+ir& zUkk}cP_hLPI|QR~#{;3*4eIsdZr_LwlR)~T6}C2y8;9V3vHU+n>7LI!QP#j`Y~J+NUd=E2_(rN zIn2k?Er-C&GXVaXd5^TtB|whFd3OpB3e<1`-QB|MYY6pddOzbdQr*v1^@Mt)-apg| z*1!i6Bb5NGMhyeZKsOPVOS5{|ppEHAeb+D>L1Cz&J@x=qq>b))1Ejm8SA5YYgm3VK5uNz6dr`kyqVpfL-HTKZ!SY{#Rv-~UX#76> zmD-HT_alHkbpRp8h)37|6cN}BYZTX(yCeEp7MZjg-X`)akw1Ql(2y2G_a+;^`X}0u z**D)M1ayF=AEQ-7Y!ddFE*Z$~i{`0?l|eGEF`a8!PtVfd zp~e?NmoT02-sU-C@?8k2{;IXr?T_`#a@n1BU)sX84z-VesWA$r5)(|f+v~I9elOsI zj0wR3WzlD?$>;YHwJ7I(ItvwhKES^(3kXm}0gZWB4gg+O2b+|5*LNDw@Ri zmj@exZ6ae0B!o*`GRFZHXxFT9ZNMiB$}KPp#Gn8(5qt)8KXiDboYvEm-lxYye8U(W z6n8Npde?I2$w&Q)$u*wGQP)~DX95T4nt1PdGIAXXaQQO-HYR0EdnVLwJcP=RBVK%B zK9)Q6X*EkMOv(PSwlc`x{ZR82PrN(V+}I_c*LH9C!3$6;BesA-NZ(KTC6|Z+A>cEz z$8)`razF;8z-<~Cm6~7vw(N44fdq~BjKB!^jBbjk-<|i)2z*2d-t#c9`b5izjT{z& z%9W83t68<#<<*HP;RfFG4^l*{K@5pQV0@FHk;^8~S_8%p8Tw#G%^D+b@eZK*V$&61 zRXJ2jc~3SZA?Nsm^V+rf)@HE+P{=8}cCA^dcH{3dhu9EdAEXz|q5U(P?CZqx(S%Hn z_fw)q7f<^8~-^#!~Rz4m5E7K~EwN#X^>!TP`M;nrH)k?L>4T=@D;EDX2i zvF83<^B`aWR(9X;${>lhLD_j8WOK=umtuG&tv4R>QJsv_pf)8FV!CC0iz7b(hSo_{ zSEp(w=`TyH%&Gz&v@%_ZF zR;1hNv-Xk5=HNtjChNKjPZz1Av?5Px^SLex29dwpm|r)`hlB=1@W}qK*BmbQr1p?{ z4wS5=vYRh$66yxlD;08fDAC1g_q9|W}Q4oOcz zX&Ddgc5Z*OUoN?#S+Yp6QhvhpYO_@0;l1`67N*Or%<3gtvbEW)L~!9>RC$T~S50@- zJ~$CX$2BlWq#h3o%||9K;Q}v^VUuBPPaOS6qT|o+pRxkt{=^9_{W;ctt4G(z;`)-1@Ks+7ft9W)FOl0Ca(g+BXTW`rlSAiR*1DjZ) z3Y~A~RVC>63OfA*}>3 z!rcE&2+W~;R($3m^Vb!+brbM>xpck%d;-oPnE_x(#lH;oLE1|9*viiZaN1nIBsEyL z1|kqcUOAuMU|kq|r9FaJ`bhpGNfE+iStRl@!=9(gg=&nNq=~Hco2;z(cFC=mTZKF} zQqojQB)boR3fT-CD)r7Ww4=LB+Q(zwfUo*X4X%@IcR7-8=x0roDrccJvv`Q;R??V6 zs?Rhlrr$k|PRofB>$A7{b%{12RrblY(^Yg1+gQ}nprA&u5qD6vk#gf8LRA=8QAn zSODG~c3`e7E3xP2@gdkd+89!Ucu#HTOs7$)7=3S`-9A)AZ=m>%looTUR%@eu49q`<8r>Q14aVv}m2&sx+v)?v|54new7V7!_AzEma-=EYc96k2QjSOdt6yN)ufc1KxtqJrA za|wcCO;dtP)DyOgCj7vWn`M2&Vm0}SXonUgb4fC=@YHx>CC6_T;))NM*Md21ui1^F zp--MZ1+_GSJr@O)Ahbdut;-semCC}sF&H1?(J=5+HpzX-DyC&2Dh1XxX+Gma2fy_& za>a1=9~(+JV90`%U8#N}E6nO3510wao52NGXL*JkQ6qW*>uH7w>|__{&en|UfYowu z_z3&KkBCG)`fC|57LoD&XrnLtHpT1c!nQb-@G)(XV&>6KJM&=a7V2;?Ei;w(Is_gF z)59Ox)UovOg}NAWR2#37E*V5P45TrCkO)<)G*lr8yX>7w=|C9hq=uTVPvJGI6idK! zi(EG0F=d=cP>_ZB3P**i^a6O9h7<$v+HO&mzpt1k|Dox4U-hc*Jv>oje~ zA!mxnv@3FCfU4HpX=WB_kmB;!kuPXEWr6D^AQZNY3|(rEoAv#JebLmVGx~mD5n}feBqZHEzw#%RCx%fC|<2sJIo~ zqclwv)tQ~;o~YWyHIJqNQ8=IltirUGM3`F6m*Ul9A8%D6f3G|E9NjqVNZs+#RE9^V zR41N%K*|t!iNTe6^EXge+ssajPk6AXDHj#=UgY+Mf>pc%PQcXL@NY5i@E=mip)HyW zPg+|cP;`P~0yib(bKPUV|L{o}qlkHmBLHLYZx?3EgfN!}?Y7g>M`zfJolg&9KTh1= z4}v4V$@xw-99~mqr>{DU1b5Re;ps5XLpD8 zE^U(ACA0}zp!^K-=SJ+Y0S;)98iYctPJBf&0gtL;fdyp#06FwWIto+W3w#RS(-p}+ zY0)l&TQCX;RYZDHp1B5|q6tS=fiw*w2Kl{+Pkn$uCY$D+1Sq$P!M3H2gvu>WwRY^c znmpfIq%>qN(?4NnRMTGv&z`~Y0d%Uwu|P^eR9;!)6AvY0*5LO{8UFbp@RzVhJl}*! znbaq-8O&?YR8NvVsTiOEx4+z-jokeJPfIVuZ3#s_2hgvU^KUhH%A)9?sFRR|IVFju zx|ex(7F+=U^y5$u4*bSljYfU39t#MR!r?DQt+5d?F?~;HC_zpsA8{JTPu2 z7e2_YL~H+%yq~MGTB#g%Z-N&LNfE8HMV+yF`10c$v4E2lh#j19=zWi#MEhbPM@AO9nN*H|)zOv!H<`@>dD$2XSbcgxS zaYW}Y07oEl8D6gp1>&0XHuc8y3s&(a_e1A!Z}|_Y0?HZ|$Um9=&AhUz!6+Q@#*DeN zXr-8F!CPRrkpsT()6LBcLg@yJ0_1c0X)nLYY(C%|8muxO;~yNsvN*eG>Mo}vVUAt(wq1>$(_%^dYs7*(j z#pU5^OVKw)iBaJp*dm!J%h+(`+t^SQ2hZqg7$DIA>L#@=8eOi6vz#6EKsr2sC^AZT zAgdW5C!$UTFmiUjSC*MgSMY`_w{lnz-jLjc-_GUrntI9L%t1Gu3h_0~E0>+O40AiJ zyxpWP3vIGejOS1=NFoc99m@1eAHbaIb$FY6asP6&nT*hke-LJtUZd_$`{Y7NryF@N zhCtVFPpqOle>+$h9|fZ?+-@upZvD4~Vh%ujFZ{f(EVRJiFW~tk8TrJToLUz5DI!Z4 zCuW^Wl0)bOt)T}}Us-_Zd_-)7&H&~v7%tt9LtMT)KGukP#gq*^@9=W>Q$-^>Kqi4J5%Ts8RK-qdX2kN3pt!w8g>94E<+3}7W( z57=MiK<#C3`n}eUq9zS}9`QY)iV23m6%2oJ4poc&6X%7HE?GmG>RUl6%UY zZU)E=;~|jias~#>2d4mWeAU0$m8P|S`DZ&7P^M7I!1OPo5=QsvOr4&z0e;2pA~zsL zl5Z!~(GJiPy{3AX)~eh_r^?ZJjU@LNUfOa=KhaI&6De~xlnTN?E=t$qBKDhn3eMgq z(B(|HRDD@vF~>L*r>KZ}gO|-v+B90Dcwzv1MZ|n>r0@~*#261{v>ehmQAvH=OI|+l zD~S(~VR4w|8PA$D3l_gWC{tCp-auux)&OR)b2)O85go|+MQtKBAb12#rJQrUyYB;B zUh7mb0o46D#C{lRjxwm+QsHKO;ULSobYDP z+H0MxNbc8l&jLbS6=SUj*ym3$f;Fo0F^5o7A3piTpL@z=uJ^3FR5>q_QCwc8!7ZG< z7#eZ>9RPY$PyRgdNN3)_a@wAjZ~%PTh!7f9F~5D>p0S38c>*<9M+BOLl$r(>6mx89 zk>GGsX;bP! zhijSai=b|x%?|;Srl@YeabHk#9@o{mNL+=+w(=zH&-AC>zCR|q>GTQ^g6c$x#{Fm~ zp-!JeintWvDwm*vWX8?rcA%#WIZ843z{CKXWdH$dYLXZn(?myA0#wcBuW zAoH@JxCozI3o(cxQ=7WQk4eLhWE+61RUPM_eM=i6jEg~Tk#fBUbiTDDYcRT8>~`!O zEhV1Aoe)tdTVeY)eB_BS&^Bs}oH-qkFV}fYMsfpb6z7oA6a!yQH@NItz+2@q_<7cN zlIpD1qZq`H>_`|>oswOk523ou)rI-r2WLK%&YApM1MuJbduI6H?9YlSpxm!$gr z``!QJ1@O(n<744XPDo6jXQRyZ*E7Hc;I$mNpY!1b3+ne_L)_iJ4`uwZ=YB2q)s_GU zv3H@N^H6Fdo=6c&s9~2}{2jREKyqsruLE|!xaEgVlfc6`ZJe|V48;}HpQJ>L3z>;z zJV*UD0lQO1T?o48qS0K0zrwU~Rm}qtK2@#Pr>Vss*Q&#_sHTx}6wk$g;sb^#oyJ9) zHpg~25mhm5M}<4gPG0LhEn=U7ukKIPj6Uy*2vh-(O_hZ4GnoN^dnvVbS>oaN`roY9 zx+eSQAbHzwdG{^!QKX2!E@|KH!fjh4W}*pak!vULKb?g0pEVv}IY8FQkt|%-2ttnd zt=0AWBh8M~0K^<~N?c9?HrG0A!jmO$6FDpD9GWZ|1=^Y6I0=dTn`pYFh%k%^ zv#M+>_aGKNNhQ_rql8)D*SmO~5 z+Ao%Z5Q-V#**&w>YjD&;3g%dEh?l#fXfc)64gLZ8(E69vBXoC4@$tU%PR(Zzt?lpbahn3TPq&9MuCLzBM1d4iMFUJ)()4OzHPzmjTgaGk;t>e ztnO{#%t$_@dGCOMG*PY9!|yJlsXFuMg6DcodE0Ja$?RC4smPYDLF=+!#~>DqVcT<+ z&`mL=c?~Go8k8Tvvu!2J!1UK@uAh1+IPlqnG7MV{JBR=U%6B>sAZ!^?Mn%&;SGkQu z)7Q8kn~Z^YW8=rCKtopCN63NTE)GER)_@LHA=D` z{~3GcOZ0bA-B`9rj>F`4kKA~}-Rl#fn35z#&>BTP1F11%Im-)= ze8%WQ&RDR8>HKv`;~s0GmP3drU;2S_Y0^KAJUxJZ=Sw`jD*f8)M)Vx&7k?ap)z-|@ z1B&zSVtyZmg1N5pY^d0f4o_1wu$UiM6tLlH{SlQlb$s=%X~)Uy658a78Xxsja}){K zXS_n)))sHRTBr{n~&?QsjpHcB=-ckaMADUxG*p{S+;bDHoUl+XQ#d zHogS5?u_EIZKz2>4}G`?g^3+Dxk3ctf(?UW)(0G$3Q;2fUlm9$gBW*Ao04`-M z318C!nQJNbWwsI(3uhJXV7DH7s18rQt?P_^Py~+BmS%;Zc3*uYU?}$*_fuq;n|}=% zfL}k6aR%FXdI|)qBxt6z1qZTi0oEUsQXBPIh@OZc90)A?bMT zasagI*%(nJ-`NPru?&Q80=8~wj*b%}>`DPgHfxn24<-v4y?~-PU!ywkN{PQ|O_Vna zn8EQJ!QbWGi(vwyJTQccCP{FiWWhMU%jp&186v!vS^=)Dz7qDS`9BSx4;*|!8M}a3 zH#+SfJ}3qx>50knpJ#>gp3ze)0-D9*@^qJIIG-09%UnS^-_skHi>!qQGqtWJXg;C) zatKXV?Ve$&;(j`M#wSQmfdJwvTL)(huxZ?wf$*tRmpDNn=!S1|zd(WI}CZ z7~qsaH_Zyn%r#_@8{bh553*>vn(M(ZwTY*|-8g};A0xNg?8$)(5lIuqK46~KABWo}8x0iK&RNK;SkKgru=xSYa54#> zOA_cNQgoU<+*=}H&%jD$5#{+0Kj7G^#YdLE6|Td~za}U=1-@tans{8O?vH|7wENw6@IrFpL;18ht)iBb%Yibu?*X(}(4M?>$_5y`gYH*MS5HN#jglUC4 z&4Db>qM249%G!BB zhod5TY(bmu6bl*2ue&;mslb6^_%|WH)T;Z5`t17Yj5rxmi^yB!25aC7gl5iaCVzlm zks%9~I4&$g#;glv$vVTm`gPJqSFH40Oms|%s*tDDWpa0ZlnYFJ4vTmk+tb2X+}-l* zhe(0%-bM(XP8xFVYj&v}WfNs&#?8yOQEJkH?xmL521(-46fntU;XDGreul3X2q<%G zRFrS%9ENY)YHeoubtPzl)7S_Pp@;D=a9yk=xqX%Xw3Apn#+&p}G)Dy3v+cj2i$gDI z0L(z?x4OP(f`#}HPGRY9e`5x|)07)?9>G1IdxLYv#W^N}iG8@LEs}s?j3z+fA@AMZBKDjjq-9@k#Vi+EC zO`*;7gT`Xuh*SGty`A|#l-q`t`x99UWd|xlWd70(Dulu^r^Ei*=t>%qIK@xkiuyP3G zLmoOChg@^Mcf)Vfj1P~wiqVIJZZgG~eJ5Kh;lM>=rvVIX7e<rA)#{w=j*`Zkqn zsbK#NEkI^|I^K5Dsn0+RM)@zFt$&z_bIJ6Z>3#no-{9Ffhy2q`-yL(OGJF2PQm&E) zIBmTn-^QdiGsg+c*U)?8NMk4S)wCoNWNx?S$lmT$Ao{-?;yiERnsvDoqaL$bJITq| ze~6;=pWpXfq@dw*)Y9&c`>gkD%|m1`eZH z!ilkkFU2-(px2u{eDX2V2>WuEIqvIMgN#pZWx>#Py0s}&T40-O-dGyueqEs<1SEYsEqL!mJfAR!QJl&#?XgKin z=HZciM!r|>FZORG%-jf)AKwX?WM+()h$(ufTouP!a4R!Lq7Fq007&%VSIdO@h2T zbgAtwFr?7{fQ`RNOi2WBOK-`Dt^e3OUscZ!ng2}w=b21T9A5f*d`4b1G)93-nm*)A zMo4Tap6~MWokfzBebEVa+zt~f^U*}@6KrE7YS$@Q*PCy&IYh2D%$N3bh#h7Ayr@MF zU%$?x;+6TvhW_dhoK#9f6K*TC0tq8;%orn|gpvd&#`gIXe0}t6x1-Z}4x^oJW4+Cl z-h$!Ls)qe~)NA105V~4Z+f$*=PebBuFq^mOaw0IEF-3+JH!97iU&9=Vs>^3HvB5K` zn+>DLe>i6mR>>0%Qofmh&+Y~!Rs?a)E^!2B$9FLgF0TrHQ6NqoFtR(#+v^%&uIdfb zovM?TUjJQd2|9~!S~Vi5G5P4D#9a_7JYR`_=&%mF^p0?Mg?}5vJec}AM<{p_9SlKO z&(24xNQ7~MPt*I@XSa$x^23UfW#@yqbaqV@2t>{5 zxl96Lj4u89oE_FIF8S|=7BH}T=-M-ImT{}1VEqI@*oX`qE47`^g~M5cl*zk_rtg#A zGFO=$=`-28rz&IDp+NkKGmhrI-=sFthfxu{#~Kg}W}6y2yR?!hfrcR&%Xd5GNr<}M?Fu0p5Oy8@bK)F&n zb_2jq7G!0C;`rwGH-6B+yj`DzLUlVG_$RmQGJocQQJqtx>SixuRBvSye-H5Q zKlOZUujshOIu4UOLrl($5Xm`FQqI^je)K3?$5^yG9C!3LO~;(z_Lx|sh;wO}y;mW5D7#1HIPWBhOwjon|V2ZD!= zcuKDNCc+<8G2*2h`iu#c!{?f#Fy^lWuVeGqVF{AHISdlrkv8uP+JNs|+Vd*v7~=mNmC^a{RQb3#;v@cIjNI zXos@>JQe>-o2hC#0*lfh=-6Eiw$0`imF5-(JAeZ1)d)7UV-QJiM6MnwJnJ64DBJp% zmR>OVixDl?@^I-z0u0yPho@4y=;SB}o@k{;TYRX(ayn0(cx8Cu1^9OOpPZ%3sp22$ zl?}KKIzbV}oGROc-S)BZka5{GOK!?w(ffI#gb`zXra1C@_j|o(k8B8mh7P+2{$PMh(9 zI?&rcM*g_7x9Cj>yVQxFI=6oh@$8@6W4z71TRkh{*ynlFf}%YQq_L^8=koRfL~h4wN4Zg}p^5|fr!7iu=>u$O8P$|NUV%iYtva5%2G{2yEfSqxL@sa4 z8bs35oNmc7UaU!%bLYUbyDQo;J=tmCohfWusUJ&sRf%+sjiJIP@d_?9Ak>C=_-4Wl zW@ADumvIVzzLNEFf0)0VJA1P$9pPS%6f-tO3asuA z9HG{btquCqI=$h3uktA42iK$WCUG>mL*ttP?ZUAZa`K8rGw5l*=;PT`;uNiPe%>8T{- zmqEswb9l1E3ha%8DFH?UP=G3x-dR2j!Ns95K9` zW*Scg39jAR1@}6|zfi-n>LYxxSB%gEe=V-!6t{WiWDB~+`}$CDmmYGfng9G3mrR2y zv|_n{LXetxW%w2^Bn@&Jy6Ss*jGWdlt;zz6URX|OR!+60`r3r*tkkJ2Hg=b zkF{RJdB>PFcuIWQYk<{YRf8KdzgS=5@P%PGUiJ?#ba;UeV6|UnI0im zH3ox@sicXQ(y98&tej8)jLp6auZwdF;lzL;} zqlEBFg>L$aj@;_6cnc~Ue6{mQ>MSPZ#!sLF3x!R0;Ja^Z5n}hz_5mi64L$e(WUkrX z)s0g0twK(Q=q#G2gN$pyx^NKw@=+RnXAb;cWn;#CFT_HS$VyOtBDaeC86r}Ad6-;{ z^kh83W^0$l3U5MO_wKgDzHl;<6&;kX|z`PQAs@wo1vHb zgxYT)*aPQ4>n7w@tZK?V29umxbtD8vAbb!sWGZG?Gk|o)xp3+-q=t$e)a{n9U?Vjv z5P1~6Ul|LT=n%k*w9j3U_EEFR_#c0YDi{%*u_|>hN4mT%W8q3ewfE0@kxQ542;heu z@SXnl`Nv(X;QIN=`^!rVp!b%AHf{mmGVYj2(!yn=*QhO+(WY28^vAzNy{{*D4qIhY z4rU@sQL_OZg3uXL0}IjV6^-R)fw$fPGrc0OZ3nt@GL-{|Ow>1Wl%Uix531v{4}pCv z7m?g5TJa8F+QC1W@JSL^cb)`9{UnwfM5`)+lOhSoy$`{GS;RcmetGTO@ppuh&26Rt8i zOe45}`zg+0BBCOxN4BvQdqEnvW1Io3N2G^vgm-D{7m|bzhfa*bMfVojd1czx=gLD?Bn~2opeU1VpmXC6dNK0*lq}J)u;DMeFnd!4oOY|#BEF*9i z)5PBRC5I|VOMU33(wQIvUySBydY;f#vkSh{roj(~Z(p%Auo^+O#&Nf=VF6tb1Iq}W zuk?Q-o4))(KVTPZf5u?<8kdk5hk{4x3cb>C%w@uwBXCqplD`tVsamH0z3Lo2%CmGJ z2&zS&3?0i0R^(3p^Up=q0ZdYMNKujoFmMl*pw}*S{7?(W+GR8qfub-CqV9kDF_Z4P zg1?Lxmc*iO*v)}wS02_usm?I7Dzdxt(eW_hyRaB9QiXKWac~4UH*NvQqiwAfX8H1v zFGc{VWh}-(hCP;wnGC)k!K3N<6u!|=yQ>^ir8#+}lX5;|A+0hNBLH!I_c1P?i2($_#md0I*!uZ@J3{xRhzvAcU-Qye??3#_ zCxXceWZ#~!2kB1Z$BS1xBsK!FPoB2?iE;=YY=RY+6*$EuNmNNq`pa})2CaKIv*?A@ zP$t{VS>%zqe4cjZMd@;)ogXk3NX0emchdq8S&iEm=v#@=I_b^Tkd=UqQ6n4&8XrtH zgz-o4ty?)A9l+Yx_p1Sbxw*)m}58$%)XGK?} z#pkE~wr~g9z;Umujrf*i;p+<`#3^tJZN&U-6k|BUQCDjfA0%pchZDu~Zn4J&SoAifgj-(@9>FE>&T9WK#&(3p`WH3$ zW+2Bm{bL&PN6>%Pgrn)ZXy!7f>n=sb#}sX{nq^PdswwLIS74+f49A%pT{*!V|^S22y4FK3=aUe?~F z>D&qUwMX8={#hV4E$s#Fq_1393&$-@P%pgO<7l^6!WtlV=7>N<+v%S|C@v?Uwd^xz$|tCueY=bzHr4J=$p$Ge()`NNI5m&VMs3doF zK*Fl%#aqKf+6V54dH>;zjD6U~>kXJ^QKWsD+w@k>Q@80bYN;z@Y8vmxeYVyxiR4jK z#g)SFyCq8(@|5DCu%4Kdx#XUo?+=DS%7qMs*lT4jYFAU?S1{fIwtoluZ)RuzdZ!8Q z?4q#O0&3z8#N6JDEImA3ZDmWO_C#%nwF>v07njiCzecn7$U9z@JLHXW)NY%0Kw=wZ zp|h@XZ&r9kilj2sR#L~AQe(%lNLShAlNkT!fxu?P_O3=b=Tp>t%BUY%!=x$I;DkEw zNhb^=d?=R`!&f%I{^3tXfX#1Tt=wo?kZd#_*rIM$j+S|*cc8}tN?{+`nr0?f;eB&+ z1;vKemyl8mVVGU3?>tN5WolAuPd$_@;Fw{#4kv|^LrKY$>Mzz}wxl_n1x@t8#uqsh z_NZL5_9>tcV)=xVkUZiO4cfJZb+2=2 zV@DxqOSJs0)LNNESa_HF?)zPp-j(rVvmcHqNxZv@sh!#_=Ip9nR+cXh@1l$%PQh|5 z+&Q17+nr_8AldNq1`(V-M;$DSVBU;!9j{8XYd5od_B?xCb(1SkDGru9)n=erZs~3JYchbc9oFfW z>}OQeAD3w;rnlS5MMFc!g8YwwwZ|#?s{PB#BRg0PNy&#>89P|w(#ML&Ys(wGNP*iT ztSRs}X({)~diBa)w} z{qp!6W{P7LGp2SWn_E(Pe<*84fBK&;N@GJ{K?~)!bGSy^f=z*Pe<)dJJ`#U$uvwKq zB25#IpyEJ52Uyk-K1w?~r_wytb=>E3968oKc9uaz6_t(Cs;DCD_aRR;2~B4=58e#V zOx3aTb^J4D>r2#~%1OR*SYRl+NsM^q#6J>n`t1MwM!>18E@WL~>p*r7;AsE<{(f Date: Wed, 2 Oct 2024 21:58:14 +0200 Subject: [PATCH 51/80] add templates --- .../templates/header-matplotlib.tex | 44 +++++++++++++++++++ .../example-report/templates/matplotlibrc | 23 ++++++++++ 2 files changed, 67 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/header-matplotlib.tex create mode 100644 exercises-toolbox/8-all/example-report/templates/matplotlibrc diff --git a/exercises-toolbox/8-all/example-report/templates/header-matplotlib.tex b/exercises-toolbox/8-all/example-report/templates/header-matplotlib.tex new file mode 100644 index 00000000..1d23aac1 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/header-matplotlib.tex @@ -0,0 +1,44 @@ +% unverzichtbare Mathe-Befehle +\usepackage{amsmath} +% viele Mathe-Symbole +\usepackage{amssymb} +% Erweiterungen für amsmath +\usepackage{mathtools} +% Fonteinstellungen +\usepackage{fontspec} +% Latin Modern Fonts werden automatisch geladen + +\usepackage[ + math-style=ISO, % ┐ + bold-style=ISO, % │ + sans-style=italic, % │ ISO-Standard folgen + nabla=upright, % │ + partial=upright, % ┘ + warnings-off={ % ┐ + mathtools-colon, % │ unnötige Warnungen ausschalten + mathtools-overbracket, % │ + }, % ┘ +]{unicode-math} + +% traditionelle Fonts für Mathematik +\setmathfont{Latin Modern Math} +\setmathfont{XITS Math}[range={scr, bfscr}] +\setmathfont{XITS Math}[range={cal, bfcal}, StylisticSet=1] + +% Zahlen und Einheiten +\usepackage[ + locale=DE, % deutsche Einstellungen + separate-uncertainty=true, % immer Unsicherheit mit \pm + per-mode=reciprocal, % ^-1 für inverse Einheiten + output-decimal-marker=., % . statt , für Dezimalzahlen +]{siunitx} + +% chemische Formeln +\usepackage[ + version=4, + math-greek=default, % ┐ mit unicode-math zusammenarbeiten + text-greek=default, % ┘ +]{mhchem} + +% schöne Brüche im Text +\usepackage{xfrac} diff --git a/exercises-toolbox/8-all/example-report/templates/matplotlibrc b/exercises-toolbox/8-all/example-report/templates/matplotlibrc new file mode 100644 index 00000000..1746ade8 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/matplotlibrc @@ -0,0 +1,23 @@ +# pgf-Backend benutzen +backend : pgf + +# Größe der Zeichenfläche in Zoll +figure.figsize : 5.78, 3.57 +figure.constrained_layout.use : True + +# Serifenfont benutzen +font.family : serif + +# Fontgrößen +font.size : 11 +legend.fontsize : medium +xtick.labelsize : 9 +ytick.labelsize : 9 + +# unsere Fonteinstellungen benutzen +pgf.rcfonts : False + +# TeX benutzen +text.usetex : True +pgf.texsystem : lualatex +pgf.preamble : \input{header-matplotlib.tex} From d10d8cf204a62dcead3f91788f36fd8d9a38125a Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 21:58:51 +0200 Subject: [PATCH 52/80] add image file to theory section --- .../8-all/example-report/templates/latex/theorie_tex_template | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 6e1374bf..9cd083b2 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -6,6 +6,7 @@ in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <7-> \begin{figure} % <9-> \centering % <9-> + \includegraphics[width=0.5\textwidth]{experimental-setup.png} % <9-9> \begin{tikzpicture}[scale=3] % <10-> \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-> \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-> From abc92dca32d52575a4c3ce057b73af114744d465 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 21:59:07 +0200 Subject: [PATCH 53/80] add template Makefile --- .../8-all/example-report/templates/Makefile | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/Makefile diff --git a/exercises-toolbox/8-all/example-report/templates/Makefile b/exercises-toolbox/8-all/example-report/templates/Makefile new file mode 100644 index 00000000..f394871d --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/Makefile @@ -0,0 +1,33 @@ +all: build/v16516.pdf + +# hier Python-Skripte: +plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf: auswertung.py ../matplotlibrc ../header-matplotlib.tex | build + # so that matplotlib can find the tex header when running + # LaTeX in the tmp directory + # and set the matplotlibrc + TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python auswertung.py + +# hier weitere Abhängigkeiten für build/vXXX.pdf deklarieren: +build/v16516.pdf: plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf + +build/v16516.pdf: FORCE | build + # to find header and bib files in the main directory + TEXINPUTS=..: \ + BIBINPUTS=..: \ + max_print_line=1048576 \ + latexmk \ + --lualatex \ + --output-directory=build \ + --interaction=nonstopmode \ + --halt-on-error \ + v16516.tex + +build: + mkdir -p build + +clean: + rm -rf build + +FORCE: + +.PHONY: all clean From e136fcb4fc45dc7216c7bd9042b348b38a60d4eb Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Wed, 2 Oct 2024 21:59:55 +0200 Subject: [PATCH 54/80] add image file handling --- exercises-toolbox/8-all/example-report/Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 22d2b2db..78c510b7 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -9,14 +9,16 @@ datafiles_without_unc = $(addprefix templates/data_without_uncertainties/, $(dat datafiles_with_unc = $(addprefix templates/data_with_uncertainties/, $(datafilenames)) -steps_without_unc = 1 2 3 4 +steps_without_unc = 1 2 3 4 steps_with_unc = 5 6 7 8 9 10 steps_with_latex = 7 8 9 10 + steps = $(steps_without_unc) $(steps_with_unc) template_taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) template_bibfiles = $(addprefix templates/, lit.bib programme.bib) +template_setup_image = templates/experimental-setup.png step_dirs = $(foreach step, $(steps),build/report-example-step-$(step)/) solution_dirs = $(addsuffix loesung/, $(step_dirs)) @@ -45,7 +47,7 @@ target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_ target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) $(addsuffix programme.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) - +target_setup_image = build/report-example-step-9/loesung/experimental-setup.png @@ -60,11 +62,15 @@ $(target_texfiles_theorie) \ $(target_texfiles_auswertung) \ $(target_texfiles_diskussion) \ $(target_bibfiles)\ +$(target_setup_image) build/report-example-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) cp $(word $*, $(template_taskfiles)) build/report-example-step-$*/aufgabe.txt +$(target_setup_image) : $(template_setup_image) |$(solution_dirs_with_latex) + cp $(template_setup_image) $(target_setup_image) + $(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) cp templates/lit.bib $(word 1, $(target_bibfiles)) cp templates/lit.bib $(word 2, $(target_bibfiles)) From 3636eb5893a96a606ee75492a998665c6c4038ec Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 10:28:51 +0200 Subject: [PATCH 55/80] renamed image to have some consistancy (files for the report are named german, kind of) --- .../templates/latex/theorie_tex_template | 2 +- .../{experimental-setup.png => versuchsaufbau.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename exercises-toolbox/8-all/example-report/templates/{experimental-setup.png => versuchsaufbau.png} (100%) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 9cd083b2..540fff4b 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -6,7 +6,7 @@ in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <7-> \begin{figure} % <9-> \centering % <9-> - \includegraphics[width=0.5\textwidth]{experimental-setup.png} % <9-9> + \includegraphics[width=0.5\textwidth]{graphics/versuchsaufbau.png} % <9-9> \begin{tikzpicture}[scale=3] % <10-> \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-> \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-> diff --git a/exercises-toolbox/8-all/example-report/templates/experimental-setup.png b/exercises-toolbox/8-all/example-report/templates/versuchsaufbau.png similarity index 100% rename from exercises-toolbox/8-all/example-report/templates/experimental-setup.png rename to exercises-toolbox/8-all/example-report/templates/versuchsaufbau.png From c16a03ffbfc2cb888d4381168da9d6a4804b226e Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 10:29:14 +0200 Subject: [PATCH 56/80] imporved debug/dry-run output --- .../8-all/example-report/generate-step-files.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/generate-step-files.py b/exercises-toolbox/8-all/example-report/generate-step-files.py index 75781f62..72fbedf1 100644 --- a/exercises-toolbox/8-all/example-report/generate-step-files.py +++ b/exercises-toolbox/8-all/example-report/generate-step-files.py @@ -18,7 +18,7 @@ def __str__(self): pattern_length = len(self.pattern) indicies = f"{self.output_file_indices[0]},...,{self.output_file_indices[-1]}" # magic number 10: the amount of padding necessary to print a pattern with two two-digit numbers - return f"({self.pattern} -> {indicies}) {" "*(10-pattern_length)} {self.linenumber:>3} {self.line}" + return f"({self.pattern} → [{indicies}]) {" "*(10-pattern_length)} {self.linenumber:>3} {self.line}" def setup_arg_parser(): @@ -137,7 +137,8 @@ def main(): if args.dry_run: for stepfile, lines in lines_per_stepfiles.items(): - print(f"\nOutput file '{stepfile}' would these lines from the template file:") + print(f"\nOutput file '{stepfile}' with index ({output_filepaths.index(stepfile)}) would contain these lines from the template file:") + print(f"pattern → indicies{" "*9}ln line") print(f"{"\n".join(str(l) for l in lines)}") return From 90848720eb2e726758a3d207cb0c3dabdf7952a3 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 10:29:41 +0200 Subject: [PATCH 57/80] removed empty lines from steps they dont need to be in --- .../8-all/example-report/templates/auswertung_py_template | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template index 4529dae4..0bb20adf 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template @@ -29,16 +29,16 @@ from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # es muss der gesamte Pfad ('Orderabfolge') angegeben werden: # <2-2> # # <2-> # Für die Datei: Messwerte_Bahn.txt also data/Messwerte_Bahn.txt # <2-2> -# # <2-> +# # <2-2> # Der Name der Variable in der die eingelesenen Werte gespeichert werden # <2-2> # ist frei wählbar, es bietet sich bei 'langen' Skripten an (im Gegensatz zur Mathematik) # <2-2> # nicht nur einbuchstabige Abkürzungen zu verwenden, um nicht die Übersicht zu verlieren. # <2-2> # Also beispielsweise track_length statt L. Ein Kommentar zur erklären sollte aber drin sein. # <2-2> -# # <2-> +# # <2-2> # Es bietet sich an die Daten direkt beim Einlesen in eine sinnvolle Einheit umzuwandeln # <2-2> # (falls nötig) und diese mit einem Kommentar zu vermerken # <2-2> - # <2-> - # <2-> + # <2-2> + # <2-2> # Erklärung: # <5-> # Die Dateien im Ordner data enthalten jetzt auch Spalten mit den Unsicherheiten # <5-> # für die meisten Messwerte. # <5-> From e4f2e3153a690655867252b3426b5ac26a3d75e7 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 11:03:32 +0200 Subject: [PATCH 58/80] added number padding --- .../8-all/example-report/Makefile | 99 +++++++++++-------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 78c510b7..70e67693 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -9,9 +9,9 @@ datafiles_without_unc = $(addprefix templates/data_without_uncertainties/, $(dat datafiles_with_unc = $(addprefix templates/data_with_uncertainties/, $(datafilenames)) -steps_without_unc = 1 2 3 4 -steps_with_unc = 5 6 7 8 9 10 -steps_with_latex = 7 8 9 10 +steps_without_unc = 01 02 03 04 +steps_with_unc = 05 06 07 08 09 10 +steps_with_latex = 07 08 09 10 steps = $(steps_without_unc) $(steps_with_unc) @@ -20,21 +20,21 @@ template_taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-s template_bibfiles = $(addprefix templates/, lit.bib programme.bib) template_setup_image = templates/experimental-setup.png -step_dirs = $(foreach step, $(steps),build/report-example-step-$(step)/) +step_dirs = $(foreach step, $(steps),build/example-report-step-$(step)/) solution_dirs = $(addsuffix loesung/, $(step_dirs)) data_dirs = $(addsuffix data, $(solution_dirs)) -step_dirs_with_latex = $(foreach step, $(steps_with_latex),build/report-example-step-$(step)/) +step_dirs_with_latex = $(foreach step, $(steps_with_latex),build/example-report-step-$(step)/) solution_dirs_with_latex = $(addsuffix loesung/, $(step_dirs_with_latex)) content_dirs_with_latex = $(addsuffix content/, $(solution_dirs_with_latex)) -target_datafiles_paths = $(addprefix build/report-example-step-$(1)/loesung/data/, $(datafilenames)) -datafiles_template_step-1 = $(addprefix build/report-example-step-1/data/, $(datafilenames)) -datafiles_template_step-5 = $(addprefix build/report-example-step-5/data/, $(datafilenames)) +target_datafiles_paths = $(addprefix build/example-report-step-$(1)/loesung/data/, $(datafilenames)) +datafiles_template_step-01 = $(addprefix build/example-report-step-01/data/, $(datafilenames)) +datafiles_template_step-05 = $(addprefix build/example-report-step-05/data/, $(datafilenames)) target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) -target_datafiles = $(datafiles_template_step-1) $(datafiles_template_step-5) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) +target_datafiles = $(datafiles_template_step-01) $(datafiles_template_step-05) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) target_makefiles = $(addsuffix Makefile-loesung, $(step_dirs)) @@ -47,8 +47,7 @@ target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_ target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) $(addsuffix programme.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) -target_setup_image = build/report-example-step-9/loesung/experimental-setup.png - +target_setup_image = build/example-report-step-09/loesung/experimental-setup.png all: \ @@ -64,9 +63,24 @@ $(target_texfiles_diskussion) \ $(target_bibfiles)\ $(target_setup_image) +test: + @echo "Test variables:" + @echo "---------------" + @echo templates/data_without_uncertainties $(word 1, $(data_dirs)) + @echo "---------------" + @echo + @echo "---------------" + @echo + @echo "---------------" + @echo + @echo "---------------" + @echo + @echo "---------------" + @echo + -build/report-example-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) - cp $(word $*, $(template_taskfiles)) build/report-example-step-$*/aufgabe.txt +build/example-report-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) + cp $(word $*, $(template_taskfiles)) build/example-report-step-$*/aufgabe.txt $(target_setup_image) : $(template_setup_image) |$(solution_dirs_with_latex) cp $(template_setup_image) $(target_setup_image) @@ -78,8 +92,8 @@ $(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) cp templates/programme.bib $(word 4, $(target_bibfiles)) -build/report-example-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) - cp templates/Makefile-loesung build/report-example-step-$*/Makefile-loesung +build/example-report-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) + cp templates/Makefile-loesung build/example-report-step-$*/Makefile-loesung $(target_texfiles_v16516) &: generate-step-files.py templates/latex/v16516_tex_template | $(solution_dirs_with_latex) python generate-step-files.py -t templates/latex/v16516_tex_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 @@ -100,60 +114,60 @@ $(target_pythonfiles) &: generate-step-files.py templates/auswertung_py_template touch $(word 1, $(target_pythonfiles)) python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=, $(wordlist 2,10,$(target_pythonfiles))) -s 2 -$(datafiles_template_step-1) &: | build/report-example-step-1 - cp -r templates/data_without_uncertainties build/report-example-step-1/data +$(datafiles_template_step-01) &: | build/example-report-step-01 + cp -r templates/data_without_uncertainties build/example-report-step-01/data -$(datafiles_template_step-5) &: | build/report-example-step-5 - cp -r templates/data_with_uncertainties build/report-example-step-5/data +$(datafiles_template_step-05) &: | build/example-report-step-05 + cp -r templates/data_with_uncertainties build/example-report-step-05/data -$(call target_datafiles_paths,1) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) +$(call target_datafiles_paths,01) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 1, $(data_dirs)) -$(call target_datafiles_paths,2) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) +$(call target_datafiles_paths,02) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 2, $(data_dirs)) -$(call target_datafiles_paths,3) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) +$(call target_datafiles_paths,03) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 3, $(data_dirs)) -$(call target_datafiles_paths,4) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) +$(call target_datafiles_paths,04) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) cp -r templates/data_without_uncertainties $(word 4, $(data_dirs)) -$(call target_datafiles_paths,5) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) +$(call target_datafiles_paths,05) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 5, $(data_dirs)) -$(call target_datafiles_paths,6) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) +$(call target_datafiles_paths,06) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 6, $(data_dirs)) -$(call target_datafiles_paths,7) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) +$(call target_datafiles_paths,07) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 7, $(data_dirs)) -$(call target_datafiles_paths,8) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) +$(call target_datafiles_paths,08) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 8, $(data_dirs)) -$(call target_datafiles_paths,9) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) +$(call target_datafiles_paths,09) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 9, $(data_dirs)) $(call target_datafiles_paths,10) &: $(datafiles_with_unc) | $(word 10, $(solution_dirs)) cp -r templates/data_with_uncertainties $(word 10, $(data_dirs)) -build/report-example-step-7/loesung/content &: | $(solution_dirs) - mkdir -p build/report-example-step-7/loesung/content +build/example-report-step-07/loesung/content &: | $(solution_dirs) + mkdir -p build/example-report-step-07/loesung/content -build/report-example-step-8/loesung/content &: | $(solution_dirs) - mkdir -p build/report-example-step-8/loesung/content +build/example-report-step-08/loesung/content &: | $(solution_dirs) + mkdir -p build/example-report-step-08/loesung/content -build/report-example-step-9/loesung/content &: | $(solution_dirs) - mkdir -p build/report-example-step-9/loesung/content +build/example-report-step-09/loesung/content &: | $(solution_dirs) + mkdir -p build/example-report-step-09/loesung/content -build/report-example-step-10/loesung/content &: | $(solution_dirs) - mkdir -p build/report-example-step-10/loesung/content +build/example-report-step-10/loesung/content &: | $(solution_dirs) + mkdir -p build/example-report-step-10/loesung/content -build/report-example-step-%/loesung &: | $(step_dirs) - mkdir -p build/report-example-step-$*/loesung +build/example-report-step-%/loesung &: | $(step_dirs) + mkdir -p build/example-report-step-$*/loesung -build/report-example-step-% : | build - mkdir -p build/report-example-step-$* +build/example-report-step-% : | build + mkdir -p build/example-report-step-$* build: mkdir -p build @@ -186,3 +200,8 @@ test_step_scripts: all .PHONY: all clean + + + + + From 6602df0e54cbaf736dafc86a5aafa442eac0b46c Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 16:00:02 +0200 Subject: [PATCH 59/80] fix stepranges --- .../templates/latex/auswertung_tex_template | 86 +++++++++---------- .../templates/latex/diskussion_tex_template | 2 +- .../templates/latex/header_tex_template | 2 +- .../templates/latex/theorie_tex_template | 22 ++--- .../templates/latex/v16516_tex_template | 6 +- 5 files changed, 59 insertions(+), 59 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template index b2214cfd..26ad1714 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template @@ -6,20 +6,20 @@ Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylind m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-> r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-> r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-> - m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <10-> - r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <10-> - r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <10-> + m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <11-> + r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <11-> + r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <11-> \end{align} % <8-> Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-> \begin{align} % <8-> \label{eq:moments-inertia} % <8-> I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-> - I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <10-> + I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <11-> \end{align} % <8-> Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-> Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-> dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> -dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <10-> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <11-> berechnet % <7-> \begin{equation*} % <8-> t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-> @@ -82,7 +82,7 @@ berechnet 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-> \bottomrule % <9-> \end{tblr} % <9-> - \input{build/table_all-measurements.tex} % <10-> + \input{build/table_all-measurements.tex} % <11-> \end{table} % <9-> % <7-> Durch Mittelung der Messwerte für die selbe Höhe $h$ ergeben sich die Werte % <9-> @@ -94,36 +94,36 @@ Auswertungsschritte verwendet. \caption{Für gleiche Starthöhe $h$ gemittelte Messwerte der Zeit $t$.} % <9-> \label{tab:averaged-measurements} % <9-> % <9-> - \begin{tblr}{ % <9-9> - colspec = { % <9-9> - S[table-format=1.3] % <9-9> - S[table-format=2.3] % <9-9> - S[table-format=1.4] % <9-9> - S[table-format=3.3] % <9-9> - S[table-format=1.5] % <9-9> - }, % <9-9> - row{1} = {guard}, % <9-9> - row{2} = {guard, mode=math}, % <9-9> - vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, % <9-9> - } % <9-9> - \toprule % <9-9> - & % <9-9> - \SetCell[c=2]{c} Messung: Kugel & & % <9-9> - \SetCell[c=2]{c} Messung: Zylinder &\\ % <9-9> - \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} % <9-9> - h \mathbin{/} \unit{\meter} &% % <9-9> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-9> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-9> - \midrule % <9-9> - 0.045 & 1.867 & 0.027 & 2.089 & 0.027 \\ % <9-9> - 0.100 & 1.178 & 0.027 & 1.311 & 0.027 \\ % <9-9> - 0.150 & 0.922 & 0.027 & 1.067 & 0.027 \\ % <9-9> - 0.200 & 0.800 & 0.027 & 0.944 & 0.027 \\ % <9-9> - 0.250 & 0.700 & 0.027 & 0.800 & 0.027 \\ % <9-9> - 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-9> - \bottomrule % <9-9> - \end{tblr} % <9-9> - \input{build/table_averaged-measurements.tex} % <10-> + \begin{tblr}{ % <9-10> + colspec = { % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=2.3] % <9-10> + S[table-format=1.4] % <9-10> + S[table-format=3.3] % <9-10> + S[table-format=1.5] % <9-10> + }, % <9-10> + row{1} = {guard}, % <9-10> + row{2} = {guard, mode=math}, % <9-10> + vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, % <9-10> + } % <9-10> + \toprule % <9-10> + & % <9-10> + \SetCell[c=2]{c} Messung: Kugel & & % <9-10> + \SetCell[c=2]{c} Messung: Zylinder &\\ % <9-10> + \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} % <9-10> + h \mathbin{/} \unit{\meter} &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> + \midrule % <9-10> + 0.045 & 1.867 & 0.027 & 2.089 & 0.027 \\ % <9-10> + 0.100 & 1.178 & 0.027 & 1.311 & 0.027 \\ % <9-10> + 0.150 & 0.922 & 0.027 & 1.067 & 0.027 \\ % <9-10> + 0.200 & 0.800 & 0.027 & 0.944 & 0.027 \\ % <9-10> + 0.250 & 0.700 & 0.027 & 0.800 & 0.027 \\ % <9-10> + 0.300 & 0.656 & 0.027 & 0.722 & 0.027 \\ % <9-10> + \bottomrule % <9-10> + \end{tblr} % <9-10> + \input{build/table_averaged-measurements.tex} % <11-> \end{table} % <9-> % <7-> \subsection{Bestimmung der Fallbeschleunigung} % <7-> @@ -154,12 +154,12 @@ und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> \begin{align} % <8-> \label{eq:parameters-g_ball} % <8-> - g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> - g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <10-> + g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> + g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <11-> \intertext{und für den Zylinder} % <8-> \label{eq:parameters-g_cylinder} % <8-> g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> - g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <10-> + g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <11-> \end{align} % <8-> % <7-> \subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-> @@ -191,12 +191,12 @@ und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> \begin{align} % <8-> \label{eq:parameters-I_ball} % <8-> - I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared} & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> - I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <10-> + I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> + I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <11-> \intertext{und für den Zylinder} % <8-> \label{eq:parameters-I_cylinder} % <8-> - I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared} & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> - I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <10-> + I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared}\quad\text{ und }& t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> + I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <11-> \end{align} % <8-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template index 666da842..b13ac4ab 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/diskussion_tex_template @@ -21,7 +21,7 @@ Die Fit parameter \eqref{eq:parameters-g_cylinder} % <8-> % <7-> passen zum theoretischen Wert $\qty{9.81}{\meter\per\second\squared}$ % <8-> -passen zum theoretischen Wert \input{theoretical-g.tex} % <10-> +passen zum theoretischen Wert \input{theoretical-g.tex} % <11-> => TODO: Abweichungen berechnen % <7-> % <7-> Die übereinstimmung der Fitparameter t0, weist auf eine systematische Unsicherheit % <7-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template index fd47cce2..dacf2eae 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/header_tex_template @@ -106,7 +106,7 @@ \UseTblrLibrary{booktabs,siunitx} % <9-> % <7-> % Verbesserungen am Schriftbild % <7-> -\usepackage{microtype} % <10-> +\usepackage{microtype} % <11-> % <7-> % Literaturverzeichnis % <9-> \usepackage[ % <9-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 540fff4b..6e25469c 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -6,17 +6,17 @@ in einer Höhe $h$ auf der schiefen Ebene in vollkommener Ruhe. % <7-> \begin{figure} % <9-> \centering % <9-> - \includegraphics[width=0.5\textwidth]{graphics/versuchsaufbau.png} % <9-9> - \begin{tikzpicture}[scale=3] % <10-> - \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <10-> - \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <10-> - \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <10-> - \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <10-> - \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <10-> - \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <10-> - \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <10-> - \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <10-> - \end{tikzpicture} % <10-> + \includegraphics[width=0.5\textwidth]{graphics/versuchsaufbau.png} % <9-10> + \begin{tikzpicture}[scale=3] % <11-> + \draw (0,0) -- (3,0) --node[below, near end]{$l$} (0,1) -- cycle; % <11-> + \draw (0.25,1.19)node[below]{$m$} circle (0.25cm); % <11-> + \draw[->] (0.25,1.19) -- (0.90, 0.94) node[above] {\small$\vec{v}$}; % <11-> + \draw[|-|] (-0.15,0.95) -- node[left]{$h$} (-0.15, 0); % <11-> + \draw[dashed,opacity=0.65] (0.94,0.96) circle (0.25cm); % <11-> + \draw[dashed,opacity=0.40] (1.75,0.68) circle (0.25cm); % <11-> + \draw[dashed,opacity=0.25] (3.,0.26) circle (0.25cm); % <11-> + \draw[->] (0.25, 1.03) arc (270:50:0.16) node[below]{\small$\omega$}; % <11-> + \end{tikzpicture} % <11-> \caption{Schematische Darstellung des Versuchsaufbaus. Das runde Objekt (Kugel oder Zylinder) wird in der Höhe $h$ % <9-> auf eine schiefe Ebene gelegt, sodass es aus der Ruhe herabrollt. Die Bewegung ist beschleunigt, sodass sowohl % <9-> die Geschwindigkeit $\vec{v}(t)$ sowie die Winkelgeschwindigkeit $\omega(t)$ nicht konstant sind.} % <9-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template index f59a96d2..0665e102 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/v16516_tex_template @@ -1,13 +1,13 @@ -\input{header.tex} % <7-> +\input{../header.tex} % <7-> -\usepackage{tikz} % <10-> +\usepackage{tikz} % <11-> % <7-> \subject{V16516} % <7-> \title{Die schiefe Ebene} % <7-> \date{% % <7-> Durchführung: 29.09.2023 % <7-> \hspace{3em} % <7-> - Abgabe: 23.09.2024 % <7-> + Abgabe: 04.10.2024 % <7-> } % <7-> % <7-> \begin{document} % <7-> From 57f70e6d35688298daa4073d9a2d8e2046c6fc51 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 16:00:21 +0200 Subject: [PATCH 60/80] add build/ folder --- exercises-toolbox/8-all/example-report/templates/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/Makefile b/exercises-toolbox/8-all/example-report/templates/Makefile index f394871d..f110c642 100644 --- a/exercises-toolbox/8-all/example-report/templates/Makefile +++ b/exercises-toolbox/8-all/example-report/templates/Makefile @@ -1,14 +1,14 @@ all: build/v16516.pdf # hier Python-Skripte: -plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf: auswertung.py ../matplotlibrc ../header-matplotlib.tex | build +build/plot-I_kugel.pdf build/plot-I_zylinder.pdf build/plot-g_kugel.pdf build/plot-g_zylinder.pdf: auswertung.py ../matplotlibrc ../header-matplotlib.tex | build # so that matplotlib can find the tex header when running # LaTeX in the tmp directory # and set the matplotlibrc TEXINPUTS=$$(pwd)/..: MATPLOTLIBRC=../matplotlibrc python auswertung.py # hier weitere Abhängigkeiten für build/vXXX.pdf deklarieren: -build/v16516.pdf: plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf +build/v16516.pdf: build/plot-I_kugel.pdf build/plot-I_zylinder.pdf build/plot-g_kugel.pdf build/plot-g_zylinder.pdf build/v16516.pdf: FORCE | build # to find header and bib files in the main directory From 2b2e1fdaa1a9c8ca2f56609b6ccbd1e462157f3c Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 16:00:42 +0200 Subject: [PATCH 61/80] add build folder in 'makefile'-step (10) --- .../templates/auswertung_py_template | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template index 0bb20adf..d2d15515 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template @@ -326,7 +326,8 @@ ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-> ax.legend() # <3-> fig.savefig("plot_kugel.pdf") # <3-3> -fig.savefig("plot-g_kugel.pdf") # <4-> +fig.savefig("plot-g_kugel.pdf") # <4-9> +fig.savefig("build/plot-g_kugel.pdf") # <10-> # <2-> # <2-> # Erklärung: # <4-4> @@ -358,7 +359,8 @@ ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-> ax.legend() # <3-> fig.savefig("plot_zylinder.pdf") # <3-3> -fig.savefig("plot-g_zylinder.pdf") # <4-> +fig.savefig("plot-g_zylinder.pdf") # <4-9> +fig.savefig("build/plot-g_zylinder.pdf") # <10-> # <2-> # <2-> # Erklärung: # <4-4> @@ -420,9 +422,10 @@ ax.set_ylabel("$t$ / s") # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-> -ax.plot(h_plot, fit_I_ball(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_I_ball(h_plot, *params), label="Fit") # <4-> ax.legend() # <4-> -fig.savefig("plot-I_kugel.pdf") # <4-> +fig.savefig("plot-I_kugel.pdf") # <4-9> +fig.savefig("build/plot-I_kugel.pdf") # <10-11> # <2-> # <2-> # Berechnung der Fitparameter für den Zylinder # <4-> @@ -452,4 +455,5 @@ ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-> ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-> ax.legend() # <4-> -fig.savefig("plot-I_zylinder.pdf") # <4-> +fig.savefig("plot-I_zylinder.pdf") # <4-9> +fig.savefig("build/plot-I_zylinder.pdf") # <10-> From 0bdb72f809882969eb08df5f2bf0e8d664e62def Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 16:01:24 +0200 Subject: [PATCH 62/80] update Makefile --- .../8-all/example-report/Makefile | 273 +++++++++--------- 1 file changed, 129 insertions(+), 144 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 70e67693..33aafd32 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -5,203 +5,188 @@ Messwerte_Kamera.txt \ Messwerte_Kugel.txt \ Messwerte_Zylinder.txt -datafiles_without_unc = $(addprefix templates/data_without_uncertainties/, $(datafilenames)) -datafiles_with_unc = $(addprefix templates/data_with_uncertainties/, $(datafilenames)) +advanced_mpl_filenames = matplotlibrc header-matplotlib.tex +steps = 01 02 03 04 05 06 07 08 09 10 11 -steps_without_unc = 01 02 03 04 -steps_with_unc = 05 06 07 08 09 10 -steps_with_latex = 07 08 09 10 - - -steps = $(steps_without_unc) $(steps_with_unc) - -template_taskfiles = $(foreach step, $(steps), $(addprefix templates/, aufgabe-step-$(step).txt)) -template_bibfiles = $(addprefix templates/, lit.bib programme.bib) -template_setup_image = templates/experimental-setup.png +### Directories +# build/example-report-step-{01,...,11}/ step_dirs = $(foreach step, $(steps),build/example-report-step-$(step)/) + +# build/example-report-step-{01,...,11}/loesung solution_dirs = $(addsuffix loesung/, $(step_dirs)) -data_dirs = $(addsuffix data, $(solution_dirs)) - -step_dirs_with_latex = $(foreach step, $(steps_with_latex),build/example-report-step-$(step)/) -solution_dirs_with_latex = $(addsuffix loesung/, $(step_dirs_with_latex)) -content_dirs_with_latex = $(addsuffix content/, $(solution_dirs_with_latex)) - -target_datafiles_paths = $(addprefix build/example-report-step-$(1)/loesung/data/, $(datafilenames)) -datafiles_template_step-01 = $(addprefix build/example-report-step-01/data/, $(datafilenames)) -datafiles_template_step-05 = $(addprefix build/example-report-step-05/data/, $(datafilenames)) -target_taskfiles = $(addsuffix aufgabe.txt, $(step_dirs)) -target_datafiles = $(datafiles_template_step-01) $(datafiles_template_step-05) $(foreach step, $(steps), $(addprefix $(word $(step), $(solution_dirs))data/, $(datafilenames))) +# build/example-report-step-{06,...,11}/loesung/v16516/ +report_dirs = $(addsuffix v16516/, $(wordlist 6,11,$(solution_dirs))) -target_makefiles = $(addsuffix Makefile-loesung, $(step_dirs)) +# build/example-report-step-{01,05}/data/ +step_data_dirs = $(addsuffix data/, $(word 1,$(step_dirs)) $(word 5,$(step_dirs))) -target_pythonfiles = $(addsuffix auswertung.py, $(solution_dirs)) +# build/example-report-step-{01,...,05}/loesung/data/ +solution_data_dirs = $(addsuffix data/, $(wordlist 1,5,$(solution_dirs))) -target_texfiles_v16516 = $(addsuffix v16516.tex, $(solution_dirs_with_latex)) -target_texfiles_header = $(addsuffix header.tex, $(solution_dirs_with_latex)) -target_texfiles_durchfuehrung = $(addsuffix content/durchfuehrung.tex, $(solution_dirs_with_latex)) -target_texfiles_theorie = $(addsuffix content/theorie.tex, $(solution_dirs_with_latex)) -target_texfiles_auswertung = $(addsuffix content/auswertung.tex, $(solution_dirs_with_latex)) -target_texfiles_diskussion = $(addsuffix content/diskussion.tex, $(solution_dirs_with_latex)) -target_bibfiles = $(addsuffix lit.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) $(addsuffix programme.bib, $(wordlist 3,4,$(solution_dirs_with_latex))) -target_setup_image = build/example-report-step-09/loesung/experimental-setup.png +# build/example-report-step-{06,...,11}/loesung/v16516/data +report_data_dirs = $(addsuffix data/, $(report_dirs)) +# all */data dirs +data_dirs = $(solution_data_dirs) $(report_data_dirs) $(step_data_dirs) +data_dirs_without_unc = $(wordlist 1,4,$(data_dirs)) $(word 12,$(data_dirs)) +data_dirs_with_unc = $(wordlist 5,11,$(data_dirs)) $(word 13,$(data_dirs)) -all: \ -$(target_datafiles) \ -$(target_taskfiles) \ -$(target_pythonfiles) \ -$(target_texfiles_header) \ -$(target_texfiles_v16516) \ -$(target_texfiles_durchfuehrung) \ -$(target_texfiles_theorie) \ -$(target_texfiles_auswertung) \ -$(target_texfiles_diskussion) \ -$(target_bibfiles)\ -$(target_setup_image) +# build/example-report-step-{09,...,10}/loesung/v16516/graphics/ +graphics_dirs = $(addsuffix v16516/graphics/, $(wordlist 9,10,$(solution_dirs))) -test: - @echo "Test variables:" - @echo "---------------" - @echo templates/data_without_uncertainties $(word 1, $(data_dirs)) - @echo "---------------" - @echo - @echo "---------------" - @echo - @echo "---------------" - @echo - @echo "---------------" - @echo - @echo "---------------" - @echo +# solution_dirs containing tex files +solution_dirs_with_tex = $(wordlist 7,11,$(solution_dirs)) +#build/example-report-step-{07,...,11}/loesung/v16516/content/ +content_dirs = $(addsuffix v16516/content/, $(solution_dirs_with_tex)) +### Datafiles -build/example-report-step-%/aufgabe.txt &: $(template_taskfiles) | $(solution_dirs) - cp $(word $*, $(template_taskfiles)) build/example-report-step-$*/aufgabe.txt +append_datafilenames = $(foreach filename,$(datafilenames),$(addsuffix $(filename), $(1))) -$(target_setup_image) : $(template_setup_image) |$(solution_dirs_with_latex) - cp $(template_setup_image) $(target_setup_image) +data_files_without_unc = $(call append_datafilenames,$(data_dirs_without_unc)) +data_files_with_unc = $(call append_datafilenames, $(data_dirs_with_unc)) +data_files = $(data_files_without_unc) $(data_files_with_unc) -$(target_bibfiles) &: $(template_bibfiles) | $(solution_dirs_with_latex) - cp templates/lit.bib $(word 1, $(target_bibfiles)) - cp templates/lit.bib $(word 2, $(target_bibfiles)) - cp templates/programme.bib $(word 3, $(target_bibfiles)) - cp templates/programme.bib $(word 4, $(target_bibfiles)) +### Python files +solution_python_files = $(addsuffix auswertung.py, $(wordlist 1,5,$(solution_dirs))) +report_python_files = $(addsuffix auswertung.py, $(report_dirs)) +python_files = $(solution_python_files) $(report_python_files) +### LaTeX Files +header_tex_files=$(addsuffix header.tex, $(solution_dirs_with_tex)) +main_tex_files= $(addsuffix v16516/v16516.tex, $(solution_dirs_with_tex)) +implementation_tex_files=$(addsuffix durchfuehrung.tex, $(content_dirs)) +theory_tex_files=$(addsuffix theorie.tex, $(content_dirs)) +evaluation_tex_files=$(addsuffix auswertung.tex, $(content_dirs)) +discussion_tex_files=$(addsuffix diskussion.tex, $(content_dirs)) -build/example-report-step-%/Makefile-loesung &: templates/Makefile-loesung | $(solution_dirs) - cp templates/Makefile-loesung build/example-report-step-$*/Makefile-loesung +setup_image_files = $(addsuffix versuchsaufbau.png, $(graphics_dirs)) -$(target_texfiles_v16516) &: generate-step-files.py templates/latex/v16516_tex_template | $(solution_dirs_with_latex) - python generate-step-files.py -t templates/latex/v16516_tex_template $(addprefix -o=,$(target_texfiles_v16516)) -s 7 +lit_bib_files = $(addsuffix lit.bib, $(wordlist 9,11,$(solution_dirs))) +programms_bib_files = $(addsuffix programme.bib, $(wordlist 9,11,$(solution_dirs))) +bib_files = $(lit_bib_files) $(programms_bib_files) -$(target_texfiles_header) &: generate-step-files.py templates/latex/header_tex_template | $(solution_dirs_with_latex) - python generate-step-files.py -t templates/latex/header_tex_template $(addprefix -o=,$(target_texfiles_header)) -s 7 +matplotlibrc_files= $(addsuffix matplotlibrc, $(wordlist 10,11,$(solution_dirs))) +header_matplotlib_files = $(addsuffix header-matplotlib.tex, $(wordlist 10,11,$(solution_dirs))) -$(target_texfiles_durchfuehrung) &: generate-step-files.py templates/latex/durchfuehrung_tex_template | $(content_dirs_with_latex) - python generate-step-files.py -t templates/latex/durchfuehrung_tex_template $(addprefix -o=,$(target_texfiles_durchfuehrung)) -s 7 -$(target_texfiles_theorie) &: generate-step-files.py templates/latex/theorie_tex_template | $(content_dirs_with_latex) - python generate-step-files.py -t templates/latex/theorie_tex_template $(addprefix -o=,$(target_texfiles_theorie)) -s 7 -$(target_texfiles_auswertung) &: generate-step-files.py templates/latex/auswertung_tex_template | $(content_dirs_with_latex) - python generate-step-files.py -t templates/latex/auswertung_tex_template $(addprefix -o=,$(target_texfiles_auswertung)) -s 7 -$(target_texfiles_diskussion) &: generate-step-files.py templates/latex/diskussion_tex_template | $(content_dirs_with_latex) - python generate-step-files.py -t templates/latex/diskussion_tex_template $(addprefix -o=,$(target_texfiles_diskussion)) -s 7 +advanced_mpl_files = $(matplotlibrc_files) $(header_matplotlib_files) -$(target_pythonfiles) &: generate-step-files.py templates/auswertung_py_template | $(solution_dirs) - touch $(word 1, $(target_pythonfiles)) - python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=, $(wordlist 2,10,$(target_pythonfiles))) -s 2 +### Makefiles +makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) -$(datafiles_template_step-01) &: | build/example-report-step-01 - cp -r templates/data_without_uncertainties build/example-report-step-01/data -$(datafiles_template_step-05) &: | build/example-report-step-05 - cp -r templates/data_with_uncertainties build/example-report-step-05/data -$(call target_datafiles_paths,01) &: $(datafiles_without_unc) | $(word 1, $(solution_dirs)) - cp -r templates/data_without_uncertainties $(word 1, $(data_dirs)) -$(call target_datafiles_paths,02) &: $(datafiles_without_unc) | $(word 2, $(solution_dirs)) - cp -r templates/data_without_uncertainties $(word 2, $(data_dirs)) +tex_files = $(header_tex_files) \ + $(main_tex_files) \ + $(implementation_tex_files) \ + $(theory_tex_files) \ + $(evaluation_tex_files) \ + $(discussion_tex_files) \ + $(setup_image_files) \ + $(bib_files) \ + $(advanced_mpl_files) \ + $(makefile_files) -$(call target_datafiles_paths,03) &: $(datafiles_without_unc) | $(word 3, $(solution_dirs)) - cp -r templates/data_without_uncertainties $(word 3, $(data_dirs)) -$(call target_datafiles_paths,04) &: $(datafiles_without_unc) | $(word 4, $(solution_dirs)) - cp -r templates/data_without_uncertainties $(word 4, $(data_dirs)) +all: $(tex_files) $(python_files) $(data_files) -$(call target_datafiles_paths,05) &: $(datafiles_with_unc) | $(word 5, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 5, $(data_dirs)) +$(makefile_files) &: templates/Makefile | $(report_dirs) + set -- $(makefile_files); \ + for i do\ + cp -r $< $$i; \ + done -$(call target_datafiles_paths,06) &: $(datafiles_with_unc) | $(word 6, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 6, $(data_dirs)) +$(matplotlibrc_files) &: templates/matplotlibrc | $(solution_dirs) + set -- $(matplotlibrc_files); \ + for i do\ + cp -r $< $$i; \ + done -$(call target_datafiles_paths,07) &: $(datafiles_with_unc) | $(word 7, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 7, $(data_dirs)) +$(programms_bib_files) &: templates/programme.bib | $(solution_dirs) + set -- $(programms_bib_files); \ + for i do\ + cp -r $< $$i; \ + done -$(call target_datafiles_paths,08) &: $(datafiles_with_unc) | $(word 8, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 8, $(data_dirs)) +$(setup_image_files) &: templates/versuchsaufbau.png | $(graphics_dirs) + set -- $(setup_image_files); \ + for i do\ + cp -r $< $$i; \ + done -$(call target_datafiles_paths,09) &: $(datafiles_with_unc) | $(word 9, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 9, $(data_dirs)) +$(lit_bib_files) &: templates/lit.bib | $(solution_dirs) + set -- $(lit_bib_files); \ + for i do\ + cp -r $< $$i; \ + done -$(call target_datafiles_paths,10) &: $(datafiles_with_unc) | $(word 10, $(solution_dirs)) - cp -r templates/data_with_uncertainties $(word 10, $(data_dirs)) +$(header_matplotlib_files) &: templates/header-matplotlib.tex | $(solution_dirs) + set -- $(header_matplotlib_files); \ + for i do\ + cp -r $< $$i; \ + done -build/example-report-step-07/loesung/content &: | $(solution_dirs) - mkdir -p build/example-report-step-07/loesung/content +$(header_tex_files) &: templates/latex/header_tex_template | $(solution_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(header_tex_files)) -build/example-report-step-08/loesung/content &: | $(solution_dirs) - mkdir -p build/example-report-step-08/loesung/content +$(main_tex_files) &: templates/latex/v16516_tex_template | $(content_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(main_tex_files)) -build/example-report-step-09/loesung/content &: | $(solution_dirs) - mkdir -p build/example-report-step-09/loesung/content +$(theory_tex_files) &: templates/latex/theorie_tex_template | $(content_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(theory_tex_files)) -build/example-report-step-10/loesung/content &: | $(solution_dirs) - mkdir -p build/example-report-step-10/loesung/content +$(implementation_tex_files) &: templates/latex/durchfuehrung_tex_template | $(content_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(implementation_tex_files)) -build/example-report-step-%/loesung &: | $(step_dirs) - mkdir -p build/example-report-step-$*/loesung +$(evaluation_tex_files) &: templates/latex/auswertung_tex_template | $(content_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(evaluation_tex_files)) +$(discussion_tex_files) &: templates/latex/diskussion_tex_template | $(content_dirs) + python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(discussion_tex_files)) -build/example-report-step-% : | build - mkdir -p build/example-report-step-$* -build: - mkdir -p build +#$() &: templates/latex/_tex_template | $(step_dirs) -clean: - rm -r build +$(python_files) &: templates/auswertung_py_template | $(solution_dirs) $(report_dirs) + python generate-step-files.py -t templates/auswertung_py_template -s 2 $(addprefix -o=,$(python_files)) +$(data_files_without_unc) &: templates/data_without_uncertainties/* | $(solution_dirs) $(report_dirs) + set -- $(data_dirs_without_unc); \ + for i do\ + cp -r templates/data_without_uncertainties $$i; \ + done -# development rules - -test_step_scripts: all - @echo - @echo Testing: - @echo "auswertung.py" - @echo "" - echo "" > build/python_output.txt - set -- $(solution_dirs); \ +$(data_files_with_unc) &: templates/data_with_uncertainties/* | $(solution_dirs) $(report_dirs) + set -- $(data_dirs_with_unc); \ for i do\ - cd "$$i"; \ - echo "$$PWD"; \ - echo "Output of '$${i}auswertung.py':" >> ../../python_output.txt; \ - echo "" >> ../../python_output.txt; \ - python auswertung.py >> ../../python_output.txt;\ - cd - >> /dev/null; \ - done;\ - diff -u templates/output_snapshot.txt build/python_output.txt && echo "Test Passed!: No changes in output of scripts" + cp -r templates/data_with_uncertainties $$i; \ + done -#diff -u templates/output_snapshot.txt build/output.txt || diff -u templates/output_snapshot.txt build/output.txt && echo "Test Passed!: No changes in output of scripts" +$(content_dirs) &:|$(report_dirs) + mkdir -p $(content_dirs) +$(graphics_dirs)&: |$(report_dirs) + mkdir -p $(graphics_dirs) -.PHONY: all clean +$(report_dirs)&: | $(solution_dirs) + mkdir -p $(report_dirs) +$(solution_dirs) &: | $(step_dirs) + mkdir -p $(solution_dirs) +$(step_dirs): | build + mkdir -p $(step_dirs) +build: + mkdir -p build + +clean: + rm -r build From 46f82451061929e3d8c1b95427df63465c0c71c6 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 17:00:29 +0200 Subject: [PATCH 63/80] add taskfiles to makefile fix all and tex_files dependencies --- .../8-all/example-report/Makefile | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index 33aafd32..d3b590e3 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -43,6 +43,10 @@ solution_dirs_with_tex = $(wordlist 7,11,$(solution_dirs)) #build/example-report-step-{07,...,11}/loesung/v16516/content/ content_dirs = $(addsuffix v16516/content/, $(solution_dirs_with_tex)) +### Taskfiles + +task_files = $(addsuffix aufgabe.txt,$(step_dirs)) + ### Datafiles append_datafilenames = $(foreach filename,$(datafilenames),$(addsuffix $(filename), $(1))) @@ -75,25 +79,32 @@ header_matplotlib_files = $(addsuffix header-matplotlib.tex, $(wordlist 10,11,$( advanced_mpl_files = $(matplotlibrc_files) $(header_matplotlib_files) -### Makefiles -makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) - - - - tex_files = $(header_tex_files) \ $(main_tex_files) \ $(implementation_tex_files) \ $(theory_tex_files) \ $(evaluation_tex_files) \ $(discussion_tex_files) \ - $(setup_image_files) \ $(bib_files) \ - $(advanced_mpl_files) \ - $(makefile_files) + $(advanced_mpl_files) + +### Makefiles +makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) + + + + + +all:$(task_files) \ + $(python_files) \ + $(data_files) \ + $(tex_files) \ + $(setup_image_files) \ + $(makefile_files) -all: $(tex_files) $(python_files) $(data_files) +build/example-report-step-%/aufgabe.txt &: $(template_task_files) | $(step_dirs) + cp templates/aufgabe-step-$*.txt build/example-report-step-$*/aufgabe.txt $(makefile_files) &: templates/Makefile | $(report_dirs) set -- $(makefile_files); \ From 32b0fc3cc50914be1c3060c605f82aeadc391185 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 18:40:43 +0200 Subject: [PATCH 64/80] moved reference to later step --- .../8-all/example-report/templates/latex/theorie_tex_template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 6e25469c..cac9446f 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -53,7 +53,7 @@ t(h) = \sqrt{\frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)} + t_0. \end{equation} % <8-> % <7-> Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <7-> -Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <7-> +Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <9-> % <7-> Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-> für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-> From 893f3f8657abc3f92a491c6969ac124a06fd500d Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 19:16:36 +0200 Subject: [PATCH 65/80] moved line with ref to step 9 --- .../8-all/example-report/templates/latex/theorie_tex_template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index cac9446f..2a3ae39f 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -44,7 +44,7 @@ t^2 &= \frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right) % <7-> Aus \eqref{eq:tsquared} ergeben sich dann die jeweiligen Ausgleichsfunktionen für beide Versuchsteile. % <9-> % <7-> -Für die Bestimmung der Trägheitsmomente wird nur noch die Quadratwurzel von \eqref{eq:tsquared} % <7-> +Für die Bestimmung der Trägheitsmomente wird nur noch die Quadratwurzel von \eqref{eq:tsquared} % <9-> berechnet und ein Startzeit als Parameter hinzugefügt, % <7-> % <7-> \begin{equation} % <8-> From ce99086ec7dd28ef6170ecfddb0be74c55a6531b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 19:17:02 +0200 Subject: [PATCH 66/80] add Makfile-loesung template for the steps in which no Makefile is present --- .../templates/Makefile-loesung_template | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/Makefile-loesung_template diff --git a/exercises-toolbox/8-all/example-report/templates/Makefile-loesung_template b/exercises-toolbox/8-all/example-report/templates/Makefile-loesung_template new file mode 100644 index 00000000..63033c54 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/Makefile-loesung_template @@ -0,0 +1,51 @@ +all: auswertung.py # <2-2> + python auswertung.py # <2-2> + +all: plot_kugel.pdf plot_zylinder.pdf # <3-3> + # <3-3> +plot_kugel.pdf plot_zylinder.pdf : auswertung.py # <3-3> + python auswertung.py # <3-3> + +clean: # <3-3> + rm plot_kugel.pdf plot_zylinder.pdf # <3-3> + +all: plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf # <4-6> + # <4-6> +plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf: auswertung.py # <4-6> + python auswertung.py # <4-6> + +clean: # <4-6> + rm plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf # <4-6> + +all: v16516.pdf plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf # <7-8> + # <7-8> +v16516.pdf: FORCE # <7-8> + latexmk --lualatex --interaction=nonstopmode --halt-on-error v16516.tex # <7-8> + # <7-8> +plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf: auswertung.py # <7-8> + python auswertung.py # <7-8> + +all: v16516.pdf # <9-9> + # <9-9> +v16516.pdf: plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf # <9-9> + # <9-9> +v16516.pdf: FORCE # <9-9> + TEXINPUTS=..: BIBINPUTS=..: latexmk --lualatex --interaction=nonstopmode --halt-on-error v16516.tex # <9-9> + # <9-9> +plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf: auswertung.py # <9-9> + python auswertung.py # <9-9> + + # <7-9> +FORCE: # <7-9> + # <7-9> +clean: # <7-9> + rm v16516.pdf v16516.aux v16516.log v16516.fdb_latexmk v16516.fls v16516.toc \ # <7-9> + plot-I_kugel.pdf plot-I_zylinder.pdf plot-g_kugel.pdf plot-g_zylinder.pdf # <7-9> + + # <2-> +.PHONY: all clean # <2-> + + + + + From 2153b517c5b0dc8aa136129b7fbfaa603403f81b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 19:18:56 +0200 Subject: [PATCH 67/80] add function to shorten the copy for loops --- .../8-all/example-report/Makefile | 67 +++++++------------ 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index d3b590e3..e76f3661 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -89,8 +89,11 @@ tex_files = $(header_tex_files) \ $(advanced_mpl_files) ### Makefiles -makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) +solution_makefile_files = $(addsuffix Makefile-loesung, $(wordlist 2,5,$(solution_dirs))) \ + $(addsuffix v16516/Makefile-loesung, $(wordlist 6,9,$(solution_dirs))) +target_makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) +makefile_files = $(solution_makefile_files) $(target_makefile_files) @@ -106,41 +109,28 @@ all:$(task_files) \ build/example-report-step-%/aufgabe.txt &: $(template_task_files) | $(step_dirs) cp templates/aufgabe-step-$*.txt build/example-report-step-$*/aufgabe.txt -$(makefile_files) &: templates/Makefile | $(report_dirs) - set -- $(makefile_files); \ - for i do\ - cp -r $< $$i; \ - done +copy_file_loop=set -- $(2); for i do cp $(1) $$i; done + +$(solution_makefile_files) &: templates/Makefile-loesung_template | $(solution_dirs) $(report_dirs) + python generate-step-files.py -t $< -s 2 $(addprefix -o=,$(solution_makefile_files)) + +$(target_makefile_files) &: templates/Makefile | $(report_dirs) + $(call copy_file_loop, $<, $(target_makefile_files)) $(matplotlibrc_files) &: templates/matplotlibrc | $(solution_dirs) - set -- $(matplotlibrc_files); \ - for i do\ - cp -r $< $$i; \ - done + $(call copy_file_loop, $<,$(matplotlibrc_files)) $(programms_bib_files) &: templates/programme.bib | $(solution_dirs) - set -- $(programms_bib_files); \ - for i do\ - cp -r $< $$i; \ - done - -$(setup_image_files) &: templates/versuchsaufbau.png | $(graphics_dirs) - set -- $(setup_image_files); \ - for i do\ - cp -r $< $$i; \ - done + $(call copy_file_loop, $<, $(programms_bib_files)) $(lit_bib_files) &: templates/lit.bib | $(solution_dirs) - set -- $(lit_bib_files); \ - for i do\ - cp -r $< $$i; \ - done + $(call copy_file_loop, $<, $(lit_bib_files)) + +$(setup_image_files) &: templates/versuchsaufbau.png | $(graphics_dirs) + $(call copy_file_loop, $<, $(setup_image_files)) $(header_matplotlib_files) &: templates/header-matplotlib.tex | $(solution_dirs) - set -- $(header_matplotlib_files); \ - for i do\ - cp -r $< $$i; \ - done + $(call copy_file_loop, $<, $(header_matplotlib_files)) $(header_tex_files) &: templates/latex/header_tex_template | $(solution_dirs) python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(header_tex_files)) @@ -160,28 +150,20 @@ $(evaluation_tex_files) &: templates/latex/auswertung_tex_template | $(content_d $(discussion_tex_files) &: templates/latex/diskussion_tex_template | $(content_dirs) python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(discussion_tex_files)) - -#$() &: templates/latex/_tex_template | $(step_dirs) - $(python_files) &: templates/auswertung_py_template | $(solution_dirs) $(report_dirs) - python generate-step-files.py -t templates/auswertung_py_template -s 2 $(addprefix -o=,$(python_files)) + python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=,$(python_files)) -$(data_files_without_unc) &: templates/data_without_uncertainties/* | $(solution_dirs) $(report_dirs) - set -- $(data_dirs_without_unc); \ - for i do\ - cp -r templates/data_without_uncertainties $$i; \ - done +copy_dir_loop=set -- $(2); for i do cp -r $(1) $$i; done +$(data_files_without_unc) &: templates/data_without_uncertainties/* | $(solution_dirs) $(report_dirs) + $(call copy_dir_loop, templates/data_without_uncertainties, $(data_dirs_without_unc)) + $(data_files_with_unc) &: templates/data_with_uncertainties/* | $(solution_dirs) $(report_dirs) - set -- $(data_dirs_with_unc); \ - for i do\ - cp -r templates/data_with_uncertainties $$i; \ - done + $(call copy_dir_loop, templates/data_with_uncertainties, $(data_dirs_with_unc)) $(content_dirs) &:|$(report_dirs) mkdir -p $(content_dirs) - $(graphics_dirs)&: |$(report_dirs) mkdir -p $(graphics_dirs) @@ -200,4 +182,5 @@ build: clean: rm -r build +.PHONY: all clean From f30d1dc9882b13feaf69936b10544f78521a12d1 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 19:19:36 +0200 Subject: [PATCH 68/80] add run rule to first build all steps and then run the Makfile therin --- .../8-all/example-report/Makefile | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index e76f3661..ed6ec789 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -95,16 +95,32 @@ solution_makefile_files = $(addsuffix Makefile-loesung, $(wordlist 2,5,$(solutio target_makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) makefile_files = $(solution_makefile_files) $(target_makefile_files) +all: run - - -all:$(task_files) \ +run:$(task_files) \ $(python_files) \ $(data_files) \ $(tex_files) \ $(setup_image_files) \ $(makefile_files) + # Run all Makefile-loesung + set -- $(wordlist 1, 5,$(solution_dirs)); \ + for i do\ + make -C $$i -f Makefile-loesung; \ + done + # Run all Makefile-loesung in the additional subdir v16516 + set -- $(addsuffix v16516/, $(wordlist 6, 9,$(solution_dirs))); \ + for i do\ + make -C $$i -f Makefile-loesung; \ + done + # Run the Makefile in the last two steps + set -- $(addsuffix v16516/, $(wordlist 10, 11,$(solution_dirs))); \ + for i do\ + make -C $$i -f Makefile; \ + done + + build/example-report-step-%/aufgabe.txt &: $(template_task_files) | $(step_dirs) cp templates/aufgabe-step-$*.txt build/example-report-step-$*/aufgabe.txt From aa694b6fd73345740de581a57f48a74edb9f1b0c Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Thu, 3 Oct 2024 22:19:28 +0200 Subject: [PATCH 69/80] added command to create empty file, to stop the Makefile from recreating all python_scripts --- exercises-toolbox/8-all/example-report/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index ed6ec789..f12e12df 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -167,6 +167,7 @@ $(discussion_tex_files) &: templates/latex/diskussion_tex_template | $(content_d python generate-step-files.py -t $< -s 7 $(addprefix -o=,$(discussion_tex_files)) $(python_files) &: templates/auswertung_py_template | $(solution_dirs) $(report_dirs) + touch build/example-report-step-01/loesung/auswertung.py python generate-step-files.py -t templates/auswertung_py_template $(addprefix -o=,$(python_files)) From 894868cd872671d33539788de4eb4715f40883fb Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 00:57:41 +0200 Subject: [PATCH 70/80] fixed stepranges --- .../templates/latex/auswertung_tex_template | 140 +++++++++--------- .../templates/latex/theorie_tex_template | 2 +- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template index 26ad1714..4bdc78fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/auswertung_tex_template @@ -3,23 +3,23 @@ Die für diesen Versuch relevanten physikalischen Größen für Kugel und Zylinder sind: % <7-> \begin{align} % <8-> \label{eq:physical-properties} % <9-> - m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-> - r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-> - r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-> - m_\text{Z} &= \input{mass_ball.tex} & m_\text{K} &= \input{mass_ball.tex}\nonumber\\ % <11-> - r_{\text{Z},\text{i}} &= \input{../build/radius-inner_cylinder.tex} & r_\text{K} &= \input{radius_ball.tex}\\ % <11-> - r_{\text{Z},\text{a}} &= \input{../build/radius-outer_cylinder.tex} &&\nonumber % <11-> + m_\text{Z} &= \qty{0.1860+-0.0010}{\kilo\gram} & m_\text{K} &= \qty{0.2160+-0.0010}{\kilo\gram}\nonumber\\ % <8-10> + r_{\text{Z},\text{i}} &= \qty{0.0357+-0.0010}{\meter}& r_\text{K} &= \qty{0.04854+-0.00016}{\meter}\\ % <8-10> + r_{\text{Z},\text{a}} &= \qty{0.03867+-0.00016}{\meter} &&\nonumber % <8-10> + m_\text{Z} &= \input{build/mass_ball.tex} & m_\text{K} &= \input{build/mass_ball.tex}\nonumber\\ % <11-> + r_{\text{Z},\text{i}} &= \input{build/radius-inner_cylinder.tex} & r_\text{K} &= \input{build/radius_ball.tex}\\ % <11-> + r_{\text{Z},\text{a}} &= \input{build/radius-outer_cylinder.tex} &&\nonumber % <11-> \end{align} % <8-> Berechnet wurde aus diesen Größen das jeweilige, theoretische Trägheitsmoment % <7-> \begin{align} % <8-> \label{eq:moments-inertia} % <8-> - I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-> - I_\text{Z} &= \input{./../build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./../build/theoretical-I_ball.tex}. % <11-> + I_\text{Z} &= \qty{2.57+-0.07}{\kilo\gram\centi\meter\squared}\quad\text{ und } & I_\text{K} =\qty{2.036+-0.016}{\kilo\gram\centi\meter\squared} % <8-10> + I_\text{Z} &= \input{./build/theoretical-I_cylinder.tex}\quad\text{ und } & I_\text{K} = \input{./build/theoretical-I_ball.tex}. % <11-> \end{align} % <8-> Aus den aufgenommenen Videos der Versuche wurden die in \autoref{tab:all-measurements} folgenden Frameindizes extrahiert. % <9-> Die ebenfalls aufgeführte Zeitdauer $t$ wurde dann jeweils aus der aus dem Startframeindex $F_\text{i}$, % <8-> dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\qty[per-mode=reciprocal]{30}{\per\second}$ wie folgt % <9-9> -dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{framerate.tex}$ wie folgt % <11-> +dem Endframeindex $F_\text{f}$ und der Kameraframerate $\operatorname{fps}=\input{build/framerate.tex}$ wie folgt % <11-> berechnet % <7-> \begin{equation*} % <8-> t = (F_\text{f} - F_\text{i})\cdot\operatorname{fps}^{-1} % <8-> @@ -29,59 +29,59 @@ berechnet \centering % <9-> \caption{Alle aufgenommenen Werte, das heißt mit dreifach wiederholter Messungen je Höhe.} % <9-> \label{tab:all-measurements} % <9-> - \begin{tblr}{ % <9-> - colspec = { % <9-> - S[table-format=1.3] % <9-> - S[table-format=4.0] % <9-> - S[table-format=1.0] % <9-> - S[table-format=4.0] % <9-> - S[table-format=1.0] % <9-> - S[table-format=1.3] % <9-> - S[table-format=1.3] % <9-> - S[table-format=4.0] % <9-> - S[table-format=1.0] % <9-> - S[table-format=4.0] % <9-> - S[table-format=1.0] % <9-> - S[table-format=1.3] % <9-> - S[table-format=1.3] % <9-> - }, % <9-> - row{1} = {guard}, % <9-> - row{2} = {guard, mode=math}, % <9-> - vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-> - } % <9-> - \toprule % <9-> - & % <9-> - \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-> - \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-> - \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-> - h \mathbin{/} \unit{\meter} &% % <9-> - \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-> - \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-> - \SetCell[c=2]{c} F_\text{i} & &% % <9-> - \SetCell[c=2]{c} F_\text{f} & &% % <9-> - \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-> - \midrule % <9-> - 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-> - 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-> - 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-> - 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-> - 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-> - 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-> - 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-> - 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-> - 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-> - 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-> - 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-> - 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-> - 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-> - 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-> - 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-> - 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-> - 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-> - 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-> - \bottomrule % <9-> - \end{tblr} % <9-> + \begin{tblr}{ % <9-10> + colspec = { % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=4.0] % <9-10> + S[table-format=1.0] % <9-10> + S[table-format=1.3] % <9-10> + S[table-format=1.3] % <9-10> + }, % <9-10> + row{1} = {guard}, % <9-10> + row{2} = {guard, mode=math}, % <9-10> + vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, % <9-10> + } % <9-10> + \toprule % <9-10> + & % <9-10> + \SetCell[c=6]{c} Messung: Kugel & & & & & & % <9-10> + \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ % <9-10> + \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} % <9-10> + h \mathbin{/} \unit{\meter} &% % <9-10> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% % <9-10> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% % <9-10> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ % <9-10> + \midrule % <9-10> + 0.045 & 436 & 1 & 492 & 1& 1.867 & 0.047 & 1018 & 1& 1083 & 1& 2.167 & 0.047 \\ % <9-10> + 0.045 & 555 & 1 & 610 & 1& 1.833 & 0.047 & 1189 & 1& 1248 & 1& 1.967 & 0.047 \\ % <9-10> + 0.045 & 672 & 1 & 729 & 1& 1.900 & 0.047 & 1340 & 1& 1404 & 1& 2.133 & 0.047 \\ % <9-10> + 0.100 & 95 & 1 & 130 & 1& 1.167 & 0.047 & 596 & 1& 636 & 1& 1.333 & 0.047 \\ % <9-10> + 0.100 & 199 & 1 & 235 & 1& 1.200 & 0.047 & 762 & 1& 801 & 1& 1.300 & 0.047 \\ % <9-10> + 0.100 & 303 & 1 & 338 & 1& 1.167 & 0.047 & 882 & 1& 921 & 1& 1.300 & 0.047 \\ % <9-10> + 0.150 & 91 & 1 & 119 & 1& 0.933 & 0.047 & 574 & 1& 605 & 1& 1.033 & 0.047 \\ % <9-10> + 0.150 & 201 & 1 & 229 & 1& 0.933 & 0.047 & 766 & 1& 798 & 1& 1.067 & 0.047 \\ % <9-10> + 0.150 & 335 & 1 & 362 & 1& 0.900 & 0.047 & 863 & 1& 896 & 1& 1.100 & 0.047 \\ % <9-10> + 0.200 & 232 & 1 & 256 & 1& 0.800 & 0.047 & 679 & 1& 707 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 323 & 1 & 347 & 1& 0.800 & 0.047 & 810 & 1& 838 & 1& 0.933 & 0.047 \\ % <9-10> + 0.200 & 397 & 1 & 421 & 1& 0.800 & 0.047 & 930 & 1& 959 & 1& 0.967 & 0.047 \\ % <9-10> + 0.250 & 153 & 1 & 174 & 1& 0.700 & 0.047 & 650 & 1& 674 & 1& 0.800 & 0.047 \\ % <9-10> + 0.250 & 239 & 1 & 260 & 1& 0.700 & 0.047 & 892 & 1& 917 & 1& 0.833 & 0.047 \\ % <9-10> + 0.250 & 322 & 1 & 343 & 1& 0.700 & 0.047 & 804 & 1& 827 & 1& 0.767 & 0.047 \\ % <9-10> + 0.300 & 219 & 1 & 238 & 1& 0.633 & 0.047 & 642 & 1& 664 & 1& 0.733 & 0.047 \\ % <9-10> + 0.300 & 319 & 1 & 338 & 1& 0.633 & 0.047 & 739 & 1& 760 & 1& 0.700 & 0.047 \\ % <9-10> + 0.300 & 391 & 1 & 412 & 1& 0.700 & 0.047 & 900 & 1& 922 & 1& 0.733 & 0.047 \\ % <9-10> + \bottomrule % <9-10> + \end{tblr} % <9-10> \input{build/table_all-measurements.tex} % <11-> \end{table} % <9-> % <7-> @@ -154,12 +154,12 @@ und für den Zylinder in \autoref{fig:fit-g-cylinder} graphisch dargestellt. Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> \begin{align} % <8-> \label{eq:parameters-g_ball} % <8-> - g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> - g_\text{K} &= \input{parameter-g_ball.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{parameter-t0-g_ball.tex} % <11-> + g_\text{K} &= \qty{10.0+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> + g_\text{K} &= \input{build/parameter-g_kugel.tex}\quad\text{ und } & t_{0,\text{K}} &= \input{build/parameter-t0-g_kugel.tex} % <11-> \intertext{und für den Zylinder} % <8-> \label{eq:parameters-g_cylinder} % <8-> - g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> - g_\text{Z} &= \input{parameter-g_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-g_cylinder.tex}. % <11-> + g_\text{Z} &= \qty{11.2+-0.5}{\meter\per\second\squared}\quad\text{ und } & t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> + g_\text{Z} &= \input{build/parameter-g_zylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{build/parameter-t0-g_zylinder.tex}. % <11-> \end{align} % <8-> % <7-> \subsection{Bestimmung der Trägheitsmomente von Kugel und Zylinder} % <7-> @@ -191,12 +191,12 @@ und für den Zylinder in \autoref{fig:fit-I-cylinder} graphisch dargestellt. Die Parameter der Ausgleichsrechnung ergeben sich für die Kugel zu % <7-> \begin{align} % <8-> \label{eq:parameters-I_ball} % <8-> - I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-> - I_\text{K} &= \input{parameter-I_ball.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{parameter-t0-I_ball.tex} % <11-> + I_\text{K} &= \qty{1.9+-0.4}{\kilo\gram\centi\meter\squared}\quad\text{ und } & t_{0,\text{K}} &= \qty{-0.148+-0.033}{\second} % <8-10> + I_\text{K} &= \input{build/parameter-I_kugel.tex}\quad\text{ und } &t_{0,\text{K}} &= \input{build/parameter-t0-I_kugel.tex} % <11-> \intertext{und für den Zylinder} % <8-> \label{eq:parameters-I_cylinder} % <8-> - I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared}\quad\text{ und }& t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-> - I_\text{Z} &= \input{parameter-I_cylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{parameter-t0-I_cylinder.tex}. % <11-> + I_\text{Z} &= \qty{1.90+-0.23}{\kilo\gram\centi\meter\squared}\quad\text{ und }& t_{0,\text{Z}} &= \qty{-0.135+-0.033}{\second}. % <8-10> + I_\text{Z} &= \input{build/parameter-I_zylinder.tex}\quad\text{ und } & t_{0,\text{Z}} &= \input{build/parameter-t0-I_zylinder.tex}. % <11-> \end{align} % <8-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 2a3ae39f..8c41328e 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -58,7 +58,7 @@ Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswert Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-> für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-> \begin{align*} % <7-> - I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2), % <7-> + I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}\left(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2)\right), % <7-> \end{align*} % <7-> ergeben sich die folgenden Ausgleichsfunktionen % <7-> % <7-> From b1e8cb262f4238c49449b05b59323bb03b918c56 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 00:58:01 +0200 Subject: [PATCH 71/80] add python script content for step 11 --- .../templates/auswertung_py_template | 316 ++++++++++++++++-- 1 file changed, 284 insertions(+), 32 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template index d2d15515..110704e9 100644 --- a/exercises-toolbox/8-all/example-report/templates/auswertung_py_template +++ b/exercises-toolbox/8-all/example-report/templates/auswertung_py_template @@ -23,6 +23,9 @@ import uncertainties as unc import uncertainties.unumpy as unp # <5-> from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) # <5-> # <2-> +from curve_fit import ucurve_fit # <11-> +from latex_formatting import make_qty # <11-> + # <11-> # Erklärung: # <2-2> # Die Daten liegen im Ordner 'data'. Um die Dateien einlesen # <2-2> # zu können, reicht es deswegen nicht den Dateinamen anzugeben, # <2-2> @@ -212,6 +215,55 @@ print("gemittlelte Zeit") print(t_c_mean) # <2-> print("\n") # <2-> # <2-> +# Erklärung: # <11-> +# Alle Ergebnisse die dieses Python-Script berechnet sollten # <11-> +# für eine noch umfangreichere Automatisierung nicht mehr # <11-> +# per Hand in das Protokoll geschrieben werden. # <11-> +# Neben der Automatisierung verhindert dies auch Fehler # <11-> +# beim Abtippen oder durch vergessene Aktualisierungen, # <11-> +# falls sich die Werte im Verlauf der Bearbeitungszeit # <11-> +# nocheinmal ändern. # <11-> +# # <11-> +# Die Ausgabe der Werte aufs Terminal erspart das nachschauen # <11-> +# in den Dateien. Es ist aber zu empfehlen, die Speicherung # <11-> +# in die Dateien unter der Ausgabe zu machen, um Veränderungen # <11-> +# der Werte zwischen Ausgabe aufs Terminal und Speichern vorzubeugen. # <11-> +# nocheinmal ändern. # <11-> +# Ausgenommen davon die Tabellen, weil der Code recht viel Platz einnimmt, # <11-> +# werden diese am Ende der Datei exportiert. # <11-> +# # <11-> + # <11-> +g = physical_constants["standard acceleration of gravity"][0] # <11-> +with open("build/theoretical-g.tex", "w") as f: # <11-> + f.write(make_qty(g,r"\meter\per\second\squared", figures=2, formatting="per-mode=reciprocal")) # <11-> + # <11-> +with open("build/framerate.tex", "w") as f: # <11-> + f.write(make_qty(fps, r"\per\second", figures=0, formatting="per-mode=reciprocal")) # <11-> + # <11-> +with open("build/theoretical-I_ball.tex", "w") as f: # <11-> + f.write(make_qty(I_b*10000,r"\kilo\gram\centi\meter\squared")) # change units: kg cm² # <11-> + # <11-> +with open("build/theoretical-I_cylinder.tex", "w") as f: # <11-> + f.write(make_qty(I_c*10000,r"\kilo\gram\centi\meter\squared"))# change units: kg cm² # <11-> + # <11-> +with open("build/tracklength.tex", "w") as f: # <11-> + f.write(make_qty(l,r"\meter")) # <11-> + # <11-> +with open("build/mass_ball.tex", "w") as f: # <11-> + f.write(make_qty(m_b,r"\kilo\gram")) # <11-> + # <11-> +with open("build/mass_cylinder.tex", "w") as f: # <11-> + f.write(make_qty(m_b,r"\kilo\gram")) # <11-> + # <11-> +with open("build/radius_ball.tex", "w") as f: # <11-> + f.write(make_qty(r_b, r"\meter")) # <11-> + # <11-> +with open("build/radius-inner_cylinder.tex", "w") as f: # <11-> + f.write(make_qty(ri_c,r"\meter")) # <11-> + # <11-> +with open("build/radius-outer_cylinder.tex", "w") as f: # <11-> + f.write(make_qty(ro_c,r"\meter")) # <11-> + # <11-> # Erstelle Plots der Messwerte t_._mean und h_._mean # <3-> # <2-> # Erklärung: # <3-3> @@ -281,17 +333,32 @@ def fit_g_cylinder(h, g, t0): # Berechnung der Fitparameter für die Kugel # <4-> # <2-> params, covariance_matrix = curve_fit(fit_g_ball, h_b_mean, t_b_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> - # <2-> - # <2-> +params, covariance_matrix = curve_fit(fit_g_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> + # <11-> +# Erklärung: # <11-> +# Wir verwenden hier den 'Wrapper' für curve_fit, aus Aufgabe 5-uncertainties/3-curve_fit, # <11-> +# um die Arbeit mit unsicherheitbehafteten Werten für Fits wiederverwendbar auszulagern. # <11-> +params = ucurve_fit(fit_g_ball, noms(h_b_mean), t_b_mean) # <11-> + # <11-> # Erklärung: # <4-4> # Ansehnliche Ausgabe der Parameter aufs Terminal # <4-4> print("Fitparameter (Kugel)") # <4-> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> -print("\n") # <4-> - # <2-> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <5-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +for name, param in zip("gt", params): # <11-> + print(f"{name} = {param.n:8.3f} ± {param.s:.3f}") # <11-> +print("\n") # <4-10> + # <2-> +# exporting fit parameters # <11-> +parameter_g, parameter_t0 = params # <11-> + # <11-> +with open("build/parameter-g_kugel.tex", "w") as f: # <11-> + f.write(make_qty(parameter_g, r"\meter\per\second\squared")) # <11-> + # <11-> +with open("build/parameter-t0-g_kugel.tex", "w") as f: # <11-> + f.write(make_qty(parameter_t0, r"\second")) # <11-> + # <11-> # Erklärung: # <3-3> # Die Werte für h die im Plot der Theorie-Funktionen verwendet werden, damit diese # <3-3> # auch tatsächlich aussieht wie eine differenzierbare Funktion. # <3-3> @@ -323,7 +390,8 @@ ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label # Erklärung: # <4-4> # Theorie-Funktion durch Fit-Funktion mit Fit-Parametern ersetzen # <4-4> ax.plot(h_plot, theory_t_ball(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_g_ball(h_plot, *params), label="Fit") # <4-10> +ax.plot(h_plot, fit_g_ball(h_plot, *noms(params)), label="Fit") # <11-> ax.legend() # <3-> fig.savefig("plot_kugel.pdf") # <3-3> fig.savefig("plot-g_kugel.pdf") # <4-9> @@ -337,15 +405,26 @@ fig.savefig("build/plot-g_kugel.pdf") # <2-> # Berechnung der Fitparameter für den Zylinder # <4-> params, covariance_matrix = curve_fit(fit_g_cylinder, h_c_mean, t_c_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> +params, covariance_matrix = curve_fit(fit_g_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> # <2-> +params = ucurve_fit(fit_g_cylinder, noms(h_c_mean), t_c_mean) # <11-> # <2-> print("Fitparameter (Zylinder)") # <4-> -for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> +for name, value, uncertainty in zip("gt", params, param_uncertainties): # <4-10> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> +for name, param in zip("gt", params): # <11-> + print(f"{name} = {param.n:8.3f} ± {param.s:.3f}") # <11-> print("\n") # <4-> # <2-> + # exporting fit parameters # <11-> +parameter_g, parameter_t0 = params # <11-> + # <11-> +with open("build/parameter-g_zylinder.tex", "w") as f: # <11-> + f.write(make_qty(parameter_g, r"\meter\per\second\squared")) # <11-> + # <11-> +with open("build/parameter-t0-g_zylinder.tex", "w") as f: # <11-> + f.write(make_qty(parameter_t0, r"\second")) # <11-> # <2-> fig, ax = plt.subplots(1, 1, layout="constrained") # <3-> # <2-> @@ -356,7 +435,8 @@ ax.set_ylabel("$t$ / s") ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <3-4> ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-> ax.plot(h_plot, theory_t_cylinder(h_plot), label="Theorie") # <3-3> -ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_g_cylinder(h_plot, *params), label="Fit") # <4-10> +ax.plot(h_plot, fit_g_cylinder(h_plot, *noms(params)), label="Fit") # <11-> ax.legend() # <3-> fig.savefig("plot_zylinder.pdf") # <3-3> fig.savefig("plot-g_zylinder.pdf") # <4-9> @@ -400,20 +480,34 @@ def fit_I_cylinder(h, I, t0): # <2-> # Berechnung der Fitparameter für die Kugel # <4-> params, covariance_matrix = curve_fit(fit_I_ball, h_b_mean, t_b_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> +params, covariance_matrix = curve_fit(fit_I_ball, noms(h_b_mean), noms(t_b_mean), sigma=stds(t_b_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> # <2-> +params = ucurve_fit(fit_I_ball, noms(h_b_mean), t_b_mean, bounds=([0,-np.inf],[+np.inf,+np.inf])) # <11-> # <2-> print("Fitparameter (Kugel)") # <4-> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> +for name, param in zip("It", params): # <11-> # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-> if name == "I": # <4-> - value *= 10000 # <4-> - uncertainty *= 10000 # <4-> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> + value *= 10000 # <4-10> + uncertainty *= 10000 # <4-10> + param *= 10000 # <11-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> + print(f"{name} = {param.n:8.3f} ± {param.s:.3f}") # <11-> print("\n") # <4-> - # <2-> - # <2-> + + # exporting fit parameters # <11-> +parameter_I, parameter_t0 = params # <11-> + # <11-> +with open("build/parameter-I_kugel.tex", "w") as f: # <11-> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <11-> + f.write(make_qty(parameter_I*10000, r"\kilo\gram\centi\meter\squared")) # <11-> + # <11-> +with open("build/parameter-t0-I_kugel.tex", "w") as f: # <11-> + f.write(make_qty(parameter_t0, r"\second")) # <11-> + # <11-> + # <2-> # <2-> fig, ax = plt.subplots(1, 1, layout="constrained") # <4-> # <2-> ax.set_xlabel("$h$ / m") # <4-> @@ -422,7 +516,8 @@ ax.set_ylabel("$t$ / s") # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Kugel") # <4-4> ax.errorbar(noms(h_b_mean), noms(t_b_mean), yerr=stds(t_b_mean), fmt="k+", label="Daten: Kugel") # <5-> -ax.plot(h_plot, fit_I_ball(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_I_ball(h_plot, *params), label="Fit") # <4-10> +ax.plot(h_plot, fit_I_ball(h_plot, *noms(params)), label="Fit") # <11-> ax.legend() # <4-> fig.savefig("plot-I_kugel.pdf") # <4-9> fig.savefig("build/plot-I_kugel.pdf") # <10-11> @@ -430,19 +525,32 @@ fig.savefig("build/plot-I_kugel.pdf") # <2-> # Berechnung der Fitparameter für den Zylinder # <4-> params, covariance_matrix = curve_fit(fit_I_cylinder, h_c_mean, t_c_mean) # <4-4> -params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-> -param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-> +params, covariance_matrix = curve_fit(fit_I_cylinder, noms(h_c_mean), noms(t_c_mean), sigma=stds(t_c_mean)) # <5-10> +param_uncertainties = np.sqrt(np.diag(covariance_matrix)) # <4-10> # <2-> +params = ucurve_fit(fit_I_cylinder, noms(h_c_mean), t_c_mean, bounds=([0,-np.inf],[+np.inf,+np.inf])) # <11-> # <2-> -print("Fitparameter (Zylinder)") # <4-> -for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-> +print("Fitparameter (Zylinder)") # <4-10> +for name, value, uncertainty in zip("It", params, param_uncertainties): # <4-10> +for name, param in zip("It", params): # <11-> # in kg*m² sehr klein, umwandlung zu kg*cm² # <4-> if name == "I": # <4-> - value *= 10000 # <4-> - uncertainty *= 10000 # <4-> - print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-> + value *= 10000 # <4-10> + uncertainty *= 10000 # <4-10> + param *= 10000 # <11-> + print(f"{name} = {value:8.3f} ± {uncertainty:.3f}") # <4-10> + print(f"{name} = {param.n:8.3f} ± {param.s:.3f}") # <11-> print("\n") # <4-> # <2-> +# exporting fit parameters # <11-> +parameter_I, parameter_t0 = params # <11-> + # <11-> +with open("build/parameter-I_zylinder.tex", "w") as f: # <11-> + # in kg*m² sehr klein, umwandlung zu kg*cm² # <11-> + f.write(make_qty(parameter_I*10000, r"\kilo\gram\centi\meter\squared")) # <11-> + # <11-> +with open("build/parameter-t0-I_zylinder.tex", "w") as f: # <11-> + f.write(make_qty(parameter_t0, r"\second")) # <11-> # <2-> # <2-> fig, ax = plt.subplots(1, 1, layout="constrained") # <4-> @@ -453,7 +561,151 @@ ax.set_ylabel("$t$ / s") # <2-> ax.plot(h_c_mean, t_c_mean, "k+", label="Daten: Zylinder") # <4-4> ax.errorbar(noms(h_c_mean), noms(t_c_mean), yerr=stds(t_c_mean), fmt="k+", label="Daten: Zylinder") # <5-> -ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-> +ax.plot(h_plot, fit_I_cylinder(h_plot, *params), label="Fit") # <4-10> +ax.plot(h_plot, fit_I_cylinder(h_plot, *noms(params)), label="Fit") # <11-> ax.legend() # <4-> fig.savefig("plot-I_zylinder.pdf") # <4-9> -fig.savefig("build/plot-I_zylinder.pdf") # <10-> +fig.savefig("build/plot-I_zylinder.pdf") # <10-> + +# writing latex tables # <11-> +# first: writing all measured values not just the averages # <11-> +# heights_ball, durations_ball, durations_cylinder # <11-> +# have not been reduced to 6 values each # <11-> + # <11-> +# Erklärung: # <11-> +# Die Erstellung der Tabellen wird hier nicht zu 100% automatisiert, aber # <11-> +# zumindest das abtippen der Werte ist hiermit nicht mehr nötig. # <11-> +# Das ist auch bei Weitem nicht nur ein Ausdruck von Faulheit, # <11-> +# sondern wieder ein wichtiger Schritt zu guter wissenschaftlicher # <11-> +# Praxis: Messwerte per Hand abtippen ist fehleranfällig und nur # <11-> +# mäßig reproduzierbar. # <11-> +# Es steht euch frei das noch etwas mehr zu automatisieren. # <11-> +# # <11-> +# Jede Tabelle besteht aus drei Teilen, dem # <11-> +# i) table_header: Beginn der Latexumgebung tblr und alle Spalten/Zeileneinstellungen # <11-> +# sowie die Kopfzeilen der Tabelle # <11-> +# # <11-> +# iii) table_footer: \bottomrule und das Ende der Latexumgebung tblr # <11-> +# # <11-> +# ii) row_template: Ein string mit Format angaben für die Werte in jeder Spalte, # <11-> +# (die Formatangaben stimmen nur hinter dem . mit denen für tblr überein # <11-> +# z.B. Spalte 2: table-format=4.0 aber {1.n: 0.0f}) # <11-> +# Die Zahl am Anfang der Formatangabe legt die Reihenfolge fest, # <11-> +# das .n bzw. .s bezeichnet bei unsicherheitbehafteten Werten die # <11-> +# nominalen Werte respektive die Standardabweichung. # <11-> +# .n und .s Formatangaben mit der selben Zahl davor sollten immer aufeinander folgen. # <11-> +# # <11-> +# Die drei Teile werden dann in einer Datei zusammen gesetzt: # <11-> +# Zuerst wird der table_header in die Datei geschrieben # <11-> +# dann werden die Daten, mit Hilfe einer for-loop über alle Spalten # <11-> +# (beachtet die Verwendung von zip) und dem row_template, # <11-> +# Zeile für Zeile in die Datei geschrieben. # <11-> +# Danach muss mit f.write('\n') dafür gesorgt werden, dass in der Datei eine # <11-> +# neue Zeile angefangen wird. # <11-> +# Und am Ende wird noch der table_footer in die Datei geschrieben. # <11-> +# # <11-> + # <11-> +table_header = r""" # <11-> + \begin{tblr}{ # <11-> + colspec = { # <11-> + S[table-format=1.3] # <11-> + S[table-format=4.0] # <11-> + S[table-format=1.0] # <11-> + S[table-format=4.0] # <11-> + S[table-format=1.0] # <11-> + S[table-format=1.3] # <11-> + S[table-format=1.3] # <11-> + S[table-format=4.0] # <11-> + S[table-format=1.0] # <11-> + S[table-format=4.0] # <11-> + S[table-format=1.0] # <11-> + S[table-format=1.3] # <11-> + S[table-format=1.3] # <11-> + }, # <11-> + row{1} = {guard}, # <11-> + row{2} = {guard, mode=math}, # <11-> + vline{3,5,7,9,11,13} = {2}{-}{text=\clap{\pm}}, # <11-> + } # <11-> + \toprule # <11-> + & # <11-> + \SetCell[c=6]{c} Messung: Kugel & & & & & & # <11-> + \SetCell[c=6]{c} Messung: Zylinder & & & & & \\ # <11-> + \cmidrule[lr]{2-7}\cmidrule[lr]{8-14} # <11-> + h \mathbin{/} \unit{\meter} &% # <11-> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% # <11-> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% # <11-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% # <11-> + \SetCell[c=2]{c} F_\text{i} \mathbin{/} 1 & &% # <11-> + \SetCell[c=2]{c} F_\text{f} \mathbin{/} 1 & &% # <11-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ # <11-> + \midrule # <11-> +""" # <11-> + # <11-> + # <11-> +table_footer = r""" \bottomrule # <11-> + \end{tblr} # <11-> +""" # <11-> + # <11-> + # <11-> +row_template = ( # <11-> + r"{0.n:1.3f} & {1.n:0.0f} & {1.s:0.0f} & {2.n:0.0f} & {2.s:0.0f}& {3.n:1.3f} & {3.s:1.3f} & {4.n:0.0f} & {4.s:0.0f}& {5.n:0.0f} & {5.s:0.0f}& {6.n:1.3f} & {6.s:1.3f} \\" # <11-> +) # <11-> + # <11-> + # <11-> + # <11-> +with open("build/table_all-measurements.tex", "w") as f: # <11-> + f.write(table_header) # <11-> + for row in zip(h_b, Fi_b, Ff_b, t_b, Fi_c, Ff_c, t_c): # <11-> + f.write(row_template.format(*row)) # <11-> + f.write("\n") # <11-> + f.write(table_footer) # <11-> + # <11-> + # <11-> +# second: writing the averaged values and leaving out the frames # <11-> +# heights_ball, durations_ball, durations_cylinder # <11-> +# have not been reduced to 6 values each # <11-> + # <11-> + # <11-> +table_header = r""" # <11-> + \begin{tblr}{ # <11-> + colspec = { # <11-> + S[table-format=1.3] # <11-> + S[table-format=2.3] # <11-> + S[table-format=1.4] # <11-> + S[table-format=3.3] # <11-> + S[table-format=1.5] # <11-> + }, # <11-> + row{1} = {guard}, # <11-> + row{2} = {guard, mode=math}, # <11-> + vline{3,5,7,9} = {2}{-}{text=\clap{\pm}}, # <11-> + } # <11-> + \toprule # <11-> + & # <11-> + \SetCell[c=2]{c} Messung: Kugel & & # <11-> + \SetCell[c=2]{c} Messung: Zylinder &\\ # <11-> + \cmidrule[lr]{2-3}\cmidrule[lr]{4-5} # <11-> + h \mathbin{/} \unit{\meter} &% # <11-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second} & &% # <11-> + \SetCell[c=2]{c} t \mathbin{/} \unit{\second}& \\ # <11-> + \midrule # <11-> +""" # <11-> + # <11-> + # <11-> +table_footer = r""" \bottomrule # <11-> + \end{tblr} # <11-> +""" # <11-> + # <11-> + # <11-> +row_template = ( # <11-> + r"{0.n:1.3f} & {1.n:1.3f} & {1.s:1.3f} & {2.n:1.3f} & {2.s:1.3f} \\" # <11-> +) # <11-> + # <11-> + # <11-> +with open("build/table_averaged-measurements.tex", "w") as f: # <11-> + f.write(table_header) # <11-> + for row in zip(h_b_mean, t_b_mean, t_c_mean): # <11-> + f.write(row_template.format(*row)) # <11-> + f.write("\n") # <11-> + f.write(table_footer) # <11-> + # <11-> + From b1657f13e3259b8ccb261b79313422cfc4c2b47b Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 00:58:24 +0200 Subject: [PATCH 72/80] add python 'libraies' as an example --- .../example-report/templates/curve_fit.py | 29 +++++++++++++++++++ .../templates/latex_formatting.py | 23 +++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 exercises-toolbox/8-all/example-report/templates/curve_fit.py create mode 100644 exercises-toolbox/8-all/example-report/templates/latex_formatting.py diff --git a/exercises-toolbox/8-all/example-report/templates/curve_fit.py b/exercises-toolbox/8-all/example-report/templates/curve_fit.py new file mode 100644 index 00000000..2da5e3dc --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/curve_fit.py @@ -0,0 +1,29 @@ +import numpy as np +import scipy.optimize +import uncertainties as unc +import uncertainties.unumpy as unp + + +def ucurve_fit(f, x, y, **kwargs): + """ + Uncertainties wrapper around curve_fit + y can be a uarray with uncertainties + and the parameters are returned as uncertainties.correlated_values + """ + if np.any(unp.std_devs(y) == 0): + sigma = None + abs_sigma = False + else: + sigma = unp.std_devs(y) + abs_sigma = True + + popt, pcov = scipy.optimize.curve_fit( + f, + x, + unp.nominal_values(y), + sigma=sigma, + absolute_sigma=abs_sigma, + **kwargs, + ) + + return unc.correlated_values(popt, pcov) diff --git a/exercises-toolbox/8-all/example-report/templates/latex_formatting.py b/exercises-toolbox/8-all/example-report/templates/latex_formatting.py new file mode 100644 index 00000000..61069449 --- /dev/null +++ b/exercises-toolbox/8-all/example-report/templates/latex_formatting.py @@ -0,0 +1,23 @@ +import numpy as np +from uncertainties.unumpy import ( + std_devs as stds, +) + +def make_qty(num, unit, exp="", figures=None, formatting=None): + """Format an uncertainties ufloat as a \qty quantity""" + if np.any(stds([num])): + if figures is None: + figures = "" + x = f"{num:.{figures:}uf}".replace("/", "") + else: + x = f"{num:.{figures:}f}" + if exp and not str(exp).startswith('e'): + exp = 'e' + str(exp) + if formatting: + return rf"\qty[{formatting}]{{{x}{exp}}}{{{unit}}}" + + return rf"\qty{{{x}{exp}}}{{{unit}}}" + + + + From 90a882a40585f3000ac904442e1e0118720cfb2d Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 00:59:08 +0200 Subject: [PATCH 73/80] update makefile for last step --- .../8-all/example-report/Makefile | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index f12e12df..cc65db7d 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -95,15 +95,9 @@ solution_makefile_files = $(addsuffix Makefile-loesung, $(wordlist 2,5,$(solutio target_makefile_files = $(addsuffix v16516/Makefile, $(wordlist 10,11,$(solution_dirs))) makefile_files = $(solution_makefile_files) $(target_makefile_files) -all: run - -run:$(task_files) \ - $(python_files) \ - $(data_files) \ - $(tex_files) \ - $(setup_image_files) \ - $(makefile_files) +python_libs = $(addprefix build/example-report-step-11/loesung/v16516/, curve_fit.py latex_formatting.py) +run: all # Run all Makefile-loesung set -- $(wordlist 1, 5,$(solution_dirs)); \ for i do\ @@ -119,7 +113,23 @@ run:$(task_files) \ for i do\ make -C $$i -f Makefile; \ done - + # copy the final report into the first step_dir + cp $(addsuffix v16516/build/v16516.pdf,$(word 11, $(solution_dirs))) $(addsuffix v16516.pdf,$(word 1, $(solution_dirs))) + + +all: $(task_files) \ +$(python_files) \ +$(data_files) \ +$(tex_files) \ +$(setup_image_files) \ +$(makefile_files)\ +$(python_libs) + +$(word 1, $(python_libs)): templates/curve_fit.py | $(report_dirs) + cp $< $@ + +$(word 2, $(python_libs)): templates/latex_formatting.py | $(report_dirs) + cp $< $@ build/example-report-step-%/aufgabe.txt &: $(template_task_files) | $(step_dirs) From af64bf37a838ebe21d5c9db15aabb848f97d877a Mon Sep 17 00:00:00 2001 From: chrbeckm <32388722+chrbeckm@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:30:34 +0200 Subject: [PATCH 74/80] Rename Makefile to Makefile-loesung --- .../8-all/example-report/{Makefile => Makefile-loesung} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises-toolbox/8-all/example-report/{Makefile => Makefile-loesung} (100%) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile-loesung similarity index 100% rename from exercises-toolbox/8-all/example-report/Makefile rename to exercises-toolbox/8-all/example-report/Makefile-loesung From dfbf4d288c4bb2f493fec7cb40c07a8cc614f39a Mon Sep 17 00:00:00 2001 From: Christian Beckmann Date: Fri, 4 Oct 2024 10:51:03 +0200 Subject: [PATCH 75/80] example report grammar check part 1 --- .../templates/aufgabe-step-01.txt | 17 +++++-------- .../templates/aufgabe-step-02.txt | 24 +++++++++---------- .../templates/aufgabe-step-03.txt | 15 +++++------- .../templates/aufgabe-step-04.txt | 11 ++++----- 4 files changed, 29 insertions(+), 38 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt index b22f253d..8fad799b 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt @@ -9,23 +9,18 @@ näher kommen können, indem ihr jeweils ein Thema des Workshops pro Aufgabe int Um zu wissen, wo es hingeht, findet ihr auch in diesem Ordner schon das vollständige Protokoll zum Ansehen. Aufgabe: -Heute fällt diese Aufgabe noch nicht zu umfangreich aus. Es geht zunächst nur um das erstellen -des Ordners in dem ihr diese Aufgabe immer weiter ergänzt. +Heute fällt diese Aufgabe noch nicht zu umfangreich aus. Es geht zunächst nur um das Erstellen +des Ordners, in dem ihr diese Aufgabe immer weiter ergänzt. -1) Erstellt (z.B. in einem Ordner unter ~/Documents) einen neuen Ordner mit dem Namem v16516. +1) Erstellt (z.B. in einem Ordner unter ~/Documents) einen neuen Ordner mit dem Namen v16516. + Oder nutzt unsere Protokollvorlage: https://github.com/pep-dortmund/toolbox-workshop-protocol-template 2) Kopiert den Ordner data aus diesem Aufgabenordner in den Ordner v16516. -Das war es schon, morgen gehts weiter. +Das war es schon, morgen geht's weiter. Erklärung: Im Ordner 'v16516' befindet sich noch nicht viel, nur eine leere Pythondatei und ein Ordner 'data' in dem sich die Textdateien mit den Messwerten befinden, die ihr für die Auswertung verwenden werdet. Das spaßige Abtippen -der Messwerte aus dem Laborbuch, haben wir euch schonmal abgenommen. ;) - - - - - - +der Messwerte aus dem Laborbuch haben wir euch schonmal abgenommen. ;) \ No newline at end of file diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt index 4bda13cc..253cb9c1 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt @@ -1,20 +1,20 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: -Mit den Informationen zu numpy habt ihr nun die Möglichkeit die Messwerte aus dem Ordner 'data' +Mit den Informationen zu numpy habt ihr nun die Möglichkeit, die Messwerte aus dem Ordner 'data' einzulesen und zu verarbeiten. 1. Importiert numpy in der Datei 'auswertung.py', lest die Messwerte in den Dateien im Ordner 'data' ein - (achtet auf die Angabe der Einheiten zu den Messwerten) -2. Gebt diese auf das Terminal aus um zu sehen ob, die Werte richtig geladen wurden -3. Berechnet mit den Daten folgende Werte (die Gleichungen stehen im fertigen Beispiel-Protokoll) - - Radius r von Ball und Zylinder - - Trägheitsmoment I von Ball und Zylinder - - Zeitdauern t für das Herabrollen beider Objekte -4. Gebt auch diese berechneten Werte auf das Terminal aus, um diese zu überprüfen -5. Die Messung wurde für jede Höhe dreifach durchgeführt. Berechnet für jede Höhe - jeweils den zugehörigen Mittelwert der Zeitdauern + (achtet auf die Angabe der Einheiten zu den Messwerten). +2. Gebt diese auf das Terminal aus, um zu sehen, ob die Werte richtig geladen wurden. +3. Berechnet mit den Daten folgende Werte (die Gleichungen stehen im fertigen Beispiel-Protokoll): + - Radius r von Ball und Zylinder, + - Trägheitsmoment I von Ball und Zylinder, + - Zeitdauern t für das Herabrollen beider Objekte. +4. Gebt auch diese berechneten Werte auf das Terminal aus, um diese zu überprüfen. +5. Die Messung wurde für jede Höhe dreifach durchgeführt. Berechnet für jede Höhe + jeweils den zugehörigen Mittelwert der Zeitdauern. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt index a7ae8c2f..2cfdc735 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt @@ -1,7 +1,7 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. Aufgabe: @@ -17,11 +17,8 @@ Die Berechnung von Ausgleichskurven wird erst durch eine weitere Bibliothek (sci Jedoch könnt ihr den Verlauf der theoretischen Funktionen bereits in die Plots einzeichnen. 3. Schreibt jeweils eine Python-Funktion für die Gleichungen t_B(h) und t_Z(h) (Gleichungen 4 und 5 im Protokoll). - Lls Wert für g könnt ihr 9.81 verwenden (auch dafür wird scipy noch eine bessere Lösung sein) -4. Erstellt mit np.linspace ein array mit vielen Werten die für den Plot der Theorie-Funktion verwendet werden können. - (da matplotlib im Prinzip einzelne Punkte zeichnet bzw. diese mit Geraden verbindet, braucht man für Theorie-Funktion + Als Wert für g könnt ihr 9.81 m/s² verwenden (auch dafür wird scipy noch eine bessere Lösung sein). +4. Erstellt mit np.linspace ein array mit vielen Werten, die für den Plot der Theorie-Funktion verwendet werden können. + (Da matplotlib im Prinzip einzelne Punkte zeichnet bzw. diese mit Geraden verbindet, braucht man für Theorie-Funktion sehr viele Punkte und kann nicht einfach nur die Messwerte für h verwenden.) -5. Ergänzt die Theorie-Funktion im jeweiligen plot der Messwerte. - - - +5. Ergänzt die Theorie-Funktion im jeweiligen Plot der Messwerte. \ No newline at end of file diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt index 48e2659f..ecc1254a 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt @@ -1,10 +1,9 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. - Aufgabe: Mit den Informationen zu scipy könnt ihr nun die Theorie-Funktionen aus der letzten Aufgabe zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter bestimmen. @@ -12,8 +11,8 @@ zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter best 1. Ändert die Theorie-Funktionen aus der letzten Aufgabe zu Fit-Funktionen, diese benötigen zusätzliche Argumente für die Fit-Parameter. Und diese Fit-Parameter müssen auch in der Funktion verwendet werden. Konkret: - - Die Fallbeschleunigung g die in der letzten Aufgabe als 9.81 angenommen wurde, ist jetzt ein - Fit-Parameter g. + - Die Fallbeschleunigung g, die in der letzten Aufgabe als 9.81 m/s² angenommen wurde, + ist jetzt ein Fit-Parameter g. - Außerdem ist noch ein weiterer Parameter t0 nötig, wie ihr dem finalen Beispielprotokoll entnehmen könnt. 2. Importiert die Funktion curve_fit aus scipy.optimize. @@ -29,6 +28,6 @@ zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter best 6. Im finalen Beispielprotokoll wurden auch das Trägheitsmoment der Objekte durch einen weiteren Fit bestimmt (dabei ist dann der Theoriewert von g anzunehmen). - Ergänzt die notwendigen Fit-Funktionen und Plots für diesen Auswertungsschritt in dem ihr die + Ergänzt die notwendigen Fit-Funktionen und Plots für diesen Auswertungsschritt, in dem ihr die vorangegangenen Schritte für diesen Fit wiederholt. From a3a1e7062554c93796e6e08be0689307f18a6f46 Mon Sep 17 00:00:00 2001 From: Christian Beckmann Date: Fri, 4 Oct 2024 11:13:46 +0200 Subject: [PATCH 76/80] grammar check part 2 --- .../templates/aufgabe-step-05.txt | 13 ++++++------- .../templates/aufgabe-step-06.txt | 18 +++++++----------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt index 3762460f..923ffbee 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt @@ -1,10 +1,9 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. - Aufgabe: Mit den Informationen zu uncertainties könnt ihr jetzt den Umgang mit Messunsicherheiten in die Auswertung aufnehmen. Die Messdaten im Ordner vorlage/v16516/data haben jetzt @@ -13,17 +12,17 @@ zusätzliche Spalten mit den jeweiligen Unsicherheiten. 1. Kopiert diese neuen Messwertdateien in euren eigenen Ordner data, um die Messwerte mit Unsicherheiten zu haben. Die alten Dateien könnt ihr überschreiben oder vorher löschen. -2. Importiert uncertainties und uncertainties.unumpy in eurer auswertung.py +2. Importiert uncertainties und uncertainties.unumpy in eurer auswertung.py. 3. Ergänzt das Einlesen der Messdaten um die zusätzlichen Spalten mit Unsicherheiten, - eine Benennung der Form l_unc für "Unsicherheit des Messwerts l" ist hier sinnvoll + eine Benennung der Form l_unc für "Unsicherheit des Messwerts l" ist hier sinnvoll. 4. Die eingelesenen Messwerte und Unsicherheiten müssen jetzt zu unsicherheitbehafteten Messwerten zusammengefügt werden. Nutzt dafür ufloat (aus uncertainties) für einzelne Werte und uarray (aus uncertainties.unumpy) für Messreihen. 5. In den Fit-Funktionen müsst ihr von allen Konstanten die Unsicherheiten entfernen, - die dafür nötige Funktion heißt nominal_values und es bietet sich an diese in + die dafür nötige Funktion heißt nominal_values und es bietet sich an, diese in abgekürzter Form zu importieren (genauso wie die Funktion std_devs): from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) dann kann die Funktion noms() verwendet werden, um die Unsicherheit eines Wertes @@ -34,5 +33,5 @@ mit Unsicherheiten zu haben. Die alten Dateien könnt ihr überschreiben oder vo der abhängige Variable müssen getrennt übergeben werden. 7. matplotlib kann auch nicht mit den Unsicherheiten umgehen: - Verwendet statt ax.plot die Funktion ax.errorbar um die Messwerte mit ihren + Verwendet statt ax.plot die Funktion ax.errorbar, um die Messwerte mit ihren Unsicherheiten darzustellen. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt index 49f1ce55..cac31293 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt @@ -1,10 +1,9 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. - Aufgabe: Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. @@ -16,22 +15,19 @@ Die ersten zwei Schritte könnt ihr überspringen, falls ihr keinen Github-Accou Das Repository könnt ihr nach Abschluss dieser Übungsreihe auch wieder löschen. Readme und Lizenz (MIT) könnt ihr trotzdem mit anlegen, um gute Angewohnheiten einzuüben. -3) Mit Github: Klont das Repository an einen Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) +3) Mit Github: Klont das Repository an einen Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox). Ohne Github: Erstellt an einem Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) einen neuen Ordner 'Beispiel-Praktikum'. Navigiert mit dem Terminal in den Ordner 'Beispiel-Praktikum' und initialisiert in diesem ein Git-Repository. -4) Kopiert den Ordner v16516 in dem ihr bisher diese Übungsreihe bearbeitet habt in den neuen Ordner 'Beispiel-Praktikum' +4) Kopiert den Ordner v16516, in dem ihr bisher diese Übungsreihe bearbeitet habt, in den neuen Ordner 'Beispiel-Praktikum'. 5) Erstellt in dem neuen Ordner 'Beispiel-Praktikum' eine neue Datei mit dem Namen '.gitignore'. - Schreibt in die erste Zeile dieser neuen Datei '*.pdf', damit git alle pdf-Dateien zu ignorieren. + Schreibt in die erste Zeile dieser neuen Datei '*.pdf', damit git alle pdf-Dateien ignoriert. Verschafft euch einen Überblick über die Dateien im git-Repository (git status) und fügt dem Repository alle notwendigen Dateien hinzu (git add, git commit). - Mit Github: Laded die Änderungen auf Github hoch. + Mit Github: Ladet die Änderungen auf Github hoch. 6) Mit Github (Optional): Ihr könntet die nächsten Schritte in dieser Übungsreihe im Team machen - (z.B. abwechselnd) und so noch etwas Erfahrung im gemeinsamen Umgang mit git und Github sammeln. - - - + (z.B. abwechselnd) und so noch etwas Erfahrung im gemeinsamen Umgang mit git und Github sammeln. \ No newline at end of file From ea88c76416e00a5126b7e78efd3a24a29678c1f2 Mon Sep 17 00:00:00 2001 From: Christian Beckmann Date: Fri, 4 Oct 2024 11:14:06 +0200 Subject: [PATCH 77/80] grammar check part 3 --- .../8-all/example-report/templates/aufgabe-step-07.txt | 4 ++-- .../8-all/example-report/templates/aufgabe-step-08.txt | 4 ++-- .../8-all/example-report/templates/aufgabe-step-09.txt | 4 ++-- .../8-all/example-report/templates/aufgabe-step-10.txt | 4 ++-- .../8-all/example-report/templates/aufgabe-step-11.txt | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt index 5a2d8278..e229d7fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt @@ -1,5 +1,5 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt index 5a2d8278..e229d7fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt @@ -1,5 +1,5 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt index 5a2d8278..e229d7fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt @@ -1,5 +1,5 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt index 5a2d8278..e229d7fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt @@ -1,5 +1,5 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt index 5a2d8278..e229d7fa 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt @@ -1,5 +1,5 @@ -# Beispiel Protokoll +# Realistisches-Beispiel-Protokoll Einleitung: -Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den +Um dieser Aufgabe sinnvoll folgen zu können, sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. From afff16a1cef00f63308ff9497264cc574cc33680 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 11:15:51 +0200 Subject: [PATCH 78/80] rephrased the task files + languagetool spellchecking --- .../templates/aufgabe-step-01.txt | 36 ++++++++++++------- .../templates/aufgabe-step-02.txt | 16 ++++----- .../templates/aufgabe-step-03.txt | 6 ++-- .../templates/aufgabe-step-04.txt | 4 +-- .../templates/aufgabe-step-05.txt | 8 +++-- .../templates/aufgabe-step-06.txt | 16 ++++----- .../templates/aufgabe-step-07.txt | 31 ++++++++++++++++ .../templates/aufgabe-step-08.txt | 14 ++++++++ .../templates/aufgabe-step-09.txt | 24 +++++++++++++ .../templates/aufgabe-step-10.txt | 18 ++++++++++ .../templates/aufgabe-step-11.txt | 31 ++++++++++++++++ 11 files changed, 165 insertions(+), 39 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt index b22f253d..97e02347 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-01.txt @@ -1,28 +1,38 @@ -# Realistisches-Beispiel-Protokoll +# Beispiel Protokoll Einleitung: - -Wie der Name der Aufgabe schon verspricht, werdet ihr im Zuge dieser Aufgabe ein vollständiges +Wie der Name der Aufgabe schon verspricht, werdet ihr im Zuge dieser Aufgabenreihe ein vollständiges und realistisches Versuchsprotokoll erstellen. Diesem Ziel werdet ihr Aufgabe für Aufgabe etwas näher kommen können, indem ihr jeweils ein Thema des Workshops pro Aufgabe integriert. +Diese Aufgabenreihe hat 11 Schritte: +01) Erstellen eines neuen Ordners für das Protokoll +02) Daten mit numpy einlesen und verarbeiten +03) Daten und Funktionen mit Matplotlib plotten +04) Ausgleichsrechnung mit scipy durchführen und plotten +05) Unsicherheiten mit uncertainties in die Auswertung integrieren +06) Ein git-Repository erstellen +07) Struktur des LaTeX-Dokuments erstellen +08) Mathematik im LaTeX-Dokument ergänzen +09) Ergänzen von Bildern, Tabellen, einem Literaturverzeichnis und Referenzen +10) TeX und Matplotlib Einstellungen und Makefile hinzufügen +11) Noch etwas mehr Automatisierung + Um zu wissen, wo es hingeht, findet ihr auch in diesem Ordner schon das vollständige Protokoll zum Ansehen. +Außerdem könnt ihr aus diesem die Texte kopieren, damit ihr diese nicht vollständig abtippen müsst. -Aufgabe: -Heute fällt diese Aufgabe noch nicht zu umfangreich aus. Es geht zunächst nur um das erstellen -des Ordners in dem ihr diese Aufgabe immer weiter ergänzt. +Der Ordner loesung ist immer auf dem Stand auf dem euer Ordner nach Bearbeitung der +Aufgabe sein sollte. -1) Erstellt (z.B. in einem Ordner unter ~/Documents) einen neuen Ordner mit dem Namem v16516. -2) Kopiert den Ordner data aus diesem Aufgabenordner in den Ordner v16516. +Aufgabe: +Es geht zunächst nur um das Erstellen des Ordners in dem ihr diese Aufgabe immer weiter ergänzt. -Das war es schon, morgen gehts weiter. +1) Erstellt (z.B. in einem Ordner unter ~/Documents) einen neuen Ordner mit dem Namen v16516. -Erklärung: +2) Kopiert den Ordner data aus diesem Aufgabenordner in den Ordner v16516. -Im Ordner 'v16516' befindet sich noch nicht viel, nur eine leere Pythondatei und ein Ordner 'data' in dem sich -die Textdateien mit den Messwerten befinden, die ihr für die Auswertung verwenden werdet. Das spaßige Abtippen -der Messwerte aus dem Laborbuch, haben wir euch schonmal abgenommen. ;) +3) Erstellt in dem Ordner v16516 eine leere Pythondatei 'auswertung.py'. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt index 4bda13cc..8040025b 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-02.txt @@ -8,13 +8,13 @@ Aufgabe: Mit den Informationen zu numpy habt ihr nun die Möglichkeit die Messwerte aus dem Ordner 'data' einzulesen und zu verarbeiten. -1. Importiert numpy in der Datei 'auswertung.py', lest die Messwerte in den Dateien im Ordner 'data' ein +1) Importiert numpy in der Datei 'auswertung.py', lest die Messwerte in den Dateien im Ordner 'data' ein (achtet auf die Angabe der Einheiten zu den Messwerten) -2. Gebt diese auf das Terminal aus um zu sehen ob, die Werte richtig geladen wurden -3. Berechnet mit den Daten folgende Werte (die Gleichungen stehen im fertigen Beispiel-Protokoll) - - Radius r von Ball und Zylinder - - Trägheitsmoment I von Ball und Zylinder - - Zeitdauern t für das Herabrollen beider Objekte -4. Gebt auch diese berechneten Werte auf das Terminal aus, um diese zu überprüfen -5. Die Messung wurde für jede Höhe dreifach durchgeführt. Berechnet für jede Höhe +2) Gebt diese auf das Terminal aus, um zu sehen, ob die Werte richtig geladen wurden +3) Berechnet mit den Daten folgende Werte (die Gleichungen stehen im fertigen Beispiel-Protokoll) + - Radius r von Ball und Zylinder + - Trägheitsmoment I von Ball und Zylinder + - Zeitdauern t für das Herabrollen beider Objekte (Mittelung über gleiche Höhen) +4) Gebt auch diese berechneten Werte auf das Terminal aus, um diese zu überprüfen +5) Die Messung wurde für jede Höhe dreifach durchgeführt. Berechnet für jede Höhe jeweils den zugehörigen Mittelwert der Zeitdauern diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt index a7ae8c2f..2ea13a9b 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-03.txt @@ -17,10 +17,8 @@ Die Berechnung von Ausgleichskurven wird erst durch eine weitere Bibliothek (sci Jedoch könnt ihr den Verlauf der theoretischen Funktionen bereits in die Plots einzeichnen. 3. Schreibt jeweils eine Python-Funktion für die Gleichungen t_B(h) und t_Z(h) (Gleichungen 4 und 5 im Protokoll). - Lls Wert für g könnt ihr 9.81 verwenden (auch dafür wird scipy noch eine bessere Lösung sein) -4. Erstellt mit np.linspace ein array mit vielen Werten die für den Plot der Theorie-Funktion verwendet werden können. - (da matplotlib im Prinzip einzelne Punkte zeichnet bzw. diese mit Geraden verbindet, braucht man für Theorie-Funktion - sehr viele Punkte und kann nicht einfach nur die Messwerte für h verwenden.) + Als Wert für g könnt ihr 9.81 verwenden (auch dafür wird scipy noch eine bessere Lösung sein) +4. Erstellt mit np.linspace ein array mit vielen Werten, die für den Plot der Theorie-Funktion verwendet werden können. (Da matplotlib im Prinzip einzelne Punkte zeichnet bzw. diese mit Geraden verbindet, braucht man für Theorie-Funktion sehr viele Punkte und kann nicht einfach nur die Messwerte für h verwenden.) 5. Ergänzt die Theorie-Funktion im jeweiligen plot der Messwerte. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt index 48e2659f..3d3a1ef8 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-04.txt @@ -10,7 +10,7 @@ Mit den Informationen zu scipy könnt ihr nun die Theorie-Funktionen aus der let zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter bestimmen. 1. Ändert die Theorie-Funktionen aus der letzten Aufgabe zu Fit-Funktionen, diese benötigen - zusätzliche Argumente für die Fit-Parameter. Und diese Fit-Parameter müssen auch in der + zusätzliche Argumente für die Fit-Parameter und diese Fit-Parameter müssen auch in der Funktion verwendet werden. Konkret: - Die Fallbeschleunigung g die in der letzten Aufgabe als 9.81 angenommen wurde, ist jetzt ein Fit-Parameter g. @@ -28,7 +28,7 @@ zu Fit-Funktionen abändern und so physikalische Größen als Fit-Parameter best mit den berechneten Parametern hinzu. 6. Im finalen Beispielprotokoll wurden auch das Trägheitsmoment der Objekte durch einen weiteren - Fit bestimmt (dabei ist dann der Theoriewert von g anzunehmen). + Fit bestimmt (dabei ist dann der theoretische Wert von g anzunehmen). Ergänzt die notwendigen Fit-Funktionen und Plots für diesen Auswertungsschritt in dem ihr die vorangegangenen Schritte für diesen Fit wiederholt. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt index 3762460f..2977ba43 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-05.txt @@ -7,16 +7,16 @@ Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'exampl Aufgabe: Mit den Informationen zu uncertainties könnt ihr jetzt den Umgang mit Messunsicherheiten -in die Auswertung aufnehmen. Die Messdaten im Ordner vorlage/v16516/data haben jetzt +in die Auswertung aufnehmen. Die Messdaten im Ordner data haben jetzt zusätzliche Spalten mit den jeweiligen Unsicherheiten. 1. Kopiert diese neuen Messwertdateien in euren eigenen Ordner data, um die Messwerte -mit Unsicherheiten zu haben. Die alten Dateien könnt ihr überschreiben oder vorher löschen. +mit Unsicherheiten verwenden zu können. Die alten Dateien könnt ihr überschreiben oder vorher löschen. 2. Importiert uncertainties und uncertainties.unumpy in eurer auswertung.py 3. Ergänzt das Einlesen der Messdaten um die zusätzlichen Spalten mit Unsicherheiten, - eine Benennung der Form l_unc für "Unsicherheit des Messwerts l" ist hier sinnvoll + eine Benennung der Form l_unc für "Unsicherheit des Messwerts l" ist hier sinnvoll. 4. Die eingelesenen Messwerte und Unsicherheiten müssen jetzt zu unsicherheitbehafteten Messwerten zusammengefügt werden. Nutzt dafür ufloat (aus uncertainties) für einzelne Werte @@ -25,7 +25,9 @@ mit Unsicherheiten zu haben. Die alten Dateien könnt ihr überschreiben oder vo 5. In den Fit-Funktionen müsst ihr von allen Konstanten die Unsicherheiten entfernen, die dafür nötige Funktion heißt nominal_values und es bietet sich an diese in abgekürzter Form zu importieren (genauso wie die Funktion std_devs): + from uncertainties.unumpy import (nominal_values as noms, std_devs as stds) + dann kann die Funktion noms() verwendet werden, um die Unsicherheit eines Wertes zu entfernen. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt index 49f1ce55..b67fa7d6 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-06.txt @@ -6,31 +6,29 @@ Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'exampl Aufgabe: -Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt -am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. +Diesmal arbeitet ihr nicht am Protokoll weiter. Das Ziel soll es sein, euren bisherigen (und zukünftigen) Fortschritt am Beispielprotokoll in einem Git-Repository zu speichern und auf Github hochzuladen. Die ersten zwei Schritte könnt ihr überspringen, falls ihr keinen Github-Account anlegen wollt. 1) Erstellt euch einen Github-Account und einen ssh-key für die Authentifikation (siehe git-Foliensatz). 2) Erstellt unter eurem Github-Account ein neues Repository 'Beispiel-Praktikum'. -Das Repository könnt ihr nach Abschluss dieser Übungsreihe auch wieder löschen. +Das Repository könnt ihr nach Abschluss dieser Aufgabenreihe auch wieder löschen. Readme und Lizenz (MIT) könnt ihr trotzdem mit anlegen, um gute Angewohnheiten einzuüben. -3) Mit Github: Klont das Repository an einen Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) +3) Mit Github: Klont das Repository an einen Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox). - Ohne Github: Erstellt an einem Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) einen neuen Ordner 'Beispiel-Praktikum'. - Navigiert mit dem Terminal in den Ordner 'Beispiel-Praktikum' und initialisiert in diesem ein Git-Repository. +Ohne Github: Erstellt an einem Ort eurer Wahl (z.B. ~/Documents/Uni/Toolbox) einen neuen Ordner 'Beispiel-Praktikum'. Navigiert mit dem Terminal in den Ordner 'Beispiel-Praktikum' und initialisiert in diesem ein Git-Repository. -4) Kopiert den Ordner v16516 in dem ihr bisher diese Übungsreihe bearbeitet habt in den neuen Ordner 'Beispiel-Praktikum' +4) Kopiert den Ordner v16516, in dem ihr bisher diese Aufgabenreihe bearbeitet habt, in den neuen Ordner 'Beispiel-Praktikum' 5) Erstellt in dem neuen Ordner 'Beispiel-Praktikum' eine neue Datei mit dem Namen '.gitignore'. Schreibt in die erste Zeile dieser neuen Datei '*.pdf', damit git alle pdf-Dateien zu ignorieren. Verschafft euch einen Überblick über die Dateien im git-Repository (git status) und fügt dem Repository alle notwendigen Dateien hinzu (git add, git commit). - Mit Github: Laded die Änderungen auf Github hoch. + Mit Github: Ladet die Änderungen auf Github hoch. -6) Mit Github (Optional): Ihr könntet die nächsten Schritte in dieser Übungsreihe im Team machen +6) Mit Github (Optional): Ihr könntet die nächsten Schritte in dieser Aufgabenreihe im Team machen (z.B. abwechselnd) und so noch etwas Erfahrung im gemeinsamen Umgang mit git und Github sammeln. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt index 5a2d8278..3ca19fc6 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-07.txt @@ -3,3 +3,34 @@ Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + + +Aufgabe: +Die Auswertung mit python ist nun erst einmal abgeschlossen. Nun wenden wir uns +dem LaTeX-Dokument zu: + +1) Erstellt im Ordner v16516 den folgenden Ordner und die folgenden Dateien. + Ordner: + - content + Dateien: + - v16516.tex + - content/durchfuehrung.tex + - content/theorie.tex + - content/auswertung.tex + - content/diskussion.tex + +2) Erstellt in dem Git-Respository (das euren Ordner v16516) enthält + eine Datei header.tex + +3) Ergänzt die zu diesem Zeitpunkt notwendigen Pakete in der Datei header.tex. + (Ihr könnt diese Datei auch aus dem Ordner loesung kopieren, aber ändert die Information zu den Autoren am Ende der Datei.) + + +4) Verwendet den Befehl \input, um die anderen tex-Dateien in die Datei v16516.tex einzufügen. + +5) Ergänzt die Überschriften für die Abschnitte in den jeweiligen tex-Dateien im Ordner content. + +6) Im Ordner loesung/v16516 findet ihr die Datei v16516.pdf. Ergänzt die übrigen Texte aus dieser Datei, + sodass euer aktuelles Protokoll genauso aussieht wie die Lösung. + +7) Nicht vergessen: Haltet euren Fortschritt mit git nach. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt index 5a2d8278..b04e703b 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-08.txt @@ -3,3 +3,17 @@ Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + +Aufgaben: + +1) Je nachdem welche header.tex ihr verwendet kann es nötig sein, diese um weiter Pakete zu ergänzen. +Schaut z.B. im Ordner loesung nach. + +2) Ergänzt alle mathematischen Gleichungen und Symbole. Dafür könnt ihr das finale Protokoll aus Schritt 1 + oder die Lösung für diese Aufgabe in loesung/v16516/v16516.pdf als Vorlage nehmen. + +3) Im Ordner loesung/v16516 findet ihr die Datei v16516.pdf. Ergänzt die übrigen Texte aus dieser Datei, + sodass euer aktuelles Protokoll genauso aussieht wie die Lösung. + +4) Nicht vergessen: Haltet euren Fortschritt mit git nach. + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt index 5a2d8278..5b5890e0 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-09.txt @@ -3,3 +3,27 @@ Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + + +Aufgaben: + +1) Je nachdem welche header.tex ihr verwendet kann es nötig sein, diese um weiter Pakete zu ergänzen. +Schaut z.B. im Ordner loesung nach. + +2) Fügt eurem Order v16516 den Ordner graphics mit der enthaltenen Bilddatei hinzu. + Ergänzt das Bild für den Versuchsaufbau im Protokoll. + +3) Ergänzt die beiden Messwert-Tabellen. + +4) Fügt eurem Git-Repository die bib-Dateien lit.bib und programme.bib hinzu und ladet diese + in header.tex falls noch nicht geschehen. + +6) Ergänzt die Referenzen auf die drei Quellen. + +7) Schaut im finalen Protokoll nach welche Objekte Referenziert werden und ergänzt entsprechende + \label und Referenzen mit \autoref und \eqref + +8) Im Ordner loesung/v16516 findet ihr die Datei v16516.pdf. Ergänzt die übrigen Texte aus dieser Datei, + sodass euer aktuelles Protokoll genauso aussieht wie die Lösung. + +9) Nicht vergessen: Haltet euren Fortschritt mit git nach. diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt index 5a2d8278..4b81d3ac 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-10.txt @@ -3,3 +3,21 @@ Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + + +Aufgaben: +1) Fügt eurem Git-Repository die Dateien matplotlibrc und header-matplotlib.tex hinzu. + +2) Fügt eurem Ordner v16516 ein Makefile hinzu. Und ergänzt die notwendigen Regeln für dieses Protokoll. + (Versucht es erst selbst bevor ihr in die Lösung schaut, ihr könnt euch dabei an den Folien orientieren.) + +3) Ändert die Datei auswertung.py so ab, dass die Plots in einem Unterordner build erstellt werden. + +4) Ändert die Stellen im Protokoll an denen die Bilddateien geladen werden ebenfalls so ab, + das diese Dateien jetzt im Ordner build/ gesucht werden. + +5) Im Ordner loesung/v16516 findet ihr die Datei v16516.pdf. Ergänzt die übrigen Texte aus dieser Datei, + sodass euer aktuelles Protokoll genauso aussieht wie die Lösung. + +6) Nicht vergessen: Haltet euren Fortschritt mit git nach. + diff --git a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt index 5a2d8278..4a40232a 100644 --- a/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt +++ b/exercises-toolbox/8-all/example-report/templates/aufgabe-step-11.txt @@ -3,3 +3,34 @@ Einleitung: Um dieser Aufgabe sinnvoll folgen zu können sollte diese von Anfang an bearbeitet werden. Folgt den Anweisungen in den 'aufgabe.txt' Dateien in den Unterordnern des Ordners 'example-report'. + +Aufgabe: + +Die Änderung von Schritt 10 zu diesem sind etwas fortgeschrittener. Es ist bei weitem nicht notwendig, +diese von Tag Eins an im Praktikum zu verwenden. Die Änderungen sind aber nicht nur sinnvoll für die +gute wissenschaftliche Praxis (weniger manuelle Eingaben) sondern sogar etwas entlastend (weniger +manuelle Eingaben). + +Folgendes wird in diesem letzten Schritt ergänzt. Ihr könnt es selbst probieren oder einfach +den Ordner loesung ansehen, um einen Überblick zu bekommen. + +1) Python-Code der regelmäßig wiederverwendet wird lässt sich in eine Datei auslagern. + Dies wurde mit zwei Funktionen aus anderen Übungen getan: ucurve_fit und make_qty. + Diese liegen jetzt jeweils in einer zusätzlichen Pythondatei im Ordner v16516 + und werden in auswertung.py importiert. + +2) ucurve_fit vereinfacht den Umgang von curve_fit mit Unsicherheiten. + +3) make_qty hilft dabei berechnete Werte, als siunitx \qty zu formatieren. + Dies wird vor allem dafür verwendet berechnete Werte direkt in eine Datei + im build-Ordner zu schreiben. Diese Dateien können dann mit \input direkt + im LaTeX-Protokoll importiert werden, dadurch ist weniger manuelles Abtippen nötig + und das Protokoll wird reproduzierbarer. + Auch die Fit-Parameter werden auf diese Weise exportiert. + +4) Die Erstellung von Tabellen wurde halb automatisiert. Auch hier müssen die + Messwerte jetzt nicht mehr in das LaTeX-Tabellenformat abgetippt werden. + Die Spalteneinstellungen müssen jedoch weiterhin für jede Tabelle vorgenommen werden. + Als letzte Aufgabe dieser Reihe (deren Lösung beliebig komplex werden kann): + Wie könnte man die Tabellen noch weiter automatisieren? + From b6df19310b78688552d6408f7428f5a2973b68b5 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 11:16:39 +0200 Subject: [PATCH 79/80] added files like the image to the stepfolder in which they are introduced --- exercises-toolbox/8-all/example-report/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/Makefile b/exercises-toolbox/8-all/example-report/Makefile index cc65db7d..423fc6fb 100644 --- a/exercises-toolbox/8-all/example-report/Makefile +++ b/exercises-toolbox/8-all/example-report/Makefile @@ -36,7 +36,7 @@ data_dirs_without_unc = $(wordlist 1,4,$(data_dirs)) $(word 12,$(data_dirs)) data_dirs_with_unc = $(wordlist 5,11,$(data_dirs)) $(word 13,$(data_dirs)) # build/example-report-step-{09,...,10}/loesung/v16516/graphics/ -graphics_dirs = $(addsuffix v16516/graphics/, $(wordlist 9,10,$(solution_dirs))) +graphics_dirs = $(addsuffix v16516/graphics/, $(wordlist 9,10,$(solution_dirs))) $(addsuffix graphics/, $(word 9,$(step_dirs))) # solution_dirs containing tex files solution_dirs_with_tex = $(wordlist 7,11,$(solution_dirs)) @@ -70,12 +70,12 @@ discussion_tex_files=$(addsuffix diskussion.tex, $(content_dirs)) setup_image_files = $(addsuffix versuchsaufbau.png, $(graphics_dirs)) -lit_bib_files = $(addsuffix lit.bib, $(wordlist 9,11,$(solution_dirs))) -programms_bib_files = $(addsuffix programme.bib, $(wordlist 9,11,$(solution_dirs))) +lit_bib_files = $(addsuffix lit.bib, $(wordlist 9,11,$(solution_dirs)) $(word 9,$(step_dirs))) +programms_bib_files = $(addsuffix programme.bib, $(wordlist 9,11,$(solution_dirs)) $(word 9,$(step_dirs))) bib_files = $(lit_bib_files) $(programms_bib_files) -matplotlibrc_files= $(addsuffix matplotlibrc, $(wordlist 10,11,$(solution_dirs))) -header_matplotlib_files = $(addsuffix header-matplotlib.tex, $(wordlist 10,11,$(solution_dirs))) +matplotlibrc_files= $(addsuffix matplotlibrc, $(wordlist 10,11,$(solution_dirs)) $(word 10,$(step_dirs))) +header_matplotlib_files = $(addsuffix header-matplotlib.tex, $(wordlist 10,11,$(solution_dirs)) $(word 10,$(step_dirs))) advanced_mpl_files = $(matplotlibrc_files) $(header_matplotlib_files) From ca166a321e6467a54a466e7a88b7e063beafc424 Mon Sep 17 00:00:00 2001 From: Joshua Luckey Date: Fri, 4 Oct 2024 11:16:56 +0200 Subject: [PATCH 80/80] fixed latex lines in wrong step --- .../templates/latex/durchfuehrung_tex_template | 12 ++++++------ .../templates/latex/theorie_tex_template | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template index 633327b7..44952189 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/durchfuehrung_tex_template @@ -12,11 +12,11 @@ aus den Einzelbildern (frames) des Films ablesen zu können. % <7-> Die aufgenommenen Messdaten werden für zwei unabhängige Zwecke verwendet: % <7-> % <7-> -\begin{enumerate} % <8-> - \item {Bestimmung der Fallbeschleunigung $g$, dafür werden % <8-> - die theoretischen Trägheitsmomente angenommen.} % <8-> - \item {Bestimmung der Trägheitsmomente $I$ der beiden Objekte unter Annahme der theoretischen % <8-> - Fallbeschleunigung.} % <8-> -\end{enumerate} % <8-> +\begin{enumerate} % <7-> + \item {Bestimmung der Fallbeschleunigung $g$, dafür werden % <7-> + die theoretischen Trägheitsmomente angenommen.} % <7-> + \item {Bestimmung der Trägheitsmomente $I$ der beiden Objekte unter Annahme der theoretischen % <7-> + Fallbeschleunigung.} % <7-> +\end{enumerate} % <7-> diff --git a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template index 8c41328e..ade27c4e 100644 --- a/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template +++ b/exercises-toolbox/8-all/example-report/templates/latex/theorie_tex_template @@ -52,14 +52,13 @@ t(h) = \sqrt{\frac{2l^2}{gh} \left(1 + \frac{I}{mr^2} \right)} + t_0. \label{eq:fit-function-I} % <9-> \end{equation} % <8-> % <7-> -Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <7-> -Die notwendigen physikalischen Größen der Objekte sind in \autoref{sec:Auswertung} angegeben. % <9-> +Dabei sind das Trägheitsmoment $I$ und die Startzeit $t_0$ die Parameter für die Ausgleichsrechnung. % <8-> % <7-> -Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <7-> -für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <7-> -\begin{align*} % <7-> - I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}\left(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2)\right), % <7-> -\end{align*} % <7-> +Für die Bestimmung der Gravitationsbeschleunigung $g$ unter Annahme der theoretischen Trägheitsmomente % <8-> +für Kugel $I_\text{K}$ und Hohlzylinder $I_\text{Z}$ % <8-> +\begin{align*} % <8-> + I_{\text{K}} = \frac{2}{5}mr_{\text{K}}^2 && I_{\text{Z}} = \frac{m}{2}\left(r_{\text{Z},\text{innen}}^2 + r_{\text{Z},\text{außen}}^2)\right), % <8-> +\end{align*} % <8-> ergeben sich die folgenden Ausgleichsfunktionen % <7-> % <7-> \begin{align} % <8->