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.

enter image description here

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:

enter image description here

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: enter image description here

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])) 

enter image description here

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') 

enter image description here

another approach (maybe physically more correct) add cdf of gaussian peak @ each timepoint.


Comments

Popular posts from this blog

powershell Start-Process exit code -1073741502 when used with Credential from a windows service environment -

twig - Using Twigbridge in a Laravel 5.1 Package -

c# - LINQ join Entities from HashSet's, Join vs Dictionary vs HashSet performance -