101 lines
2.4 KiB
Python
101 lines
2.4 KiB
Python
# 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)
|