%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
time,v1,v2 = np.loadtxt('dati/passa_alto_signal_square_wave.csv', delimiter=',', unpack=True, skiprows=1)
plt.plot(time,v1, label='Canale 1')
plt.plot(time,v2, label='Canale 2')
plt.xlabel('Tempo [s]',fontsize=16)
plt.ylabel('Ampiezza segnali [V]',fontsize=16)
plt.legend(fontsize=16)
plt.show()
Vogliamo analizzare la curva esponenziale e verificare che la costante di tempo corrisponda alla costante di tempo caratteristica del circuito RC.
Per farlo prima definiamo la funzione esponenziale e poi la usiamo per un fit su un sottoinsieme dei dati.
time_sub=time[(time>0.0001) & (time<0.0007)]
v2_sub = v2[(time>0.0001) & (time<0.0007)]
plt.plot(time,v1, label='Canale 1')
plt.plot(time_sub,v2_sub, label='Canale 2')
def expo(t,A,RC):
return A*np.exp(-t/RC)
pars0=[1,100e-6]
plt.plot(time_sub,expo(time_sub,*pars0), label='Esp. prima del fit')
pars, cov = curve_fit(expo,time_sub,v2_sub,p0=pars0)
plt.plot(time_sub,expo(time_sub,*pars),'--r', label='Esp. dopo del fit')
plt.legend()
plt.show()
print('Parametri risultanti del fit: ')
print('p0 = A = %s V' % pars[0])
print('p1 = RC = %s' % pars[1])
Per mostrare solo l'esponenziale basta ripetere il plot di prima escludendo il Canale 1 (che allarga il range)
plt.title('Fit esponenziale',fontsize=16)
plt.xlabel('Tempo [s]',fontsize=16)
plt.ylabel('Ampiezza segnale [V]',fontsize=16)
plt.plot(time_sub,v2_sub, label='Canale 2')
plt.plot(time_sub,expo(time_sub,*pars0), label='Esp. prima del fit')
plt.plot(time_sub,expo(time_sub,*pars),'--r', label='Esp. dopo del fit')
plt.legend(fontsize=16)
plt.show()