import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
from scipy.signal import find_peaks
def oscilador(t, A, T, b):
return A * np.exp(-b * t) * np.cos(2 * np.pi * t / T)
t, y = np.loadtxt("disipacion/pendulo_angulo_10_disipacion_0_ruido_normal_0.1.txt", unpack=True)
params, _ = curve_fit(oscilador, t, y, p0=(10, 2, 0))
plt.plot(t, y, "o")
plt.plot(t, oscilador(t, *params))
params
array([ 1.00010596e+01, 2.01091438e+00, -2.80164486e-06])
t, y = np.loadtxt("disipacion/pendulo_angulo_10_disipacion_0.03_ruido_normal_0.1.txt", unpack=True)
params, _ = curve_fit(oscilador, t, y, p0=(10, 2, 0.03))
plt.plot(t, y, "o")
plt.plot(t, oscilador(t, *params))
params
array([10.01404931, 2.00926724, 0.03019278])
t, y = np.loadtxt("disipacion/pendulo_angulo_10_disipacion_0.09_ruido_normal_0.1.txt", unpack=True)
params, _ = curve_fit(oscilador, t, y, p0=(10, 2, 0.09))
plt.plot(t, y, "o")
plt.plot(t, oscilador(t, *params))
params
array([10.03749978, 2.01105477, 0.09013495])
t, y = np.loadtxt("disipacion/pendulo_angulo_70_disipacion_0.09_ruido_normal_0.1.txt", unpack=True)
params, _ = curve_fit(oscilador, t, y, p0=(10, 2, 0.09))
plt.figure(figsize=(6, 4))
plt.plot(t, y, "o")
plt.plot(t, oscilador(t, *params))
params
array([72.20017226, 2.09404576, 0.11056214])
plt.plot(t, y - oscilador(t, *params), 'o')
[<matplotlib.lines.Line2D at 0x7efc9e4453d0>]
ix, _ = find_peaks(y)
t_picos = t[ix]
y_picos = y[ix]
plt.plot(t, y, 'o--')
plt.plot(t_picos, y_picos, 'o--')
# plt.xlim(10, 15)
[<matplotlib.lines.Line2D at 0x7efc9e41e670>]
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
for a in ax:
a.plot(t_picos, y_picos, 'o--')
ax[1].set(yscale="log")
[None]
def exponencial(t, A, b):
return A * np.exp(-b * t)
params, _ = curve_fit(exponencial, t_picos, y_picos, p0=(70, 0.09))
fig, ax = plt.subplots(1, 2, figsize=(12, 4))
for a in ax:
a.plot(t_picos, y_picos, 'o--')
a.plot(t_picos, exponencial(t_picos, *params))
ax[1].set(yscale="log")
params
array([68.23740985, 0.09061605])
def lineal(t, a, b):
return a * t + b
params, _ = curve_fit(lineal, t_picos, np.log(y_picos), p0=(70, 0.09))
params
array([-0.08985282, 4.21050166])
T = np.diff(t[ix])
plt.plot(T, 'o')
plt.ylim(1.75, 2.25)
(1.75, 2.25)
def refinar_pico(ix, t, y):
t = t[ix-1:][:3]
y = y[ix-1:][:3]
p = np.polyfit(t, y, 2)
return np.roots(np.polyder(p))[0]
t_refinado = np.array([refinar_pico(i, t, y) for i in ix])
T_refinado = np.diff(t_refinado)
plt.plot(T, 'o')
plt.plot(T_refinado, 'o')
plt.ylim(1.75, 2.25)
(1.75, 2.25)