======= Drehschwingung - Gruppe 342 ======= Lukas Köpp 10029243 Julius Riekenberg 10025155 ===== Aufstellen der Bewegungsgleichung ===== Wir betrachten beim Drehpendel die Kraft, die auf ein Objekt beim Drehen um die Aufhängungsachse wirkt. Diese übersetzt sich mittels des Trägheitswiderstandes in eine Winkelbeschleunigung $I \ddot{\phi} = D = - D_R \phi $ Dabei bezeichnen wir: $I$ den Trägheitsmoment, $D$ in $[Nm]$ Drehmoment, $D_R$ in $[Nm/rad]$ Winkelrichtgröße und $\phi$ in $[rad]$ Winkelauslenkung der Aufhängung. $[rad] = 1$ gibt hier nur an, dass es sich um einen Winkel im Bogenmaß handelt. Insbesondere ist die Winkelrichtgröße gegeben als $D_R = \frac{\pi}{2} \frac{G r^4}{L}$ mit $r$ Radius der Aufhängung, $G$ Torsionsmodul (Materialkonstante) und $L$ Länge des Drahtes. Wir sehen also an $D_R \propto r^4$, dass eine kleine Erhöhung im Drahtradius das Drehmoment stark beeinflusst. Verdoppeln wir die Dicke erhalten wir also $D_R' = 2^4 D_R = 16 D_R$ also eine Ver-16-fachung des Drehmoments. ===== Lösung der Bewegungsgleichung ===== Wir kennen die Basislösung $\phi(t) = A \sin{\omega t} + B \cos{\omega t}$ mit $\dot{\phi}(t) = A \omega \cos{\omega t} - B \omega \sin{\omega t}$ für die DGL. Betrachten wir nun das Auslenken des Pendels um $\phi(0) = \phi_0$ und das Loslassen ohne Anfangsgeschwindigkeit $\dot{\phi}(0) = \dot{\phi}_0$ erhalten wir $\dot{\phi}(0) = A \omega \cos{0} - B \omega \sin{0} = A \omega = 0 \rightarrow A = 0 $ $\phi_0 = B \cos{0} = \phi_0 \rightarrow B = \phi_0$ Wir erhalten also $\phi(t) = \phi_0 \cos{\omega t}$ als Bahnkurve. Einsetzen in die DGL $I \ddot{\phi} = D = - D_R \longleftrightarrow I \phi_0 (-\omega^2) \cos{\omega t} = - D_R \phi_0 \cos{\omega t} \longrightarrow \omega^2 = \frac{D_R}{I}$. Damit können wir die Periodendauer angeben $ T_{Periode} = \frac{1}{f} = \frac{1}{2 \pi \omega} = \frac{1}{2 \pi} \sqrt{\frac{I}{D_R}}$ Unter der Annahme eines harmonischen Potentials können wir die Periodendauer $T \neq T(\phi_0)$ als konstant ansehen. Somit ist $T_{Schwingungsdauer} = T_{Periode} := T$ $ T := T(L) = \frac{1}{2 \pi} \sqrt{\frac{2 I L}{\pi G r^4}} = \frac{1}{2 \pi r^2} \sqrt{\frac{2 I}{\pi G}} \cdot \sqrt{L}$ Für $T^2$ finden wir einen linearen Zusammenhang: $ T^2 = \frac{I}{2 \pi^3 G r^4} \cdot L $ ===== Durchführung ===== Wir hängen also starre Körper verschiedener Geometrien an unterschiedlichen Aufhängungen auf. Nun lenken wir die Körper um einen Anfangswinkel $\phi_0$ aus und lassen sie ohne Anfangsgeschwindigkeit los. Nun messen wir zur Verbesserung der Genauigkeit die Zeit $T_n$ über $n$ Perioden. Durch das mitteln verkleinert sich unsere Messunsicherheit in der Zeit. Abhängig von der Dämpfung Aufhängung, dem Trägheitsmoment des Körpers und dem Torsionsmodul $G$ wählen wir $\phi_0$ und $n$ sinnvoll. Der Schnürsenkel dämpft hier zum Beispiel stark, hat jedoch eine sehr geringe rücktreibende Kraft sodass wir $n$ klein und $\phi_0$ groß wählen. Wir fangen damit an, das Torsionsmodul $G$ unter Bekanntheit des Trägheitsmoments $I$ des Stabes zu bestimmen. Dies erlaubt uns, im späteren Teil des Versuches Trägheitsmomente $I$ unbekannter Körper zu bestimmen. Wir errechen auch hier ein theoretisches Trägheitsmoment und vergleichen. {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:img_20210113_185256.jpg?400|}} ===== Energiebetrachtung ===== Wir interessieren uns für eine infinitesimale Winkeländerung $d\phi$. Die Arbeit $W$ entspricht dabei $ W = \int D d\phi \longrightarrow \frac{dW}{d\phi} = \frac{d}{d\phi}\int D d\phi = D $ Umstellen liefert also $dW = D \cdot d\phi$ Betrachten wir die Rotationsenenergie $E = \frac{1}{2} I (\frac{d\phi}{dt})^2$ $\frac{dE}{dt} = \frac{dE}{d\phi}\frac{d\phi}{dt} = I \frac{d^2\phi}{dt^2} \frac{d\phi}{dt} \longleftrightarrow dE = I \ddot{\phi} \cdot d\phi $ Gleichsetzen von $E = W$ liefert schließlich mit $D = - D_R \phi$ $ I \ddot{\phi} = D = - D_R \phi $ Wir erhalten unsere DGL also auch mittels einer Energiebetrachtung. ===== Steiner'scher Satz ===== Unter Kenntnis des Trägheitsmomentes starrer Körper mit Gesamtmasse $M$ um eine feste Achse durch den Schwerpunkt $I_S$ erlaubt der Steiner'sche Satz die Berechnung des Trägheitsmomentes $I'$ um eine parrelel um $d$ verschobene Achse: $I' = I_S + M d^2 $ Zur Herleitung benötigen wir nur die Vektoraddition $\vec{x} = \vec{x'} + \vec{\delta x}$ und die Definition des Schwerpunktes als Punkt, an dem die Integrale $\int_V \rho \cdot r_i = 0$ für $r = (x,y,z)$ verschwinden. Wir betrachten also das Trägheitsmoment I' entlang einer Achse $\vec{n}$ und setzen den Urspung des Koordinatensystem in den Schwerpunkt und die z-Achse parallel zur Drehachse. Damit gilt für den Abstand r eines Punktes zur Drehachse $ r^2 = (\delta x)^2 + (\delta y)^2$ Setzen wir ein in die Definition des Trägheitsmomentes mit Massendichte $\rho$ $I' = \int_V \rho (\delta x)^2 + (\delta y)^2$ $I' = \int_V \rho (x - x')^2 + (y-y')^2$ Terme aufdröseln: $I' = \int_V \rho x^2 + y^2 + \int_V \rho x'^2 + y'^2 $ $I' = I_S + (x'^2 + y'^2) \cdot \int_V \rho - 2 y' \int_V \rho x - 2 x' \int_V \rho y$ $I' = I_S + M d^2 $ mit $d = (x'^2 + y'^2)$ ist der Steiner'sche Satz. ====== Berechnung der Trägheitsmomente mittels der Geometrie ====== Wir berechnen die Trägheitsmomente $I$ nach der Formel $ I=\int _{V}{\vec {r}}_{\perp }\!^{2}\rho ({\vec {r}})\mathrm {d} V $ wobei wir die Massendichte $\rho({\vec {r}}) = const. $ annehmen. Die hohe Unsicherheit ist damit zu erklären, dass wir keine Küchenwaage besitzen. Wir bauen uns also folgende Apparatur auf: {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:img_20210113_191426.jpg?400|}} Zuerst messen wir das Gewicht gegen die Füllhöhe der Flasche mit $u(\delta m) = 0,02 kg$. Wir rütteln, um den Einfluss der Haftreibung zu minimieren. Nun messen wir das Nullgewicht $m_0 = 0,07 \pm 0,01 kg$ der Flasche mittels einer Kippwaage. Dazu stellen wir nacheinander leere und volle Shotgläser auf die Waage auf gegenüberliegende Seiten. Mittels der Füllhöhe der Shotgläser und der Dichte von Wasser $\rho \approx 1 kg/m^3$ erhalten wir so also das Gewicht, was wir im folgenden als Summe über $m = \delta m + m_0$ schreiben werden. Die Unsicherheit ist damit $u(m) = 0,03 kg$. {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:img_20210113_192803_1.jpg?400|}} ===== Dünner Metallstab ===== Aufgrund der Prorportion $r \ll L$ können wir eine Vereinfachung für die Rotation quer durch den Schwerpunkt benutzen. Wir führen eine 1-D Integration entlang des Stabes durch mit 1-D Massendichte $\rho_0 = M/l$: $I = \rho_0 \int_0^{l/2} r_{\perp }\!^{2} = \rho_0 \frac{1}{3} (\frac{l}{2})^3 = \frac{l}{M} \frac{1}{12} l^3 = \frac{1}{12} M l^2 $ Die exakte Formel auf dem Arbeitsblatt erhalten wir durch 3-D Integration. Für $r \ll L$ fällt der vordere Term aber nicht ins Gewicht. Für den dünnen Metallstab messen wir $ l = 0.12 \pm 10^{-3} m, M = 0.04 \pm 0.01 kg $ Nach Gauß'scher Fehlerfortpflanzung gilt: ${u_{I}} = {\sqrt {\left({\frac {\partial I}{\partial M}}\cdot u_{M}\right)^{2}+\left({\frac {\partial I}{\partial l}}\cdot u_{l}\right)^{2}}} $ ${u_{I}} = \frac{1}{12} {\sqrt {\left({l^2}\cdot u_{M}\right)^{2}+\left({2Ml}\cdot u_{l}\right)^{2}}}$ ${u_{I}} \approx 1,2 \cdot 10^{-5}\ kg\ m^2$ ergibt uns $I_{Stab} = (4,8 \pm 1,2) \cdot 10^{-5}\ kg\ m^2$ ===== Topfdeckel ===== Für die Topfdeckel nähern wir die Geometrie als homogonen Zylinder. Wir integrieren also in 2-D Polarkoordinaten mit 2-D Massendichte $\rho_0 = \frac{M}{\pi R^2}$ $ I = \rho_0 \int_0^{2\pi} d\phi \int_0^R r\ dr\ r^2 = \frac{M}{\pi R^2} \ 2\pi\ \frac{1}{4} R^4 = \frac{1}{2}M R^2$ Wir messen die Topfdeckel ab $R_{1} = d_1/2 = (0.105 \pm 0.0025) m $ $ M_1 = (0.07 + 0.65) \pm 0.03 kg = (0.72 \pm 0.03) kg $ $ R_2 = d_2/2 = (0.085 \pm 0.0025) m$ $M_2 = (0.07 + 0.05) \pm 0.03 kg = (0.12 \pm 0.03) kg$ Die Unsicherheit erhalten wir beinahe analog ${u_{I}} = {\sqrt {\left({\frac {\partial I}{\partial M}}\cdot u_{M}\right)^{2}+\left({\frac {\partial I}{\partial l}}\cdot u_{l}\right)^{2}}} $ ${u_{I}} = \frac{1}{2} {\sqrt {\left({R^2}\cdot u_{M}\right)^{2}+\left({2MR}\cdot u_{R}\right)^{2}}}$ ${u_{I_1}} \approx 4,18 \cdot 10^{-5}\ kg\ m^2$ ${u_{I_2}} \approx 1,86 \cdot 10^{-5}\ kg\ m^2$ Damit ergeben sich die Trägheitsmomente $ I_1 = (3,97\pm 0,04) \cdot 10^{-3} \ kg\ m^2$ $ I_2 = (0,43\pm 0,02) \cdot 10^{-3} \ kg\ m^2$ Der Fehler ist hier aber eigentlich deutlich größer, da wir von einer homogenen Masseverteilung ausgehen, was offensichtlich nicht der Fall ist. ====== Messung 1 - Stab an Saite dünn ($r= 0.33 \pm 0.03$) ====== Anfangsbedingungen: $\phi_0 = \pi,$ $\dot{\phi}_0 = 0$ Unsicherheiten: $ u(L) = 0,03m, u(T_{10}) = 0,5s$ ^ Höhe $L/m$ ^ Periodendauer $T_{10}/s$ ^ | 0,56 | 17,5 | | 0,42 | 15,9 | | 0,35 | 15,6 | | 0,29 | 12,9 | | 0,24 | 12,58 | {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:drehschwingung.messung1.png?nolink&400 |}} $ T(L)^2 = ( 6.01 \pm 0.27 ) \frac{s^2}{m} \cdot L $ Aus der Theorie erwarten wir eine Steigung die sich aus $st = \frac{I}{2 \pi^3 G r^4}$ zusammensetzt. Außerdem kennen wir schon $ I = (4,8 \pm 1,2) \cdot 10^{-5}\ kg\ m^2 $ und $ r = (0.33 \pm 0.03)mm \Longrightarrow r^4 = ( 12 \pm 5 ) \cdot 10^{-15} m $. Nach Umstellen ergibt sich: $ G = \frac{I}{2 \pi^3 \cdot st \cdot r^4 } = ( 10 \pm 5 ) \cdot 10^{6} \frac{kg}{s^2 m}$ Da der relative Fehler viel zu groß ist und der $T^2$-Achsenabschnitt auch ziemlich groß ist, ist dieser Wert für weitere Berechnungen nicht emphelenswert. ====== Messung 2 - Stab an Saite dick ($r = (1 \pm 0.025)mm$)====== Anfangsbedingungen: $\phi_0 = \pi, \dot{\phi}_0 = 0$ Unsicherheiten: $ u(L) = 0,03m,$ $u(T_{10}) = 0,5s$ ^ Höhe $L/m$ ^ Periodendauer $T_{10}/s$ ^ | 0.62 | 16.32 | | 0.53 | 13.44 | | 0.47 | 12.68 | | 0.35 | 11.49 | | 0.23 | 9.47 | {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:drehschwingung.messung2.png?nolink&400 |}} $ T(L)^2 = ( 383 \pm 20 ) \cdot 10^{-2} \frac{s^2}{m} \cdot L $ Aus der Theorie erwarten wir eine Steigung die sich aus $ st = \frac{I}{2 \pi^3 G r^4}$ zusammensetzt. Außerdem kennen wir schon $ I = (4,8 \pm 1,2) \cdot 10^{-5}\ kg\ m^2 $ und $ r = (1.0 \pm 0.025)mm \Longrightarrow r^4 = ( 100 \pm 10 ) \cdot 10^{-14} m^4 $. Nach Umstellen ergibt sich: $ G = \frac{I}{2 \pi^3 \cdot st \cdot r^4 } = ( 20 \pm 6 ) \cdot 10^{4} \frac{kg}{s^2 m}$ Diese Berechnung ist im Vergleich zur ersten deutlich plausibler. ====== Messung 3 - Stab an Schnürsenkel ($r = (3 \pm 1)mm$)====== Anfangsbedingungen: $\phi_0 = 4 \cdot \pi, \dot{\phi}_0 = 0$ Unsicherheiten: $ u(L) = 0,03m, u(T_{2}) = 0,5s$ Die Dämpfung ist hier groß. Deshalb messen wir 2 Perioden $T_2$ statt 10 Perioden $T_{10}$. ^ Höhe $L/m$ ^ Periodendauer $T_{2}/s$ ^ | 0,48 | 26,86 | | 0,18 | 19,37 | | 0,10 | 13,58 | {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:drehschwingung.messung3.png?nolink&400 |}} $ T(L)^2 = ( 43 \pm 4 ) \cdot 10^{1} \frac{s^2}{m} \cdot L $ Aus der Theorie erwarten wir eine Steigung die sich aus $ st = \frac{I}{2 \pi^3 G r^4}$ zusammensetzt. Außerdem kennen wir schon $ I = (4,8 \pm 1,2) \cdot 10^{-5}\ kg\ m^2 $ und $ r = (3 \pm 1)mm \Longrightarrow r^4 = ( 8 \pm 11 ) \cdot 10^{-11} m^4 $. Nach Umstellen ergibt sich: $ G = \frac{I}{2 \pi^3 \cdot st \cdot r^4 } = ( 2 \pm 3 ) \cdot 10^{1} \frac{kg}{s^2 m}$ Diese Berechnung scheitert an der Annahme eines harmonischen Potentials. ====== Messung 4 - Topfdeckel 1 an Saite dick ====== Durchmesser $ d = (0.210 \pm 0.005) m $ Masse $ m = (0.07 + 0.65) kg $ Anfangsbedingungen: $\phi_0 = \pi, \dot{\phi}_0 = 0$ Unsicherheiten: $ u(L) = 0,03m, u(T_{3}) = 0,5s, u(m) = 0.03 kg$ ^ Höhe $L/m$ ^ Periodendauer $T_{3}/s$ ^ | 0.56 | 38.88 | | 0.29 | 27.11 | | 0.17 | 20.57 | {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:drehschwingung.messung4.png?nolink&400 |}} $ T(L)^2 = ( 290 \pm 7 ) \frac{s^2}{m} \cdot L $ Vergleicht man nun den Proportionalitätfaktor mit dem aus Messung 2 erhält man $ I_{Topf1}= \frac{st_{Topf1}}{st_{Stab}} \cdot I_{Stab} = ( 36 \pm 9 ) \cdot 10^{-4} \ kg\ m^2 $ ====== Messung 5 - Topfdeckel 2 an Saite dick ====== Durchmesser $ d = (0.170 \pm 0.005) m $ Masse $ m = (0.07 + 0.05) kg $ Anfangsbedingungen: $\phi_0 = \pi, \dot{\phi}_0 = 0$ Unsicherheiten: $ u(L) = 0,03m, u(T_{5}) = 0,5s, u(m) = 0.03 kg $ ^ Höhe $L/m$ ^ Periodendauer $T_{5}/s$ ^ | 0.50 | 26.69 | | 0.33 | 21.36 | | 0.17 | 14.51 | {{:a_mechanik:drehschwingungen:gruppenseiten:gruppe342:drehschwingung.messung5.png?nolink&400 |}} $ T(L)^2 = ( 558 \pm 15 ) \cdot 10^{-1}\frac{s^2}{m} \cdot L $ Vergleicht man nun den Proportionalitätfaktor mit dem aus Messung 2 erhält man $ I_{Topf_2}= \frac{st_{Topf_2}}{st_{Stab}} I_{Stab} = ( 70 \pm 18 ) \cdot 10^{-5} \ kg\ m^2 $ ====== Auswertung ====== Für die zwei Topfdeckel erhalten wir $ I_{Topf_1, Theorie} = 3,97 \cdot 10^{-3} \ kg\ m^2 \longleftrightarrow I_{Topf1, Experiment} = (3.7 \pm 1.1) 10^{-3} \ kg\ m^2 $ $ I_{Topf_2, Theoie} = 0,43 \cdot 10^{-3} \ kg\ m^2 \longleftrightarrow I_{Topf_2} = (0.71 \pm 0.22) 10^{-3} \ kg\ m^2 $ Wir sehen, dass wir für die höhere Masse im Fehlerintervall liegen. Bei höherer Masse ist möglicherweise das Modell des Torsionsmodules treffender und mögliche Störquellen weniger einflussreich. ===== Code zu den Plots ===== import numpy as np import matplotlib.pyplot as plt from scipy import stats from scipy.odr import * from help import string_correctly, err_evolution ul = 0.03 ut = 0.5 mess1 = {'val': np.array([[0.56, 17.5], [0.42, 15.9], [0.35, 15.6], [0.29, 12.9], [0.24, 12.58]]), 'phi': np.pi, 'nt': 10, 'r': 1 / 3 * 10 ** - 3, 'r_err': 0.1 / 3 * 10 ** - 3, 'i': 4.8 * 10 ** -5, 'i_err': 1.2 * 10 ** -5} mess2 = {'val': np.array([[0.53, 13.44], [0.62, 16.32], [0.47, 12.68], [0.35, 11.49], [0.23, 9.47]]), 'phi': np.pi, 'nt': 10, 'r': 1 * 10 ** - 3, 'r_err': 0.1 / 4 * 10 ** - 3, 'i': 4.8 * 10 ** -5, 'i_err': 1.2 * 10 ** -5} mess3 = {'val': np.array([[0.48, 26.86], [0.18, 19.37], [0.1, 13.58]]), 'phi': 4 * np.pi, 'nt': 2, 'r': 3 * 10 ** - 3, 'r_err': 1 * 10 ** - 3, 'i': 4.8 * 10 ** -5, 'i_err': 1.2 * 10 ** -5} mess4 = {'val': np.array([[0.56, 38.88], [0.29, 27.11], [0.17, 20.57]]), 'phi': np.pi, 'nt': 3, 'r': 1 * 10 ** - 3, 'r_err': 0.1 / 4 * 10 ** - 3, 'i': 4.8 * 10 ** -5, 'i_err': 1.2 * 10 ** -5} mess5 = {'val': np.array([[0.50, 26.69], [0.33, 21.36], [0.17, 14.51]]), 'phi': np.pi, 'nt': 5, 'r': 1 * 10 ** - 3, 'r_err': 0.1 / 4 * 10 ** - 3, 'i': 4.8 * 10 ** -5, 'i_err': 1.2 * 10 ** -5} def lin(a, x): return a * x def r_4(r): return r ** 4 def torsion(i, r4, slope): return i / (2 * np.pi ** 3 * r4 * slope) def trägmom(i2, slope1, slope2): return i2 * slope1 / slope2 messes = [mess1, mess2, mess3, mess4, mess5] for j in range(len(messes)): mess = messes[j] vals = np.transpose(mess['val']) nt = mess['nt'] lengths = vals[0] l_max = max(lengths) l_mean = sum(lengths) / len(lengths) lens = np.linspace(0, 1.1 * l_max, num=50) times = [vals[1][i] / nt for i in range(len(vals[1]))] t_quad = [times[i] ** 2 for i in range(len(times))] tq_max = max(t_quad) tq_mean = sum(t_quad) / len(t_quad) uts = [2 * tq * ut / (nt ** 2) for tq in t_quad] sol = stats.linregress(lengths[:len(t_quad)], t_quad) lin_model = Model(lin) data = RealData(lengths[:len(t_quad)], t_quad, sx=ul, sy=uts) sol_real = ODR(data, lin_model, beta0=[1.]).run() fit = [sol_real.beta[0] * l for l in lens] dls = [l - l_mean for l in lengths] sdl = sum([abs(dl) for dl in dls]) / len(dls) dtqs = [tq - tq_mean for tq in t_quad] sdtq = sum([abs(dtq) for dtq in dtqs]) / len(dtqs) covltq = sum([dls[i] * dtqs[i] for i in range(len(dls))]) / (len(dls) - 1) corltq = covltq / (sdl * sdtq) fig = plt.figure(figsize=(6, 6)) ax = fig.add_subplot(111) ax.errorbar(lengths, [time ** 2 for time in times], linestyle='', marker='', xerr=ul, yerr=2 * tq_mean * ut / (nt ** 2), label='Messwerte') ax.plot(lens, fit, linestyle='-', label='Linfit mit $R^2 =$' + "%.3f" % (round(sol.rvalue ** 2, 3))) ax.set_xlim(0, 1.1 * l_max) ax.set_ylim(0, 1.1 * tq_max) ax.set_title('Messung ' + str(j + 1)) ax.set_xlabel('L in m') ax.set_ylabel('$T^2$ in s') ax.legend() plt.savefig('Drehschwingung.Messung' + str(j + 1) + '.png') plt.show() slope = sol_real.beta[0] slope_err = sol_real.sd_beta[0] print(j + 1, ':') print('Slope: ', string_correctly(slope, slope_err)) if j < 3: r = mess['r'] r_err = mess['r_err'] i = mess['i'] i_err = mess['i_err'] if j == 1: i2 = i i2_err = i_err slope2 = slope slope2_err = slope_err r4, r4_err = err_evolution(r_4, [r], [r_err]) g, g_err = err_evolution(torsion, [i, r4, slope], [i_err, r4_err, slope_err]) print('r^4: ', string_correctly(r4, r4_err)) print('g: ', string_correctly(g, g_err), end='\n\n\n') else: i, i_err = err_evolution(trägmom, [i2, slope, slope2], [i2_err, slope_err, slope2_err]) print('I: ', string_correctly(i, i_err), end='\n\n\n') ===== Hilfscode ===== def round_correctly(val, err): first_sign = 0 while err // (10 ** first_sign) > 0: first_sign += 1 while err // (10 ** first_sign) == 0: first_sign -= 1 if err // (10 ** first_sign) < 3: first_sign -= 1 return round(val * 10 ** -first_sign), round(err * 10 ** -first_sign), first_sign def lin_fit_label(sol, xstr): return '$Fit = ' + string_correctly(sol.slope, sol.stderr) + ' \\cdot ' + xstr + ' + ' + string_correctly( sol.intercept, sol.intercept_stderr) + '$; $R^2 = ' + str(round(sol.rvalue ** 2, 3)) + '$' def string_correctly(val, err): val, err, pot = round_correctly(val, err) return ' ( ' + str(int(val)) + ' \pm ' + str(int(err)) + ' )' + (' \\cdot 10^{' + str(pot) + '} ') * (pot != 0) def err_evolution(func, params, errors): val = func(*params) err_q = 0 for i in range(len(params)): _, _, pot = round_correctly(params[i], errors[i]) h = 10 ** (pot - 5) upper = (params[j] + h * (j == i) for j in range(len(params))) lower = (params[j] - h * (j == i) for j in range(len(params))) diff = (func(*upper) - func(*lower)) / (2 * h) err_q += (diff * errors[i]) ** 2 return val, err_q ** 0.5