Influenza della massa della molla nel moto armonico di una massa sospesa

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

  • massa della molla $M$
  • masse sospese (moschettone e anello di plastica) $m$;

nelle elaborazioni numeriche si utilizza il SI, dunque le masse sono espresse in kg.

In [1]:
M = 57.53e-3
m = 95.77e-3 + 0.25e-3

Il rapporto tra le masse $q = M/m$ vale

In [2]:
print("q = {:#.2g}".format(M/m))
q = 0.60

Misura del periodo

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.

In [3]:
import pandas as pd
ts = pd.read_csv("Tm.csv")
ts.describe()
Out[3]:
Tm10 (s)
count 13.000000
mean 8.546077
std 0.070382
min 8.417000
25% 8.514000
50% 8.537000
75% 8.575000
max 8.672000

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.

In [4]:
Tm = ts['Tm10 (s)'].mean()/10
sTm = ts['Tm10 (s)'].std()/10

print("Tm = {:.3g} (s); deviazione standard {:#.1g} (s)"
      .format(Tm, sTm))
Tm = 0.855 (s); deviazione standard 0.007 (s)

Misura della rigidezza della molla

La misura della rigidiezza della molla è stata divisa in due fasi:

  • determinazione sperimentale di una curva forza–posizione
  • interpoalzione ai minimi quadrati e calcolo del coefficiente angolare dell'approssimante

Curva forza––posizione

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.

In [5]:
ms = pd.read_csv("Md.csv")
ms.describe()
Out[5]:
Md (g)
count 4.000000
mean 28.795000
std 0.042032
min 28.750000
25% 28.765000
50% 28.795000
75% 28.825000
max 28.840000

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).

In [6]:
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))
Pd = 0.282 (N); deviazione standard 0.0004 (N)

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.

In [7]:
ys = pd.read_csv('y.csv')

ys['y (m)'] = ys['y (mm)'] / 1000
ys['f (N)'] = -ys['n'] * Pd

ys.style.hide_index()
Out[7]:
n y (mm) y (m) f (N)
0 346 0.346 0
1 300 0.3 -0.282382
2 258 0.258 -0.564765
3 209 0.209 -0.847147
4 161 0.161 -1.12953
3 209 0.209 -0.847147
2 254 0.254 -0.564765
1 299 0.299 -0.282382
0 341 0.341 0
In [8]:
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.

Approssimazione ai minimi quadrati e stima della rigidezza

Per stimare la rigidezza $k$ si introduce un modello lineare ai minimi quadrati con la libreria statsmodel.

In [9]:
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()
/Users/miccoli/.pyenv/versions/BigData/lib/python3.6/site-packages/scipy/stats/stats.py:1394: UserWarning: kurtosistest only valid for n>=20 ... continuing anyway, n=9
  "anyway, n=%i" % int(n))
Out[9]:
OLS Regression Results
Dep. Variable: y (m) R-squared: 0.999
Model: OLS Adj. R-squared: 0.999
Method: Least Squares F-statistic: 5973.
Date: Wed, 06 Mar 2019 Prob (F-statistic): 1.60e-11
Time: 22:41:02 Log-Likelihood: 42.987
No. Observations: 9 AIC: -81.97
Df Residuals: 7 BIC: -81.58
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
const 0.3447 0.001 265.897 0.000 0.342 0.348
f (N) 0.1604 0.002 77.286 0.000 0.156 0.165
Omnibus: 0.816 Durbin-Watson: 1.354
Prob(Omnibus): 0.665 Jarque-Bera (JB): 0.001
Skew: 0.019 Prob(JB): 1.00
Kurtosis: 2.971 Cond. No. 3.45


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Questa è la rappresentazione grafica dell'approssimazione ottenuta:

In [10]:
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.)

In [11]:
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))
k = 6.23 (N/m); stima incertezza 0.08 (N/m)

Calcolo del periodo trascurando la massa della molla

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

  • il valore calcolato del periodo $T_0$,
  • l'errore assoluto $\Delta = T_0 - T_\mathrm{m}$ e
  • l'errore relativo $\Delta_\mathrm{r} = \dfrac{T_0-T_\mathrm{m}}{T_\mathrm{m}}$

Gli errori sono definiti rispetto al valore misurato $T_\mathrm{m}$.

In [12]:
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))
T_0 = 0.780 (s); 𝛥 = -0.075 (s); 𝛥ᵣ = -8.7%

Calcolo di prima approssimazione del periodo considerando la massa della molla

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.

In [13]:
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))
T_1 = 0.854 (s); 𝛥 = -0.0004 (s); 𝛥ᵣ = -0.047%

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.

Conclusioni

Per comodità si riportano i dati ottenuti.

In [14]:
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))
Tm  = 0.855 (s); deviazione standard 0.007 (s)
T_0 = 0.780 (s); 𝛥 = -0.075 (s); 𝛥ᵣ = -8.7%
T_1 = 0.854 (s); 𝛥 = -0.0004 (s); 𝛥ᵣ = -0.05%

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.


Copyleft 2019, Stefano Miccoli

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

In [ ]: