Fitting a periodic graph in python: parameters for scipy.interpolate.splrep, equation of curve? -
[original question]
i need equation curve increases indefinitely time elapsed increases based on data below. how that?
[updates on question]
i need specify proper parameters scipy.interpolate.splrep
. can helpout?
also, there way equation coeffs of b spline?
[alternate question]
how fit using decomposition of signal in fourier series?
this plot seems combination of linear plot, periodic function pf1 increases 4 time, larger periodic function causes pf1 happen again , again indefinitely. difficulty of plot reason why question has been asked.
data:
time elapsed in sec. tx + rx packets (0,0) (10,2422) (20,2902) (30,2945) (40,3059) (50,3097) (60,4332) (70,4622) (80,4708) (90,4808) (100,4841) (110,6081) (120,6333) (130,6461) (140,6561) (150,6585) (160,7673) (170,8091) (180,8210) (190,8291) (200,8338) (210,8357) (220,8357) (230,8414) (240,8414) (250,8414) (260,8414) (270,8414) (280,8414) (290,8471) (300,8471) (310,8471) (320,8471) (330,8471) (340,8471) (350,8471) (360,8471) (370,8471) (380,8471) (390,8471) (400,8471) (410,8471) (420,8528) (430,8528) (440,8528) (450,8528) (460,8528) (470,8528) (480,8528) (490,8528) (500,8528) (510,9858) (520,10029) (530,10129) (540,10224) (550,10267) (560,11440) (570,11773) (580,11868) (590,11968) (600,12039) (610,13141)
my code:
import numpy np import matplotlib.pyplot plt points = np.array( [(0,0), (10,2422), (20,2902), (30,2945), (40,3059), (50,3097), (60,4332), (70,4622), (80,4708), (90,4808), (100,4841), (110,6081), (120,6333), (130,6461), (140,6561), (150,6585), (160,7673), (170,8091), (180,8210), (190,8291), (200,8338), (210,8357), (220,8357), (230,8414), (240,8414), (250,8414), (260,8414), (270,8414), (280,8414), (290,8471), (300,8471), (310,8471), (320,8471), (330,8471), (340,8471), (350,8471), (360,8471), (370,8471), (380,8471), (390,8471), (400,8471), (410,8471), (420,8528), (430,8528), (440,8528), (450,8528), (460,8528), (470,8528), (480,8528), (490,8528), (500,8528), (510,9858), (520,10029), (530,10129), (540,10224), (550,10267), (560,11440), (570,11773), (580,11868), (590,11968), (600,12039), (610,13141)] ) # x , y vectors x = points[:,0] y = points[:,1] # calculate polynomial z = np.polyfit(x, y, 3) print z f = np.poly1d(z) # calculate new x's , y's x_new = np.linspace(x[0], x[-1], 50) y_new = f(x_new) plt.plot(x,y,'o', x_new, y_new) plt.xlim([x[0]-1, x[-1] + 1 ]) plt.show()
my output:
my code 2:
import numpy n scipy.interpolate import splprep, splev x = n.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610]) y = n.array([0, 2422, 2902, 2945, 3059, 3097, 4332, 4622, 4708, 4808, 4841, 6081, 6333, 6461, 6561, 6585, 7673, 8091, 8210, 8291, 8338, 8357, 8357, 8414, 8414, 8414, 8414, 8414, 8414, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8471, 8528, 8528, 8528, 8528, 8528, 8528, 8528, 8528, 8528, 9858, 10029, 10129, 10224, 10267, 11440, 11773, 11868, 11968, 12039, 13141]) # spline parameters s=1.0 # smoothness parameter k=3 # spline order nest=-1 # estimate of number of knots needed (-1 = maximal) # find knot points tckp,u = splprep([x,y],s=s,k=k,nest=nest,quiet=true,per=1) # evaluate spline, including interpolated points xnew,ynew = splev(n.linspace(0,1,400),tckp) import pylab p data,=p.plot(x,y,'bo-',label='data') fit,=p.plot(xnew,ynew,'r-',label='fit') p.legend() p.xlabel('x') p.ylabel('y') p.show()
my output 2:
it looks have reaction kinetic:
#%% import numpy np scipy.integrate import odeint scipy import optimize matplotlib import pyplot plt #%% data = [] open('data.txt', 'r') f: line in f: data.append(line.strip(' \n ()').split(',')) data = np.array(data,dtype=float) data = data[0:-1].t #%% slope = np.diff(data[1]) index = np.where(slope>1000) index = np.append(index, len(data[0]) -1 ) plt.plot(data[0],data[1],'.') plt.plot(data[0,index],data[1,index],'ro') plt.plot(data[0,1:],np.diff(data[1]))
from here in assume reaction starts @ every marked spot (red). sure code written cleaner, first quick , dirty hack. use scipy curvefit or similar fit raction constant k
#%% time = data[0,index] def model(y,t,k): dydt = np.zeros(2) dydt[0] = -k*y[0] dydt[1] = k*y[0] return dydt def res(k): y_hat = [] t_hat = [] in xrange(len(index) -1): ''' assume @ every timepoint reaction initiated adding y[i + 1] - y[i] new datapackages. on time converted sent packages. packages not react, not take part in next cycle. ''' y0 = [data[1, index[i+1]] - data[1, index[i]], 0] t0 = data[0, index[i]:index[i+1]] y_int,info = odeint(model, y0, t0, args=(k,), full_output = 1 ) # not happy construct below, # not find better solution. y_hat.append(list(y_int[:,1])) t_hat.append(list(t0)) return y_hat,t_hat k = 2e-1 y,t = res(k) ''' may possible play y0[1] in model in order avoid construct below. since started every reaction @ y[1]=0 have add last y value last step. bit of hack, since data[1, index[i]] not corresponding solution. hey, seems work. ''' y_hat = [subitem + data[1, index[i]] i,item in enumerate(y) subitem in item] t_hat = [subitem item in t subitem in item] y_hat = np.array(y_hat,dtype=float) t_hat = np.array(t_hat,dtype=float) #%% plt.plot(data[0],data[1],'.') plt.plot(data[0,index],data[1,index],'ro') plt.plot(t_hat,y_hat,'go')
another approach (maybe physically more correct) add cdf of gaussian peak @ each timepoint.
Comments
Post a Comment