In questo esercizio si vuole confrontare il periodo misurato dell'oscillatore presentato in aula con quello previsto da un modello ad 1 grado di libertà.
Le masse dei vari componenti sono state misurate con una bilancia digitale, con una incertezza ±0.01 g:
componente | massa (g) |
---|---|
moschettone | 95.77 |
anello di plastica | 0.25 |
molla | 57.53 |
Si definiscono le variabili
nelle elaborazioni numeriche si utilizza il SI, dunque le masse sono espresse in kg.
M = 57.53e-3
m = 95.77e-3 + 0.25e-3
Il rapporto tra le masse $q = M/m$ vale
print("q = {:#.2g}".format(M/m))
Con un comune cronometro manuale sono state effettuate 13 misurazioni del periodo di 10 oscillazioni; i risultati sono salvati nel file Tm.csv
; si leggono ed analizzano i risultati con la libreria Pandas. Le grandezze indicate sono media, deviazione standard, valore minimo, massimo, quartili.
import pandas as pd
ts = pd.read_csv("Tm.csv")
ts.describe()
L'analisi non indica problemi particolari, dunque si assume come periodo misurato $T_\text{m}$ (salvato nella variabile Tm
) la media delle misurazioni divisa per il numero dei periodi. Allo stesso modo si ottiene la deviazione standard.
Tm = ts['Tm10 (s)'].mean()/10
sTm = ts['Tm10 (s)'].std()/10
print("Tm = {:.3g} (s); deviazione standard {:#.1g} (s)"
.format(Tm, sTm))
La misura della rigidiezza della molla è stata divisa in due fasi:
Il sistema è stato caricato con dei pesi, rappresentati da dadi M16. Le masse dei dadi sono state misurate con una bilancia digitale e sono riportati nel file Md.csv
che viene analizzato qui sotto.
ms = pd.read_csv("Md.csv")
ms.describe()
Per calcoli si usa il valore medio del peso, assumendo l'accelerazione di gravità pari al valore standard $g_0$. Il valore della forza peso di un dado è salvato nella variabile Pd
(N).
g0 = 9.80665
Pd = ms['Md (g)'].mean() / 1000 * g0
sPd = ms['Md (g)'].std() / 1000 * g0
print("Pd = {:.3g} (N); deviazione standard {:.1g} (N)"
.format(Pd, sPd))
Si è quindi proceduto a misurare la quota di un punto ben definito del moschettone rispetto al pavimento con un normale metro ripiegabile da falegname, partendo dalla posizione di riposo ed aggiungendo un dado alla volta. Le misure sono state ripetute in scarico, eliminando un dado alla volta e tornando alla configurazone di partenza.
I risultati della misura sono salvati nel file y.csv
Si aggiunge alla tabella una colonna con la forza peso esercitata dai bulloni; per coerenza con la misura di quota la forza è assunta positiva verso l'alto. Per comodità di calcolo si aggiunge anche una colonna con la quota in m.
ys = pd.read_csv('y.csv')
ys['y (m)'] = ys['y (mm)'] / 1000
ys['f (N)'] = -ys['n'] * Pd
ys.style.hide_index()
ys.plot.scatter(x='f (N)', y='y (m)', grid=True,
title="Misure quota–forza peso");
Dal grafico si osserva una buona linearità, anche se probabilmente (per la difficoltà di lettura, effetti parallasse, etc.) le misure hanno una incertezza maggiore della divisione (1 mm) della scala del metro ripiegabile adoperato.
Per stimare la rigidezza $k$ si introduce un modello lineare ai minimi quadrati con la libreria statsmodel.
import statsmodels.api as sm
X = ys['f (N)']
X = sm.add_constant(X)
y = ys['y (m)']
model = sm.OLS(y, X).fit()
model.summary()
Questa è la rappresentazione grafica dell'approssimazione ottenuta:
ax = ys.plot.scatter(x='f (N)', y='y (m)', grid=True)
ax.plot(X['f (N)'], model.predict(X), '-.r');
Graficamente si osserva che l'approssimazione è più che accettabile: si salva perciò nella variabile k
la stima della rigidezza della molla. (Si noti che il modello stima la cedevolezza, dunque la rigidezza si ottiene calcolando il reciproco.)
k = 1 / model.params['f (N)']
sk = k**2*model.bse['f (N)']
print("k = {:.3g} (N/m); stima incertezza {:.1g} (N/m)"
.format(k, sk))
Indichiamo con $T_0$ il periodo calcolato senza considerare la massa della molla $$ T_0 = 2\pi \sqrt{\frac{m}{k}} $$ Si riportano qui sotto
Gli errori sono definiti rispetto al valore misurato $T_\mathrm{m}$.
from math import pi
T_0 = 2*pi*(m/k)**(1/2)
print("T_0 = {:#.3g} (s); 𝛥 = {:.3f} (s); 𝛥ᵣ = {:+#.2g}%".format(
T_0, T_0-Tm, (T_0-Tm)/Tm*100))
La formula classica di prima approssimazione per calcolare la frequenza di un sistema massa–molla, considerando anche il contributo della massa della molla è $$ T_1 = 2\pi \sqrt{\frac{m + \frac13 M}{k}} $$ valida quando $m\gg M$. Con questa formula si hanno i valori calcolati qui sotto.
T_1 = 2*pi*((m + M/3)/k)**(1/2)
print("T_1 = {:#.3g} (s); 𝛥 = {:.1g} (s); 𝛥ᵣ = {:+#.2g}%".format(
T_1, T_1-Tm, (T_1-Tm)/Tm*100))
Come si vede l'accordo tra il valore calcolato e quello misurato è molto migliore; l'errore $\Delta$ risulta inferiore all'incertezza della misura. Dunque per poter raffinare ulteriormente la stima del periodo $T$ è necessario procedere prima a misure più accurate.
Per comodità si riportano i dati ottenuti.
print("Tm = {:.3g} (s); deviazione standard {:.1g} (s)".format(
Tm, ts['Tm10 (s)'].std()/10))
print("T_0 = {:#.3g} (s); 𝛥 = {:.3f} (s); 𝛥ᵣ = {:+#.2g}%".format(
T_0, T_0-Tm, (T_0-Tm)/Tm*100))
print("T_1 = {:#.3g} (s); 𝛥 = {:.1g} (s); 𝛥ᵣ = {:+#.1g}%".format(
T_1, T_1-Tm, (T_1-Tm)/Tm*100))
Questa esperienza dimostra chiaramente che per il sistema in esame la stima $T_0$ (ottenuta trascurando la massa della molla) è inadeguata. La formula di prima approssimazione $T_1$, si è dimostrata invece più che adeguata.
L'utilizzo di formule non approssimate per il calcolo del periodo $T$, basate sulla soluzione dell'equazione delle onde, ha senso solo se si è in grado di ottenere una misura $T_\mathrm{m}$ più accurata.
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.