# coding: utf-8 # Rutinas básicas para el laboratorio. Ajuste exponencial # In[1]: import numpy as np from matplotlib import pyplot as plt from scipy.optimize import curve_fit get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: # Cargo datos exponenciales Misdatos_exp = np.loadtxt('Misdatos_exp.txt') xe = Misdatos_exp[:,0] ye = Misdatos_exp[:,1] dye = Misdatos_exp[:,2] # ploteo los datos para chequearlos plt.plot(xe,ye,'bo', label = 'datos') plt.errorbar(xe,ye,dye, linestyle = 'None') plt.title('X vs Y exp') plt.xlabel('Mediciones X') plt.ylabel('Valores y') plt.legend() plt.show() # In[6]: # CASO 1: Hago un ajuste exponencial # defino la función que necesito (acorde a la ley o ecuación que espero sigan mis datos) def fe(x, a, b, c): return a*np.exp(-x/b)+c param, cov = curve_fit(fe, xe, ye, sigma = dye) # In[7]: plt.plot(xe,ye,'bo', label = 'datos') plt.plot(xe,fe(xe, param[0], param[1], param[2]), 'r-', label = 'Ajuste') plt.errorbar(xe, ye, dye, linestyle = 'None') plt.title('X vs Y exp') plt.xlabel('Mediciones X') plt.ylabel('Valores y') plt.legend() plt.show() print('a=', param[0], 'b=', param[1], 'c =', param[2]) print('da=', np.sqrt(cov[0,0]), 'db=', np.sqrt(cov[1,1]), 'dc=', np.sqrt(cov[2,2])) # In[70]: # Puedo mirar el plot en escala logaritmica plt.plot(xe,ye,'bo', label = 'datos') plt.plot(xe,fe(xe, cofe[0], cofe[1], cofe[2]), 'r-', label = 'Ajuste') plt.errorbar(xe, ye, dye, linestyle = 'None') plt.title('X vs Y exp') plt.xlabel('Mediciones X') plt.ylabel('Valores y') plt.legend() plt.yscale('log') plt.show() # In[72]: # Le cambio la escala buscando dónde es más lineal plt.plot(xe,ye,'bo', label = 'datos') plt.plot(xe,fe(xe, cofe[0], cofe[1], cofe[2]), 'r-', label = 'Ajuste') plt.errorbar(xe, ye, dye, linestyle = 'None') plt.title('X vs Y exp') plt.xlabel('Mediciones X') plt.ylabel('Valores y') plt.legend() plt.yscale('log') plt.xlim(-20,-5) plt.show() # In[82]: # CASO 2: Calculo log(y) y hago ajuste lineal ylog = np.log(ye) plt.plot(xe,ylog,'bo', label = 'datos') plt.show() # In[88]: # Asumo que no todo el rango es lineal, por lo que elijo un rango y ajusto solo esa parte de los datos xe_sub = xe[xe<0] ylog_sub = ylog[xe<0] plt.plot(xe_sub,ylog_sub,'bo', label = 'datos') plt.show() # In[ ]: # AJUSTO LINEAL ESTO # para ello uso el script de ajuste lineal usando como variables xe_sub y ylog_sub # anímense solos!