initial commit
This commit is contained in:
commit
b5b8c1ffee
99
calorimetro.py
Normal file
99
calorimetro.py
Normal file
@ -0,0 +1,99 @@
|
||||
# coding: utf-8
|
||||
from __future__ import print_function
|
||||
from lab import *
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
##
|
||||
## Part 1
|
||||
## equivalent mass
|
||||
|
||||
mt = 353.36
|
||||
mi = np.array([592.67, 576.99, 512.66, 479.75, 498.35])
|
||||
mf = np.array([682.53, 678.08, 634.87, 626.51, 626.81])
|
||||
T1 = np.array([20.2, 35.1, 21.1, 38.9, 22.5])
|
||||
T2 = np.array([83.1, 87.0, 89.9, 87.2, 95.0])
|
||||
Te = np.array([38.0, 51.0, 48.9, 61.9, 53.9])
|
||||
|
||||
m1 = mi-mt
|
||||
m2 = mf-mi
|
||||
me = m2*(T2-Te)/(Te-T1) - m1
|
||||
me = me[2:].mean()
|
||||
|
||||
print('m_e: ', me)
|
||||
|
||||
|
||||
##
|
||||
## Part 2
|
||||
## specific heat
|
||||
|
||||
mt = 359.67
|
||||
mi = np.array([713.98, 717.14, 693.60])
|
||||
ms = np.array([130.02, 121.85, 38.95])
|
||||
m1 = mi-mt
|
||||
Ts = 100
|
||||
T1 = np.array([21.2, 23.2, 21.2])
|
||||
Te = np.array([23.6, 25.3, 23.0])
|
||||
|
||||
cs = (Te-T1)*(m1+me)/((Ts-Te)*ms)
|
||||
|
||||
print('''
|
||||
rame: {:.1f}
|
||||
ottone: {:.1f}
|
||||
alluminio: {:.1f}
|
||||
'''.format(*cs*4186))
|
||||
|
||||
|
||||
##
|
||||
## Part 3
|
||||
## Joule constant
|
||||
|
||||
mt = 354.71
|
||||
m = 760.53 - mt
|
||||
V = 14
|
||||
I = 3
|
||||
T = sample(22.0, 23.4, 24.8, 26.4, 27.6, 29.0, 30.4)
|
||||
t = sample(0, 1, 2, 3, 4, 5, 6)*60
|
||||
|
||||
# linear interpolation
|
||||
x = np.linspace(0,370)
|
||||
a,b = linear(t, T, 0.1)
|
||||
f = lambda x: a.n+b.n*x
|
||||
|
||||
# plot T - t
|
||||
plt.xlabel('tempo (s)')
|
||||
plt.ylabel('temperatura (s)')
|
||||
plt.xlim(0,400)
|
||||
plt.scatter(t, T, color='#135964')
|
||||
plt.plot(t, f(t), '#317883')
|
||||
plt.show()
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(t, T, f, 0.1)
|
||||
print('χ²: α={:.3f}, α>ε: {}'.format(alpha, alpha>epsilon))
|
||||
|
||||
# find J from b
|
||||
J = I*V/(b*(m+me))
|
||||
|
||||
print('J={}'.format(J))
|
||||
|
||||
|
||||
##
|
||||
## Part 4
|
||||
## latent heat
|
||||
|
||||
mt = 355.12 # calorimeter tare
|
||||
mi = 386.61 # calorimeter + ice
|
||||
mf = 561.62 # calorimeter + ice + water
|
||||
m1 = mf-mi # water
|
||||
m2 = mi-mt # ice
|
||||
|
||||
t1 = 91.1
|
||||
t2 = -17
|
||||
te = 66.8
|
||||
|
||||
ca = 4.2045 # water specific heat at 91°C
|
||||
cg = 2.0461 # ice specific heat at -17°C
|
||||
|
||||
l = ca*(m1+me)/m2*(t1-te) + cg*t2 - ca*te
|
||||
print(l)
|
145
corda.py
Normal file
145
corda.py
Normal file
@ -0,0 +1,145 @@
|
||||
# coding: utf-8
|
||||
from __future__ import division, unicode_literals
|
||||
from lab import *
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import uncertainties.umath as u
|
||||
|
||||
mass = lambda x: ufloat(x, 0.01)*0.001
|
||||
length = lambda x: ufloat(x, 0.5)*0.01
|
||||
|
||||
##
|
||||
## Costants
|
||||
##
|
||||
|
||||
mL = [ (16.47, 251.0) # violet
|
||||
, (5.49, 252.7) # black
|
||||
, (6.16, 287.7) # green
|
||||
, (1.48, 188.8) # white
|
||||
]
|
||||
|
||||
mu = [mass(m)/length(l) for m,l in mL] # linear density (kg/m)
|
||||
pp = mass(50.03) # tare mass (kg)
|
||||
g = 9.80665 # acceleration due to gravity (m/s^2)
|
||||
|
||||
sigma = 0.8 # frequency uncertainty
|
||||
|
||||
## green string
|
||||
## T,L,μ constant, plot ν(n)
|
||||
|
||||
m = mass(400.21) + pp
|
||||
L = length(98.5)
|
||||
T = m*g
|
||||
|
||||
n = np.arange(1,8)
|
||||
nu = np.array([23.97, 48.20, 72.54, 96.97, 122.20, 147.10, 171.30])
|
||||
|
||||
# linear regression y=kx where
|
||||
# y=ν, x=n, k=1/(2L)√(T/μ)
|
||||
x = np.linspace(0,8,100)
|
||||
k = simple_linear(n, nu, sigma)
|
||||
f = lambda x: k.n*x
|
||||
|
||||
plt.figure(1)
|
||||
plt.xlim(0,8)
|
||||
plt.ylim(0,200)
|
||||
plt.xlabel('n armonica')
|
||||
plt.ylabel('frequenza di risonanza (Hz)')
|
||||
plt.scatter(n, nu, color='#468174')
|
||||
plt.plot(x, f(x), '#5ca897')
|
||||
plt.show()
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(n, nu, f, sigma, s=1)
|
||||
|
||||
v0 = 2*L*k # actual propagation velocity
|
||||
v = u.sqrt(T/mu[2]) # theoretical propagation velocity
|
||||
|
||||
print '''
|
||||
χ²: α={:.3f}, α>ε: {}
|
||||
k: ({})1/s
|
||||
v°: ({})m/s
|
||||
v: ({})m/s
|
||||
'''.format(alpha, alpha>epsilon, k, v0, v)
|
||||
|
||||
|
||||
##
|
||||
## green string
|
||||
## T,μ,n constant, plot ν(T), n=2
|
||||
|
||||
M = [mass(i)+pp for i in [700.45, 499.95, 450.16, 400.19, 200.16, 140.92]]
|
||||
T = np.array([g*i.n for i in M])
|
||||
nu = np.array([60.26, 52.20, 49.70, 47.06, 34.96, 31.22])
|
||||
|
||||
# linear regression y=kx where
|
||||
# y=ν, x=√T, k=1/(L√μ)
|
||||
x = np.linspace(1, 8, 100)
|
||||
k = simple_linear(np.sqrt(T), nu, sigma)
|
||||
f = lambda x: k.n*np.sqrt(x)
|
||||
|
||||
plt.figure(2)
|
||||
plt.xlabel('Tensione (N)')
|
||||
plt.ylabel('Frequenza 2ª armonica (Hz)')
|
||||
plt.scatter(T, nu, color='#673f73')
|
||||
plt.plot(x, f(x), '#975ca8')
|
||||
plt.show()
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(T, nu, f, sigma, s=1)
|
||||
print "χ²: α={}, α>ε: {}".format(alpha, alpha>epsilon)
|
||||
|
||||
##
|
||||
## green string
|
||||
## T,μ,n constant, plot ν(L), n=2
|
||||
|
||||
m = mass(400.21) + pp
|
||||
T = m*g
|
||||
|
||||
L = np.array([116.5, 104.5, 95.4, 82.2, 75.0, 64.5, 54.7])*0.01
|
||||
nu = np.array([44.58, 49.43, 54.60, 63.58, 69.34, 80.75, 96.40])
|
||||
|
||||
# linear regression y=kx where
|
||||
# y=ν, x=1/L, k=n/2 √(T/μ)
|
||||
x = np.linspace(0.5, 1.25, 100)
|
||||
k = simple_linear(1/L, nu, sigma)
|
||||
f = lambda x: k.n/x
|
||||
|
||||
plt.figure(3)
|
||||
plt.xlabel('Lunghezza corda (m)')
|
||||
plt.ylabel('Frequenza 2ª armonica (Hz)')
|
||||
plt.scatter(L, nu, color='#844855')
|
||||
plt.plot(x, f(x), '#a85c6c')
|
||||
plt.show()
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(L, nu, f, sigma, s=1)
|
||||
print "χ^2: α={}, α>ε: {}".format(alpha, alpha>epsilon)
|
||||
|
||||
##
|
||||
## every string
|
||||
## T,n,L constant, plot ν(μ), n=2
|
||||
|
||||
m = mass(400.21) + pp
|
||||
L = length(98.5)
|
||||
n = 2
|
||||
|
||||
mu = np.array([i.n for i in mu])
|
||||
nu = np.array([26.90, 47.23, 47.60, 78.20])
|
||||
|
||||
# linear regression y=kx where
|
||||
# y=ν, x=1/√μ, k=√T/L
|
||||
x = np.linspace(0.0005,0.007,100)
|
||||
k = simple_linear(1/np.sqrt(mu), nu, sigma)
|
||||
f = lambda x: k.n/np.sqrt(x)
|
||||
|
||||
plt.figure(4)
|
||||
plt.xlabel('Densità lineare (kg/m)')
|
||||
plt.ylabel('Frequenza 2ª armonica')
|
||||
plt.scatter(mu, nu, color='#44507c')
|
||||
plt.plot(x, f(x), '#5c6ca8')
|
||||
plt.show()
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(mu, nu, f, sigma, s=1)
|
||||
print "χ²: α={}, α>ε: {}".format(alpha, alpha>epsilon)
|
137
kater.py
Normal file
137
kater.py
Normal file
@ -0,0 +1,137 @@
|
||||
# coding: utf-8
|
||||
|
||||
from __future__ import division, print_function, unicode_literals
|
||||
from lab import *
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import uncertainties.umath as u
|
||||
|
||||
# known constants
|
||||
D = ufloat(0.994, 0.001)
|
||||
Ma = ufloat(1.000, 0.001)
|
||||
Mb = ufloat(1.400, 0.001)
|
||||
|
||||
##
|
||||
## Part 1
|
||||
##
|
||||
|
||||
X = sample(0.067,0.080,0.100,0.135,0.150,0.170,0.196,0.227) # distance from 1
|
||||
|
||||
T1 = [ sample(2.0899,2.0842,2.0828,2.0823) # period 1
|
||||
, sample(2.0604,2.0575,2.0574,2.0555)
|
||||
, sample(2.0203,2.0186,2.0162,2.0170)
|
||||
, sample(1.9509,1.9493,1.9485,1.9470)
|
||||
, sample(1.9283,1.9260,1.9253,1.9208)
|
||||
, sample(1.9038,1.9009,1.8994,1.9007)
|
||||
, sample(1.8748,1.8731,1.8722,1.8733)
|
||||
, sample(1.8463,1.8485,1.8458,1.8428)
|
||||
]
|
||||
|
||||
T2 = [ sample(2.0196,2.0177,2.0174,2.0179) # period 2
|
||||
, sample(2.0165,2.0159,2.0155,2.0151)
|
||||
, sample(2.0073,2.0064,2.0066,2.0070)
|
||||
, sample(1.9892,1.9899,1.9901,1.9913)
|
||||
, sample(1.9880,1.9872,1.9865,1.9865)
|
||||
, sample(1.9821,1.9815,1.9808,1.9828)
|
||||
, sample(1.9747,1.9751,1.9740,1.9730)
|
||||
, sample(1.9693,1.9683,1.9678,1.9672)
|
||||
]
|
||||
|
||||
t1 = [i.mean for i in T1]
|
||||
t2 = [i.mean for i in T2]
|
||||
s1 = [i.stdm for i in T1]
|
||||
s2 = [i.stdm for i in T1]
|
||||
|
||||
# quadratic fit
|
||||
a1,b1,c1 = polynomial(X, t1, 2, sigma_Y=s1)
|
||||
a2,b2,c2 = polynomial(X, t2, 2, sigma_Y=s2)
|
||||
|
||||
f = lambda x: a1*x**2+b1*x+c1
|
||||
g = lambda x: a2*x**2+b2*x+c2
|
||||
x = np.linspace(X.min, X.max, 100)
|
||||
|
||||
|
||||
# plot T1, T2 - X
|
||||
plt.figure(1)
|
||||
plt.xlabel('distanza da 1 (m)')
|
||||
plt.ylabel('periodo (s)')
|
||||
plt.xlim(0.05,0.24)
|
||||
|
||||
plt.scatter(X, t1, color='#21812b')
|
||||
plt.scatter(X, t2, color='#7755ff')
|
||||
plt.plot(x, [f(i).n for i in x], color='#21812b')
|
||||
plt.plot(x, [g(i).n for i in x], color='#7755ff')
|
||||
plt.show()
|
||||
|
||||
|
||||
# find intersection and calculate g
|
||||
x = ((b2-b1)-(u.sqrt)((b1-b2)**2-4*(a1-a2)*(c1-c2)))/(2*(a1-a2)) # intersection
|
||||
T = f(x) # isochronic period
|
||||
g1 = D/T**2*4*np.pi**2 # acceleration due to mass
|
||||
|
||||
print('''
|
||||
Kater pendulum:
|
||||
T: ({})s
|
||||
g₁: ({})m/s²
|
||||
'''.format(T, g1))
|
||||
|
||||
|
||||
##
|
||||
## Part 2
|
||||
## free fall - direct measure of g
|
||||
|
||||
H = sample(0.300,0.400,0.500,0.550,0.650,0.750) # drop height
|
||||
|
||||
T = [ sample(0.241,0.242,0.241,0.248,0.251,0.252,0.249,0.243,0.248,0.244) # time to fall
|
||||
, sample(0.285,0.285,0.284,0.284,0.284,0.282,0.284,0.282,0.281,0.281)
|
||||
, sample(0.318,0.319,0.318,0.316,0.318,0.316,0.316,0.318,0.317,0.317)
|
||||
, sample(0.336,0.333,0.333,0.332,0.340,0.330,0.330,0.332,0.335,0.330)
|
||||
, sample(0.362,0.361,0.365,0.367,0.359,0.361,0.357,0.366,0.361,0.359)
|
||||
, sample(0.385,0.387,0.390,0.385,0.393,0.386,0.386,0.392,0.394,0.387)
|
||||
]
|
||||
|
||||
|
||||
t = sample(i.mean for i in T)
|
||||
St = sample(i.std for i in T)
|
||||
|
||||
# linear fit y=kx where y=h, k=g/2, x=t^2
|
||||
x = np.linspace(0.2, 0.4, 100)
|
||||
k = simple_linear(t**2, H, 0.02)
|
||||
f = lambda x: x**2 * k.n
|
||||
|
||||
# plot H - T
|
||||
plt.figure(2)
|
||||
plt.ylabel('altezza (m)')
|
||||
plt.xlabel('tempo di caduta (s)')
|
||||
plt.scatter(t, H)
|
||||
plt.plot(x, f(x))
|
||||
plt.show()
|
||||
|
||||
# calculate g
|
||||
g2 = 2*k
|
||||
|
||||
# χ² test
|
||||
alpha = chi_squared_fit(t, H, f, St)
|
||||
|
||||
print('''
|
||||
Free fall:
|
||||
g₂: ({})m/s²
|
||||
χ²: α={:.3f}, α>ε: {}
|
||||
'''.format(g2, alpha, alpha>epsilon))
|
||||
|
||||
|
||||
##
|
||||
## Part 3
|
||||
## compare g1, g2
|
||||
|
||||
alpha = check_measures(g1, g2)
|
||||
g = combine_measures(g1, g2)
|
||||
|
||||
print('''
|
||||
compare g₁ g₂:
|
||||
α: {:.3f}, α>ε: {}
|
||||
|
||||
combine:
|
||||
g_best: ({})m/s²
|
||||
'''.format(alpha, alpha>epsilon, g))
|
233
lab.py
Normal file
233
lab.py
Normal file
@ -0,0 +1,233 @@
|
||||
# coding: utf-8
|
||||
|
||||
from __future__ import division, unicode_literals
|
||||
|
||||
from sympy.functions.special.gamma_functions import lowergamma, gamma
|
||||
from sympy.functions.special.error_functions import erf
|
||||
from uncertainties.core import UFloat
|
||||
from uncertainties import ufloat, wrap, correlated_values
|
||||
from numpy.polynomial.polynomial import polyfit
|
||||
|
||||
import collections
|
||||
import types
|
||||
import numpy as np
|
||||
import string
|
||||
|
||||
##
|
||||
## Variables
|
||||
##
|
||||
|
||||
class sample(np.ndarray):
|
||||
"""
|
||||
Sample type (ndarray subclass)
|
||||
Given a data sample outputs many statistical properties:
|
||||
n: number of measures
|
||||
min: minimum value
|
||||
max: maximum value
|
||||
mean: sample mean
|
||||
med: median value
|
||||
var: sample variance
|
||||
std: sample standard deviation
|
||||
stdm: standard deviation of the mean
|
||||
"""
|
||||
__array_priority__ = 2
|
||||
|
||||
def __new__(cls, *sample):
|
||||
if isinstance(sample[0], types.GeneratorType):
|
||||
sample = list(sample[0])
|
||||
s = np.asarray(sample).view(cls)
|
||||
return s
|
||||
|
||||
def __str__(self):
|
||||
return format_measure(self.mean, self.stdm)
|
||||
|
||||
def __array_finalize__(self, obj):
|
||||
if obj is None:
|
||||
return
|
||||
obj = np.asarray(obj)
|
||||
self.n = len(obj)
|
||||
self.min = np.min(obj)
|
||||
self.max = np.max(obj)
|
||||
self.mean = np.mean(obj)
|
||||
self.med = np.median(obj)
|
||||
self.var = np.var(obj, ddof=1)
|
||||
self.std = np.sqrt(self.var)
|
||||
self.stdm = self.std / np.sqrt(self.n)
|
||||
|
||||
def to_ufloat(self):
|
||||
return ufloat(self.mean, self.stdm)
|
||||
|
||||
##
|
||||
## Normal distribution
|
||||
##
|
||||
|
||||
def phi(x, mu, sigma):
|
||||
"""
|
||||
Normal CDF
|
||||
computes the probability P(x<a) given X is a normally distributed
|
||||
random variable with mean μ and standard deviation σ.
|
||||
"""
|
||||
return float(1 + erf((x-mu) / (sigma*np.sqrt(2))))/2
|
||||
|
||||
|
||||
def p(mu, sigma, a, b=None):
|
||||
"""
|
||||
Normal CDF shorthand
|
||||
given a normally distributed random variable X, with mean μ
|
||||
and standard deviation σ, computes the probability P(a<X<b)
|
||||
or P(X<a) whether b is given.
|
||||
"""
|
||||
if b:
|
||||
return phi(b, mu, sigma) - phi(a, mu, sigma) # P(a<X<b)
|
||||
return phi(a, mu, sigma) # P(x<a)
|
||||
|
||||
|
||||
def chi(x, d):
|
||||
"""
|
||||
χ² CDF
|
||||
given a χ² distribution with degrees of freedom
|
||||
computes the probability P(X^2x)
|
||||
"""
|
||||
return float(lowergamma(d/2, x/2)/gamma(d/2))
|
||||
|
||||
|
||||
def q(x, d):
|
||||
"""
|
||||
χ² 1-CDF
|
||||
given a χ² distribution with d degrees of freedom
|
||||
computes the probability P(X^2>x)
|
||||
"""
|
||||
return 1 - chi(x, d)
|
||||
|
||||
|
||||
def chi_squared(X, O, B, s=2):
|
||||
"""
|
||||
χ² test for a histogram
|
||||
given
|
||||
X: a normally distributed variable X
|
||||
O: ndarray of normalized absolute frequencies
|
||||
B: ndarray of bins delimiters
|
||||
s: number of constraints on X
|
||||
computes the probability P(χ²>χ₀²)
|
||||
"""
|
||||
N, M = X.n, len(O)
|
||||
d = M-1-s
|
||||
delta = (X.max - X.min)/M
|
||||
|
||||
E = [N*p(X.mean, X.std, B[k], B[k+1]) for k in range(M)]
|
||||
Chi = sum((O[k]/delta - E[k])**2/E[k] for k in range(M))
|
||||
|
||||
return q(Chi, d)
|
||||
|
||||
|
||||
def chi_squared_fit(X, Y, f, sigma=None, s=2):
|
||||
"""
|
||||
χ² test for fitted data
|
||||
given
|
||||
X: independent variable
|
||||
Y: dependent variable
|
||||
f: best fit function
|
||||
s: number of constraints on the data (optional)
|
||||
sigma: uncertainty on Y, number or ndarray (optional)
|
||||
"""
|
||||
if sigma is None:
|
||||
sigma_Y = np.mean([i.std for i in Y])
|
||||
else:
|
||||
sigma_Y = np.asarray(sigma).mean()
|
||||
Chi = sum(((Y - f(X))/sigma_Y)**2)
|
||||
return q(Chi, Y.size-s)
|
||||
|
||||
|
||||
##
|
||||
## Regressions
|
||||
##
|
||||
|
||||
def simple_linear(X, Y, sigma_Y):
|
||||
"""
|
||||
Linear regression of line Y=kX
|
||||
"""
|
||||
sigma = np.asarray(sigma_Y).mean()
|
||||
k = sum(X*Y) / sum(X**2)
|
||||
sigma_k = sigma / np.sqrt(sum(X**2))
|
||||
return ufloat(k, sigma_k)
|
||||
|
||||
|
||||
def linear(X, Y, sigma_Y):
|
||||
"""
|
||||
Linear regression of line Y=A+BX
|
||||
"""
|
||||
sigma = np.asarray(sigma_Y).mean()
|
||||
|
||||
N = len(Y)
|
||||
D = N*sum(X**2) - sum(X)**2
|
||||
A = (sum(X**2)*sum(Y) - sum(X)*sum(X*Y))/D
|
||||
B = (N*sum(X*Y) - sum(X)*sum(Y))/D
|
||||
|
||||
sigma_A = sigma * np.sqrt(sum(X**2)/D)
|
||||
sigma_B = sigma * np.sqrt(N/D)
|
||||
|
||||
return (ufloat(A, sigma_A),
|
||||
ufloat(B, sigma_B))
|
||||
|
||||
|
||||
def polynomial(X, Y, d=2, sigma_Y=None):
|
||||
"""
|
||||
d-th degree polynomial fit
|
||||
"""
|
||||
weights = None
|
||||
if sigma_Y:
|
||||
if isinstance(sigma_Y, collections.Iterable):
|
||||
weights = 1/np.asarray(sigma_Y)
|
||||
else:
|
||||
weights = np.repeat(1/sigma_Y, len(X))
|
||||
coeff, cov = np.polyfit(X, Y, d, w=weights,
|
||||
cov=True, full=False)
|
||||
print cov
|
||||
return correlated_values(coeff, cov)
|
||||
|
||||
|
||||
##
|
||||
## Misc
|
||||
##
|
||||
|
||||
def check_measures(X1, X2):
|
||||
"""
|
||||
Checks whether the results of two set of measures
|
||||
are compatible with each other. Gives the α-value
|
||||
α=1-P(X within tσ) where t is the weighted difference
|
||||
of X₁ and X₂
|
||||
"""
|
||||
t = np.abs(X1.n - X2.n)/np.sqrt(X1.s**2 + X2.s**2)
|
||||
print t
|
||||
return float(1 - erf(t/np.sqrt(2)))
|
||||
|
||||
|
||||
def combine_measures(*variables):
|
||||
"""
|
||||
Combines different (compatible) measures of the same
|
||||
quantity producing a new value with a smaller uncertainty
|
||||
than the individually taken ones
|
||||
"""
|
||||
W = np.array([1/i.s**2 for i in variables])
|
||||
X = np.array([i.n for i in variables])
|
||||
|
||||
best = sum(W*X)/sum(W)
|
||||
sigma = 1/np.sqrt(sum(W))
|
||||
|
||||
return ufloat(best, sigma)
|
||||
|
||||
|
||||
def format_measure(mean, sigma):
|
||||
"""
|
||||
Formats a measure in the standard declaration
|
||||
"""
|
||||
prec = int(np.log10(abs(sigma)))
|
||||
limit = 2-prec if prec < 0 else 2
|
||||
sigma = round(sigma, limit)
|
||||
mean = round(mean, limit)
|
||||
|
||||
return "{}±{}".format(mean, sigma)
|
||||
|
||||
sin = wrap(lambda x: np.sin(np.radians(x)))
|
||||
|
||||
epsilon = 0.05
|
100
oscillatore.py
Normal file
100
oscillatore.py
Normal file
@ -0,0 +1,100 @@
|
||||
# coding: utf-8
|
||||
from __future__ import unicode_literals, division
|
||||
from lab import *
|
||||
|
||||
import uncertainties.umath as u
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
|
||||
##
|
||||
## almost free oscillation
|
||||
## θ(t) = Ae^(-γt)sin(ωt+φ)+θ0
|
||||
|
||||
G = sample(0.0421, 0.0514, 0.0421, 0.0392)
|
||||
W = sample(2.6800, 2.6600, 2.6709, 2.6700)
|
||||
|
||||
g = ufloat(G.mean, G.std) # damping ratio γ
|
||||
w = ufloat(W.mean, W.std) # pulsation ω
|
||||
|
||||
w0 = u.sqrt(w**2-g**2) # corrected value ω0
|
||||
T = 2*np.pi/w # oscillation period
|
||||
|
||||
print('ω0: {}, γ: {}, T: {}'.format(w0, g, T))
|
||||
|
||||
|
||||
##
|
||||
## damped oscillation
|
||||
##
|
||||
|
||||
G = sample(0.2280, 0.2130, 0.2180, 0.2150)
|
||||
W = sample(2.6602, 2.6500, 2.6600, 2.6600)
|
||||
|
||||
g = ufloat(G.mean, G.std) # damping ratio γ
|
||||
w = ufloat(W.mean, W.std) # pulsation ω
|
||||
|
||||
w0 = u.sqrt(w**2-g**2) # corrected value ω0
|
||||
T = 2*np.pi/w # oscillation period
|
||||
|
||||
print('ω0: {}, γ: {}, T: {}'.format(w0, g, T))
|
||||
|
||||
|
||||
##
|
||||
## even more damped
|
||||
##
|
||||
|
||||
G = sample(0.6060, 0.6150, 0.6057, 0.6060)
|
||||
W = sample(2.6000, 2.6200, 2.6100, 2.5900)
|
||||
|
||||
g = ufloat(G.mean, G.std) # damping ratio γ
|
||||
w = ufloat(W.mean, W.std) # pulsation ω
|
||||
|
||||
w0 = u.sqrt(w**2-g**2) # corrected value ω0
|
||||
T = 2*np.pi/w # oscillation period
|
||||
|
||||
print('ω0: {}, γ: {}, T: {}'.format(w0, g, T))
|
||||
|
||||
|
||||
##
|
||||
## Driven oscillation
|
||||
##
|
||||
|
||||
V = np.array([1.8000, 1.9000, 2.0000, 2.1000, 2.2000, # generator tension (V)
|
||||
2.3000, 2.3500, 3.0000, 3.2000, 3.4000])
|
||||
A = np.array([2.3900, 2.5400, 4.0000, 3.2900, 5.4500, # oscillation amplitude (rad)
|
||||
6.2500, 4.5200, 3.7500, 2.4200, 1.8200])
|
||||
T = np.array([4.3100, 4.0600, 3.1000, 3.4000, 2.8300, # oscillation period (s)
|
||||
2.7500, 2.9800, 1.9700, 1.8300, 1.7000])
|
||||
Tf = np.array([4.3300, 4.1048, 3.0883, 3.4069, 2.8270, # rotor period (s)
|
||||
2.7229, 2.9592, 1.9721, 1.8240, 1.7210])
|
||||
|
||||
w = 2*np.pi/T # disc angular velocity
|
||||
wf = 2*np.pi/Tf # rotor angular velocity
|
||||
|
||||
# polynomial fit Y=aX^2+bX+c
|
||||
Y = 1/A**2
|
||||
X = w**2
|
||||
|
||||
y = 1/ufloat(A.mean(), 0.08)**2 # error estimation
|
||||
a,b,c = polynomial(X, Y, 2, y.s) # polynomial coeffs
|
||||
|
||||
# plot Α - ω
|
||||
x = np.linspace(1.4,3.8,250)
|
||||
f = lambda w: 1/np.sqrt(a.n*w**4 + b.n*w**2 + c.n)
|
||||
|
||||
plt.xlabel('pulsazione (rad/s)')
|
||||
plt.ylabel('ampiezza (rad)')
|
||||
plt.scatter(w, A, color='#b99100')
|
||||
plt.plot(x, f(x), '#c89d00')
|
||||
plt.show()
|
||||
|
||||
# find curve parameters
|
||||
M = 1/u.sqrt(a)
|
||||
w0 = (M**2 * c)**(1/4)
|
||||
g = 1/2*u.sqrt(b*M**2 + 2*w0**2)
|
||||
|
||||
print '''
|
||||
M: {}
|
||||
ω0: {}
|
||||
γ: {}
|
||||
'''.format(M,w0,g)
|
144
ottica.py
Normal file
144
ottica.py
Normal file
@ -0,0 +1,144 @@
|
||||
# coding: utf-8
|
||||
from __future__ import print_function, division, unicode_literals
|
||||
|
||||
from lab import *
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
np.set_printoptions(precision=2)
|
||||
|
||||
epsilon = 0.05
|
||||
|
||||
##
|
||||
## Parte 1
|
||||
## test Snell Law and calculate n
|
||||
|
||||
i_a = sample(5,10,15,20,25,30,35) # direct path
|
||||
r_a = sample(8,15,23,30,40,48,59)
|
||||
|
||||
i_b = sample(8,15,23,30,40,48,59) # reversed path
|
||||
r_b = sample(6,10,16,20,26,30,36)
|
||||
|
||||
# linear regression y=kx, where y=sin(r^) x=sin(i^)
|
||||
x = np.linspace(0, 1, 100)
|
||||
ka = simple_linear(sin(i_a), sin(r_a), sin(1))
|
||||
kb = simple_linear(sin(i_b), sin(r_b), sin(1))
|
||||
|
||||
# plot r^ - i^
|
||||
plt.figure(1)
|
||||
plt.xlim(0,1.0)
|
||||
plt.ylim(0,1.0)
|
||||
plt.xlabel('sin(angolo incidenza)')
|
||||
plt.ylabel('sin(angolo rifrazione)')
|
||||
plt.scatter(sin(i_a), sin(r_a), color='gray')
|
||||
plt.plot(x, ka.n*x, '#72aa3d')
|
||||
plt.scatter(sin(i_b), sin(r_b), color='gray')
|
||||
plt.plot(x, kb.n*x, '#3d72aa')
|
||||
plt.show()
|
||||
|
||||
# χ^2 test
|
||||
alpha_a = chi_squared_fit(sin(i_a), sin(r_a), lambda x: ka.n*x, sin(1))
|
||||
alpha_b = chi_squared_fit(sin(i_b), sin(r_b), lambda x: kb.n*x, sin(1))
|
||||
|
||||
print('''
|
||||
χ^2 tests:
|
||||
α={:.3f}, α>ε: {}
|
||||
α_rev={:.3f}, α>ε: {}
|
||||
'''.format(alpha_a, alpha_a>epsilon,
|
||||
alpha_b, alpha_b>epsilon))
|
||||
|
||||
#compare n, 1/n_rev
|
||||
alpha = check_measures(ka, 1/kb)
|
||||
n_best = combine_measures(ka, 1/kb)
|
||||
print('''
|
||||
n: ({})
|
||||
n_rev: ({})
|
||||
α: {:.2f}
|
||||
n_best: ({})
|
||||
'''.format(ka, kb, alpha, n_best))
|
||||
|
||||
|
||||
##
|
||||
## Parte 2
|
||||
## calculate n from minimum deviation δ
|
||||
|
||||
delta_min = ufloat(38,1) # minimum deviation angle
|
||||
alpha = ufloat(60,0) # equilater triangle prism
|
||||
n = sin(delta_min/2+alpha/2)/sin(alpha/2)
|
||||
|
||||
print('''
|
||||
n: ({})
|
||||
n_rev: ({})
|
||||
n_δ: ({})
|
||||
'''.format(ka, kb, n))
|
||||
|
||||
|
||||
##
|
||||
## Part 3
|
||||
## test thin lens equation, find focal lengths
|
||||
|
||||
## lens with f=200mm
|
||||
|
||||
d = 1.5 # transversal object length (cm)
|
||||
|
||||
s = sample(110.0,100.0,90.0,80.0) # screen distance (p+q)
|
||||
p = sample(24.9,26.3,28.1,32.6) # object - lens distance
|
||||
q = sample(84.7,73.7,61.5,46.8) # lens - sceen dinstance
|
||||
t = sample(5.1,4.2,3.3,2.1) # transversal image length
|
||||
t_ = d*q/p # theoretical length
|
||||
|
||||
# linear fit y=a+bx, where x=1/p, y=1/q
|
||||
x = np.linspace(0.030, 0.041, 100)
|
||||
a, b = linear(1/p, 1/q, 2e-4) # 1/f, -1
|
||||
f = 1/a # focal length
|
||||
|
||||
# plot y=a+bx, where x=1/p, y=1/q
|
||||
plt.figure(2)
|
||||
plt.xlabel('1/p (cm)')
|
||||
plt.ylabel('1/q (cm)')
|
||||
plt.scatter(1/p, 1/q, color='#ba6b88')
|
||||
plt.plot(x, a.n + b.n*x, '#ba6b88')
|
||||
plt.show()
|
||||
|
||||
# χ^2 test
|
||||
alpha = chi_squared_fit(1/p, 1/q, lambda x: a.n + b.n*x, 2e-4)
|
||||
print('χ^2: α={:.3f}, α>ε: {}'.format(alpha, alpha>epsilon))
|
||||
|
||||
print('''
|
||||
lente 200mm
|
||||
f: ({})cm
|
||||
t: {}cm
|
||||
t°: {}cm
|
||||
'''.format(f, np.asarray(t), np.asarray(t_)))
|
||||
|
||||
## lens with f=100mm
|
||||
|
||||
s = sample(80,70,60,50) # see above
|
||||
p = sample(12.5,13.0,13.7,15.4) #
|
||||
q = sample(67.2,57.0,46.3,34.4) #
|
||||
t = sample(7.9,6.7,5.5,3.3) #
|
||||
t_ = d*q/p #
|
||||
|
||||
# linear fit y=a+bx
|
||||
x = np.linspace(0.064, 0.081, 100)
|
||||
a, b = linear(1/p, 1/q, 2e-4) # 1/f, -1
|
||||
f = 1/a # focal length
|
||||
|
||||
# plot y=a+bx, where x=1/p, y=1/q
|
||||
plt.figure(3)
|
||||
plt.xlabel('1/p (cm)')
|
||||
plt.ylabel('1/q (cm)')
|
||||
plt.scatter(1/p, 1/q, color='#6b88ba')
|
||||
plt.plot(x, a.n + b.n*x, '#6b88ba')
|
||||
plt.show()
|
||||
|
||||
# χ^2 test
|
||||
alpha = chi_squared_fit(1/p, 1/q, lambda x: a.n + b.n*x, 2e-4)
|
||||
print('χ^2: α={:.3f}, α>ε: {}'.format(alpha, alpha>epsilon))
|
||||
|
||||
print('''
|
||||
lente 100mm
|
||||
f: ({})cm
|
||||
t: {}cm
|
||||
t°: {}cm
|
||||
'''.format(f, np.asarray(t), np.asarray(t_)))
|
23
shell.nix
Normal file
23
shell.nix
Normal file
@ -0,0 +1,23 @@
|
||||
{ pkgs ? import <nixpkgs> {}, mode ? "shell" }:
|
||||
|
||||
with pkgs;
|
||||
|
||||
let
|
||||
matplotlib = pythonPackages.matplotlib.override {
|
||||
enableGtk3 = true;
|
||||
};
|
||||
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "lab-data";
|
||||
source = ".";
|
||||
|
||||
buildInputs = with pythonPackages; [
|
||||
matplotlib numpy
|
||||
sympy uncertainties
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
#exec 2> /dev/null
|
||||
exec fish
|
||||
'';
|
||||
}
|
154
termocoppia.pickle
Normal file
154
termocoppia.pickle
Normal file
File diff suppressed because one or more lines are too long
68
termocoppia.py
Normal file
68
termocoppia.py
Normal file
@ -0,0 +1,68 @@
|
||||
# coding: utf-8
|
||||
|
||||
from lab import *
|
||||
import pickle
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
|
||||
def plot((name, points), n):
|
||||
plt.figure(n+1)
|
||||
|
||||
if name == 'azoto':
|
||||
plt.ylim(-5,-5.5)
|
||||
elif name == 'acqua':
|
||||
plt.ylim(4, 4.5)
|
||||
elif name =='stearico':
|
||||
name = 'acido stearico'
|
||||
elif name == 'glicole':
|
||||
plt.ylim(-0.7,-0.4)
|
||||
|
||||
plt.title(name.capitalize())
|
||||
plt.xlabel('tempo')
|
||||
plt.ylabel('differenza di potenziale (mV)')
|
||||
plt.plot(filter(lambda x: x!=0, points), '#44b34e')
|
||||
plt.show()
|
||||
|
||||
|
||||
set = pickle.load(open('termocoppia.pickle'))
|
||||
for i, curve in enumerate(set.iteritems()):
|
||||
#plot(curve, i)
|
||||
pass
|
||||
|
||||
V = map(np.mean,
|
||||
[ set['stagno'][150:250] # Tf
|
||||
, set['indio'][125:250] # Tf
|
||||
, set['acqua'][150:225] # Te
|
||||
, set['stearico'][80:120] # Tf
|
||||
, [0] # miscela acqua-ghiaccio
|
||||
, set['glicole'][130:170] # Tf
|
||||
, set['etere'][50:150] # Tf
|
||||
, set['azoto'] # Te
|
||||
])
|
||||
|
||||
T = [ 505.08 # Tf Sn
|
||||
, 429.75 # Tf In
|
||||
, 373.15 # Te H2O
|
||||
, 342.40 # Tf CH3-(CH2)16-COOH
|
||||
, 273.15 # Tf H2O
|
||||
, 260.20 # Tf HO-(CH2)2-OH
|
||||
, 156.80 # Tf CH3CH2-O-CH2CH3
|
||||
, 77.36 # Te N2
|
||||
]
|
||||
|
||||
x = np.linspace(-6, 6, 100)
|
||||
a,b,c,d,e = polynomial(V, T, 4)
|
||||
f = lambda x: a.mean*x**4 + b.mean*x**3 + c.mean*x**2 + d.mean*x + e.mean
|
||||
g = lambda n,x: sum(a*x**i for i, a in enumerate(polyfit(V,T,n)))
|
||||
# q(np.sum((np.polyval(np.polyfit(V,T,7), V) - T) ** 2), 1)*100
|
||||
|
||||
plt.figure(8)
|
||||
plt.xlabel('Differenza di potenziale (mV)')
|
||||
plt.ylabel('Temperatura (K)')
|
||||
plt.scatter(V, T, color='#6972cc')
|
||||
plt.plot(x, g(5,x), '#6972cc')
|
||||
plt.show()
|
||||
print '''
|
||||
T(V)={a.n:.3f}V^4+{b.n:.3f}V^3{c.n:.3f}V^2+{d.n:.3f}V+{e.n:.3f}
|
||||
'''.format(**dict(a=a,b=b,c=c,d=d,e=e))
|
115
urti.py
Normal file
115
urti.py
Normal file
@ -0,0 +1,115 @@
|
||||
# coding: utf-8
|
||||
from __future__ import division
|
||||
from lab import *
|
||||
import numpy as np
|
||||
|
||||
# helpers
|
||||
length = lambda x: x/100
|
||||
mass = lambda x: x/1000
|
||||
|
||||
# constants
|
||||
m = mass(260.04) # cart mass (kg)
|
||||
g = 9.80665 # acceleration due to gravity
|
||||
|
||||
##
|
||||
## Collisions
|
||||
##
|
||||
|
||||
# 3xmagnet, 2xrubber bumper, 2xputty
|
||||
|
||||
I = [0.23, 0.28, 0.36, 0.21, 0.27, 0.11, 0.15] # force impulse
|
||||
|
||||
# cart velocity before-after colliding
|
||||
v = [ (0.46,-0.44), (0.55,-0.54), (0.70,-0.71) # elastic
|
||||
, (0.52,-0.29), (0.68,-0.35) # partially anelastic
|
||||
, (0.41, 0.00), (0.59, 0.00) # anelastic
|
||||
]
|
||||
|
||||
for i,_ in enumerate(I):
|
||||
K0, K1 = 1/2*m*v[i][0]**2, 1/2*m*v[i][1] # kinetic energy
|
||||
p0, p1 = m*v[i][0], m*v[i][1] # momentuum
|
||||
dp = round(p1-p0, 3)
|
||||
dk = round(K1-K0, 3)
|
||||
print '''
|
||||
urto {}:
|
||||
Δp={:.3f}, I={}, ΔK={:.2f} {:.2f}%
|
||||
'''.format(i+1, dp, I[i], dk, abs((dp+I[i])/dp*100))
|
||||
|
||||
|
||||
##
|
||||
## Springs
|
||||
##
|
||||
|
||||
x0 = 0.8675 # spring at rest offset
|
||||
|
||||
# force impulse
|
||||
I = [ 0.32, 0.26, 0.35, 0.21, 0.34 # spring A
|
||||
, 0.42, 0.47, 0.50, 0.45, 0.68 # spring B
|
||||
]
|
||||
|
||||
# cart velocity before-after colliding
|
||||
v = [ (0.61,-0.58), (0.51,-0.48), (0.66,-0.66), (0.41,-0.38), (0.67,-0.63) # spring A
|
||||
, (0.81,-0.77), (0.89,-0.87), (0.94,-0.93), (0.85,-0.83), (1.32,-1.26) # spring B
|
||||
]
|
||||
|
||||
# maximum position reached (spring compressed)
|
||||
x = [ 0.888, 0.885, 0.890, 0.882, 0.887 # spring A
|
||||
, 0.881, 0.884, 0.885, 0.885, 0.888 # spring B
|
||||
]
|
||||
|
||||
# maximum force
|
||||
F = [ 5.55, 4.58, 6.29, 3.66, 6.10 # spring A
|
||||
, 18.61, 20.97, 22.25, 19.17, 31.25 # spring B
|
||||
]
|
||||
|
||||
ka = []
|
||||
kb = []
|
||||
|
||||
for i,_ in enumerate(I):
|
||||
k = F[i]/(x[i]-x0) # spring elastic constant
|
||||
Ep = 1/2*k*(x[i] -x0)**2 # theoretical value (assuming ΔEm=0)
|
||||
|
||||
K0, K1 = 1/2*m*v[i][0]**2, 1/2*m*v[i][1] # kinetic energy
|
||||
p0, p1 = m*v[i][0], m*v[i][1] # momentuum
|
||||
dp = round(p1-p0, 3)
|
||||
dk = round(K1-K0, 3)
|
||||
dEm = round(K0-Ep, 3)
|
||||
if i<5:
|
||||
ka.append(k)
|
||||
else:
|
||||
kb.append(k)
|
||||
|
||||
print '''
|
||||
urto {}:
|
||||
Δp={:.3f}, I={:.2f}, ΔK={:.2f} {:.2f}%
|
||||
k_{}={:.3f}, ΔΕm={:.3f}
|
||||
'''.format(i+1, dp, I[i], dk, abs((dp+I[i])/dp*100),('a' if i<5 else 'b'), k, dEm)
|
||||
|
||||
|
||||
##
|
||||
## Attrito
|
||||
##
|
||||
|
||||
## cart
|
||||
|
||||
# a=0 => μ=tanθ=h/l
|
||||
mu_s = length(11.5)/length(128.7)
|
||||
|
||||
# a=g(sinθ-μcosθ)
|
||||
a = sample(1.54,1.54,1.50,1.48,1.54,1.53)
|
||||
h, l = length(52.0), length(117.1)
|
||||
mu_d = (h/l) - (a.mean/g)*np.sqrt(1+(h/l)**2)
|
||||
|
||||
print 'μs={:.2f} μd={:.2f}'.format(mu_s, mu_d)
|
||||
|
||||
## teflon block
|
||||
|
||||
# a=0 => μ=tanθ=h/l
|
||||
mu_s = length(19.8)/length(127.0)
|
||||
|
||||
# a=g(sinθ-μcosθ)
|
||||
a = sample(0.67,0.79,0.76,0.75,0.78,0.73)
|
||||
h, l = length(34.1), length(125.5)
|
||||
mu_d = (h/l) - (a.mean/g)*np.sqrt(1+(h/l)**2)
|
||||
|
||||
print 'μs={:.2f} μd={:.2f}'.format(mu_s, mu_d)
|
166
viscosita.py
Normal file
166
viscosita.py
Normal file
@ -0,0 +1,166 @@
|
||||
#coding: utf8
|
||||
|
||||
from __future__ import print_function, division, unicode_literals
|
||||
|
||||
from lab import *
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.mlab as mlab
|
||||
import numpy as np
|
||||
import matplotlib
|
||||
|
||||
##
|
||||
## Parte 1
|
||||
##
|
||||
|
||||
# misure
|
||||
M = sample(0.5096,0.5100,0.5090,0.5095,0.5096,0.5102,0.5104,0.5103) # massa (g)
|
||||
D = sample(4.45,4.46,4.47,4.47,4.47,4.47,4.47,4.46) # diametro (mm)
|
||||
T0 = sample(2.43,2.28,2.46,2.42,2.46,2.44,2.32,2.29) # time at 20cm, 22°C
|
||||
T1 = sample(0.39,0.46,0.42,0.41,0.41,0.43,0.37,0.44,0.39) # time at 5cm, 22°C
|
||||
T = sample(2.13,2.29,2.44,2.25,2.29,2.19,2.19,2.07,2.25, # time at 20cm, 24°C
|
||||
2.14,2.29,2.27,2.25,2.10,2.11,2.12,2.26,2.03,
|
||||
2.10,2.18,2.28,2.29,2.13,2.14,2.17,2.24,2.33,
|
||||
2.04,2.06,2.12,2.17,1.97,1.97,2.14,2.07,2.22,
|
||||
2.05,1.87,2.14,2.21,1.89,2.32,2.23,2.14,2.07,
|
||||
2.04,2.00,2.14,1.96,2.40,2.22,2.04,2.16,2.01,
|
||||
2.08,2.03,2.04,2.09,2.30,2.09,2.14,1.92,2.01,
|
||||
2.27,2.26,2.19,2.19,2.07,1.94,2.00,1.87,2.20,
|
||||
2.02,1.95,2.03,2.27,2.14,1.92,1.94,1.94,2.07,
|
||||
1.82,1.88,1.86,2.13,2.05,2.20,1.92,2.09,2.34,
|
||||
2.36,2.24,2.24,2.20,2.07,2.35,2.20,2.13,2.10,2.12)
|
||||
|
||||
# compare velocity 5cm - 20cm
|
||||
V0 = 0.200/T0.to_ufloat()
|
||||
V1 = 0.050/T1.to_ufloat()
|
||||
alpha = check_measures(V0, V1)
|
||||
|
||||
print('''
|
||||
v_20cm: ({})m/s
|
||||
v_5cm: ({})m/s
|
||||
Χ²: α={:.5f}, α>ε: {}
|
||||
'''.format(V0, V1, alpha, alpha>epsilon))
|
||||
|
||||
# times histogram
|
||||
plt.figure(1)
|
||||
plt.xlabel('tempo di caduta da 20cm (s)')
|
||||
plt.ylabel('frequenza\'')
|
||||
plt.xlim(1.80, 2.46)
|
||||
|
||||
# gaussian best fit
|
||||
t = np.linspace(1.80, 2.45, 100)
|
||||
gauss = mlab.normpdf(t, T.mean, T.std)
|
||||
|
||||
plt.plot(t, gauss, 'black', linewidth=1)
|
||||
O, B, _ = plt.hist(T, bins=6, normed=1, facecolor='#506d72')
|
||||
plt.show()
|
||||
|
||||
# χ² test histogram
|
||||
alpha = chi_squared(T, O, B)
|
||||
print('χ²: α={:.3f}, α>ε: {}'.format(alpha, alpha>epsilon))
|
||||
|
||||
# velocity
|
||||
V = 0.200/T.to_ufloat()
|
||||
|
||||
# results
|
||||
print("""
|
||||
m: ({})g
|
||||
d: ({})mm
|
||||
T: ({})s
|
||||
v: ({})m/s
|
||||
""".format(M, D, T, V))
|
||||
|
||||
|
||||
##
|
||||
## Part 2
|
||||
##
|
||||
|
||||
# masses
|
||||
M = [
|
||||
sample(0.0323,0.0326,0.0325,0.0327,0.0328) #2mm
|
||||
, sample(0.1102,0.1101,0.1103,0.1102,0.1100) #3mm
|
||||
, sample(0.2611,0.2610,0.2610,0.2607,0.2612,0.2610,0.2610) #4mm
|
||||
, sample(0.5096,0.5099,0.5101,0.5096,0.5089,0.5099,0.5093,0.5093) #5mm
|
||||
, sample(0.8808,0.8802,0.8802,0.8795) #6mm
|
||||
]
|
||||
|
||||
# diameters
|
||||
D = [
|
||||
sample(1.98,1.99,2.00,2.00,1.99) #2mm
|
||||
, sample(2.99,3.00,3.00,2.99,3.00) #3mm
|
||||
, sample(3.99,3.99,3.99,4.00,4.00,4.00,3.99) #4mm
|
||||
, sample(4.99,5.00,4.99,5.00,4.99,5.00,4.99) #5mm
|
||||
, sample(6.00,6.00,5.99,5.99) #6mm
|
||||
]
|
||||
|
||||
# time to fall (20cm)
|
||||
T = [
|
||||
sample(16.69,17.07,16.83,16.74,16.02,16.83,17.07,16.40,16.77,16.43,
|
||||
16.82,16.93,16.98,16.81,16.54,16.57,16.54,16.41,16.48,16.62) #2mm
|
||||
, sample(7.87,7.70,7.85,7.79,7.76,7.93,7.90,7.72,8.09,7.73,
|
||||
7.65,7.86,7.96,7.99,8.04,7.76,7.86,7.75,7.91,7.86) #3mm
|
||||
, sample(4.57,4.63,4.39,4.46,4.61,4.64,4.58,4.56,4.53,4.63,
|
||||
4.48,4.72,4.63,4.88,4.53,4.82,4.58,4.70,4.39,4.43) #4mm
|
||||
, sample(3.25,3.31,3.43,3.30,3.35,3.31,3.30,3.35,3.37,3.26,
|
||||
3.31,3.18,3.19,3.27,3.21,3.48,3.22,3.13,3.25,3.29) #5mm
|
||||
, sample(2.68,2.60,2.58,2.59,2.53,2.50,2.60,2.53,2.38,2.63,
|
||||
2.43,2.57,2.48,2.41,2.53,2.55,2.42,2.46,2.43,2.56,2.50) #6mm
|
||||
]
|
||||
|
||||
m = 0.001*ufloat(M[4].mean, M[4].std) # sample for density calculation
|
||||
d = 0.001*ufloat(D[4].mean, D[4].std)
|
||||
|
||||
SV = sample(0.200/i.mean*i.std for i in T) #uncertainty on V (≈all identical)
|
||||
V = sample(0.200/i.mean for i in T) #limit velocity (m/s)
|
||||
R = sample(0.001*i.mean/2 for i in D) #radii (m)
|
||||
Rmm = sample(i.mean/2 for i in D) #radii (mm)
|
||||
|
||||
|
||||
k = simple_linear(Rmm**2, V, SV)
|
||||
f = lambda x: k.n*x
|
||||
g = lambda x: k.n*x**2
|
||||
|
||||
# plot R - V
|
||||
plt.figure(2)
|
||||
plt.xlabel('raggio (mm)')
|
||||
plt.ylabel('velocita\' terminale (m/s)')
|
||||
plt.xlim(0, 4)
|
||||
plt.ylim(0, 0.10)
|
||||
|
||||
x = np.linspace(0, Rmm.max**2, 100)
|
||||
plt.plot(x, map(g, x), color='#973838')
|
||||
plt.scatter(Rmm, V, color='#92182b')
|
||||
plt.show()
|
||||
|
||||
# plot R² - V
|
||||
plt.figure(3)
|
||||
plt.xlabel('raggio (mm)^2')
|
||||
plt.ylabel('velocita\' terminale (m/s)')
|
||||
plt.xlim(0, 10)
|
||||
plt.ylim(0, 0.10)
|
||||
|
||||
plt.plot(x, map(f, x), color='#286899')
|
||||
plt.scatter(Rmm**2, V)
|
||||
plt.errorbar(Rmm**2, V, yerr=SV, color='#3a3838', linestyle='')
|
||||
plt.show()
|
||||
|
||||
#linear fit R² - V
|
||||
k = simple_linear(R**2, V, SV)
|
||||
f = lambda x: k.n*x
|
||||
|
||||
# χ² test for linear fit
|
||||
alpha = chi_squared_fit(R**2, V, f, SV)
|
||||
print('''
|
||||
χ²: α={}
|
||||
k: ({})1/m*s
|
||||
'''.format(alpha, k))
|
||||
|
||||
# calculate eta
|
||||
rho_s = m/(4/3* np.pi * (d/2)**3)
|
||||
rho_g = ufloat(1261, 0)
|
||||
g = ufloat(9.81, 0)
|
||||
eta = 2/9*g*(rho_s-rho_g)/k
|
||||
|
||||
print('''
|
||||
ρ: ({})kg/m³
|
||||
η: ({})Pa*s
|
||||
'''.format(rho_s, eta))
|
Loading…
Reference in New Issue
Block a user