# -*- coding: utf-8 -*- """ Created on Mon May 6 11:42:27 2019 @author: INFIP """ # importamos numpy import numpy as np # importamos matplotlib, pedimos que sea interactivo y que los graficos sean en svg import matplotlib.pyplot as plt plt.ion() # por ultimo, importamos la funcion que nos permitira hacer el ajuste no lineal from scipy.optimize import curve_fit #Leo el archivo txt file="resorte_osc.txt" Misdatos = np.loadtxt(file, delimiter="\t",skiprows=1) #Datos ordenados col1 : x, col 2: y1 t = Misdatos[:,0] y1 = Misdatos[:,1] #Grafico los datos del archivo plt.figure(1) plt.plot(t,y1,'.-') plt.grid('on'); plt.xlabel('t [seg]'); plt.ylabel('Fuerza [N]'); plt.show() def funcion_de_ajuste(t, A, o, p,fo): return A*np.sin(o*(t+p))+fo valores_iniciales = np.array([0.15,8.7,-0.5, 1.7]) fitParams, fitCovariance = curve_fit(funcion_de_ajuste, t, y1, p0=valores_iniciales) # estos son los parametros: print (fitParams) # Errores en los parametros sigma = [fitCovariance[0,0], \ fitCovariance[1,1], \ fitCovariance[2,2], \ fitCovariance[3,3], \ ] # estos son los errores en los parametros: print (sigma) # guardemoslos en una variable de nombre mas corta... (que llamamos res) res = fitParams plt.figure() plt.plot(t, y1, 'b.-', label='datos') plt.plot(t, res[0]*np.cos(res[1]*t+res[2])+res[3], 'r-', label='ajuste no lineal') plt.xlabel('t [s]') plt.ylabel('F(t) [N]') plt.grid('on') # Por ultimo grafiquemos los intervalos de confianza (es dificil verlos!) plt.figure() plt.ylabel('F(t) [N]') plt.xlabel('t [s]') plt.plot(t, funcion_de_ajuste(t, fitParams[0], fitParams[1], fitParams[2], fitParams[3])) plt.plot(t, funcion_de_ajuste(t, fitParams[0] + sigma[0], fitParams[1] - sigma[1], fitParams[2] + sigma[2],fitParams[3] + sigma[3] )) plt.plot(t, funcion_de_ajuste(t, fitParams[0] - sigma[0], fitParams[1] + sigma[1], fitParams[2] - sigma[2],fitParams[3] - sigma[3] )) plt.grid('on')