# -*- coding: utf-8 -*- """ Created on Wed Jul 22 18:49:57 2020 @author: User """ #%% #Loading modules import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit import os from IPython import get_ipython #selecciono el grafico en Terminal (inline) o en ventana emergente (qt5) #get_ipython().run_line_magic('matplotlib', 'inline') get_ipython().run_line_magic('matplotlib', 'qt5') #Elijo el directorio donde se encuentran los archivos que voy a analiza os.chdir (r'C:\Users\Charly\NubeDF\Arduino\Data\Transitorios') print("nombre del archivo completo con terminación .txt incluida") file = input() print("Valor de la R (ohm)") Resist = float(input()) #Importo los datos del archivo data = np.loadtxt(file,dtype=float,delimiter = ',',skiprows= 1) x1i = data[:,0] #columna de tiempo en segundos y1i = data[:,2] #caida de tensión sobre el capacitor y2i= (data[:,1]-data[:,2])/Resist #corriente del circuito #vdif=y1-y2 #construyendo un vector con número de datos numdatos=np.arange(len(y1i),step=1,dtype=int) #Graficando nuestros datos en función del número de dato plt.ion() plt.close("all") fig, ax1 = plt.subplots() ax1.plot(numdatos, y1i,'.-g'); ax1.set_ylabel('Tensión(V)'); ax1.set_xlabel('número de dato'); ax2=ax1.twinx() ax2.plot(numdatos, y2i,'.-r') ax2.set_ylabel('Corriente(A)', color='r') #%% print("Seleccionar el semi-ciclo de carga o descarga a analizar") print("Por ej: 1-3-5 para carga o 2-4-6 para descarga") print("(si es que tienen 3 ciclos completos medidos)") ciclo = int(input()) #limitar los datos al rango de interés datoinicial1=(ciclo-1)*80 datofinal1=datoinicial1+79 x1=x1i[datoinicial1:datofinal1] y1=y1i[datoinicial1:datofinal1] y2=y2i[datoinicial1:datofinal1] x1corr=x1i[datoinicial1+5:datofinal1] y2corr=y2i[datoinicial1+5:datofinal1] #Graficamos los datos en la zona elegida en función del tiempo fig, y1x = plt.subplots() y1x.plot(x1, y1,'.-g'); y1x.set_ylabel('Tensión (V)'); y1x.set_xlabel('tiempo(s)'); y2x=y1x.twinx() y2x.plot(x1corr, y2corr,'.-r') y2x.set_ylabel('Corriente(A)', color='r') #%% #definimos la función que vamos a usar para el ajuste, una función exponencial decreciente + una constante #para la corriente def corriente(time, a,b): y= a*np.exp(-time*b) return y #tensión capacitor N=len(y1) Ncorr=len(y2corr) Vfinal= y1[N-10] # me da el valor final que alcanza la tensión del capacitor def tension(time, c,d): z= c*np.exp(-time*d)+Vfinal return z # Ajuste de los datos popt2, pcov2 = curve_fit(corriente, x1corr,y2corr) # Ajuste de los datos popt1, pcov1 = curve_fit(tension, x1,y1) i=corriente(x1corr,*popt2) VC=tension(x1,*popt1) # ESTIMO LOS ERRORES ( 1 sigma ) perr1 = np.sqrt(np.diag(pcov1)) perr2 = np.sqrt(np.diag(pcov2)) #Grafico los resultados de la tensión del capacitor: datos +ajuste plt.figure(3) plt.scatter(x1, y1, label='data') plt.plot(x1, VC, color = 'red', linewidth = 2.0, label='fit') plt.xlim(x1[0],x1[N-1]) plt.xlabel("Tiempo (s)") plt.ylabel("Tensión (V)") plt.title("RC transitorio") plt.legend() #Grafico los resultados de la corriente: datos +ajuste plt.figure(4) plt.scatter(x1corr, y2corr, label='data') plt.plot(x1corr, i, color = 'red', linewidth = 2.0, label='fit') plt.xlim(x1[0],x1[N-1]) corrmin=min(y2corr[0],y2corr[Ncorr-1]) corrmax=max(y2corr[0],y2corr[Ncorr-1]) plt.ylim(corrmin,corrmax) plt.xlabel("Tiempo (s)") plt.ylabel("Corriente (A)") plt.title("RC transitorio") plt.legend() #calculo el tiempo de carga/descarga característico a partir de las dos señales para compararlos tauVC=1/popt1[1] taui=1/popt2[1] deltatauVC=perr1[1]/popt1[1]*tauVC deltataui=perr2[1]/popt2[1]*taui print('Tiempo característico extraído de la tensión del condensador') print('tau = (', round(tauVC,5), '+/-', round(deltatauVC,5), ')s') print('Tiempo característico extraído de la corriente') print('tau = (', round(taui,5), '+/-', round(deltataui,5), ') s') """ #guardo los datos en un archiva de salida fsalida=open('SalidaRCtransitorio.txt','a') fsalida.write('%10.9f' %(tauVC)+',') fsalida.write('%10.9f' % (deltatauVC)+',') fsalida.write('%8.2f' % (Resist)+',') fsalida.write('%8.2f' % (0.01*Resist)+'\n') fsalida.close() """