signal lagrange interpolate extrapolate cubicos code python numpy scipy interpolation spline

lagrange - spline python



Usando la funciĆ³n scipy.interpolate.splrep (2)

Creo que el propósito de la función que está utilizando, splrep( ), es ajustar la coordenada y como una función de la coordenada x : y = f (x) .

Para que splrep() funcione como se espera, su función debe tener un solo valor. Es decir, debe ser capaz de dibujar una línea vertical en el gráfico en cualquier lugar y hacer que se corte la curva exactamente una vez.

En cambio, tal vez quiera ajustar xey por separado a un tercer parámetro t que aumente monótonamente.

x = f (t)
y = g (t)

Hay dos opciones fáciles para t . El primero es solo el índice del punto (0 para el primer punto, 1 para el segundo punto, etc.). La segunda opción es un poco más difícil, la distancia acumulada en línea recta viajó de un punto a otro. Luego, llamaría a slrep() por separado para las coordenadas xey .

t = [0] for i in range(1, len(x)): t[i] = t[i-1]+np.hypot(x[i]-x[i-1], y[i]-y[i-1])

Tal vez en su lugar quieres una spline más bezier?

Estoy tratando de ajustar una spline cúbica a un conjunto dado de puntos. Mis puntos no están ordenados NO PUEDO ordenar ni reordenar los puntos, ya que necesito esa información.

Pero dado que la función scipy.interpolate.splrep solo funciona en puntos que no son duplicados y monótonamente crecientes, he definido una función que mapea las coordenadas x a un espacio monótonamente creciente.

Mis viejos puntos son:

xpoints=[4913.0, 4912.0, 4914.0, 4913.0, 4913.0, 4913.0, 4914.0, 4915.0, 4918.0, 4921.0, 4925.0, 4932.0, 4938.0, 4945.0, 4950.0, 4954.0, 4955.0, 4957.0, 4956.0, 4953.0, 4949.0, 4943.0, 4933.0, 4921.0, 4911.0, 4898.0, 4886.0, 4874.0, 4865.0, 4858.0, 4853.0, 4849.0, 4848.0, 4849.0, 4851.0, 4858.0, 4864.0, 4869.0, 4877.0, 4884.0, 4893.0, 4903.0, 4913.0, 4923.0, 4935.0, 4947.0, 4959.0, 4970.0, 4981.0, 4991.0, 5000.0, 5005.0, 5010.0, 5015.0, 5019.0, 5020.0, 5021.0, 5023.0, 5025.0, 5027.0, 5027.0, 5028.0, 5028.0, 5030.0, 5031.0, 5033.0, 5035.0, 5037.0, 5040.0, 5043.0] ypoints=[10557.0, 10563.0, 10567.0, 10571.0, 10575.0, 10577.0, 10578.0, 10581.0, 10582.0, 10582.0, 10582.0, 10581.0, 10578.0, 10576.0, 10572.0, 10567.0, 10560.0, 10550.0, 10541.0, 10531.0, 10520.0, 10511.0, 10503.0, 10496.0, 10490.0, 10487.0, 10488.0, 10488.0, 10490.0, 10495.0, 10504.0, 10513.0, 10523.0, 10533.0, 10542.0, 10550.0, 10556.0, 10559.0, 10560.0, 10559.0, 10555.0, 10550.0, 10543.0, 10533.0, 10522.0, 10514.0, 10505.0, 10496.0, 10490.0, 10486.0, 10482.0, 10481.0, 10482.0, 10486.0, 10491.0, 10497.0, 10506.0, 10516.0, 10524.0, 10534.0, 10544.0, 10552.0, 10558.0, 10564.0, 10569.0, 10573.0, 10576.0, 10578.0, 10581.0, 10582.0]

Parcelas:

El código para la función de mapeo y la interpolación es:

xnew=[] ynew=ypoints for c3,i in enumerate(xpoints): if np.isfinite(np.log(i*pow(2,c3))): xnew.append(np.log(i*pow(2,c3))) else: if c==0: xnew.append(np.random.random_sample()) else: xnew.append(xnew[c3-1]+np.random.random_sample()) xnew=np.asarray(xnew) ynew=np.asarray(ynew) constant1=10.0 nknots=len(xnew)/constant1 idx_knots = (np.arange(1,len(xnew)-1,(len(xnew)-2)/np.double(nknots))).astype(''int'') knots = [xnew[i] for i in idx_knots] knots = np.asarray(knots) int_range=np.linspace(min(xnew),max(xnew),len(xnew)) tck = interpolate.splrep(xnew,ynew,k=3,task=-1,t=knots) y1= interpolate.splev(int_range,tck,der=0)

El código arroja un error en la función interpolate.splrep () para un conjunto de puntos como el anterior.

El error es: File "/home/neeraj/Desktop/koustav/res/BOS5/fit_spline3.py", línea 58, en save_spline_f tck = interpolate.splrep (xnew, ynew, k = 3, task = -1, t = nudos) Archivo "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", línea 465, en splrep raise _iermess ier (_iermess [ier] [0]) ValueError: error en los datos de entrada

Pero para otro conjunto de puntos funciona bien. Por ejemplo, para el siguiente conjunto de puntos.

xpoints=[1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1629.0, 1630.0, 1630.0, 1630.0, 1631.0, 1631.0, 1631.0, 1631.0, 1630.0, 1629.0, 1629.0, 1629.0, 1628.0, 1627.0, 1627.0, 1625.0, 1624.0, 1624.0, 1623.0, 1620.0, 1618.0, 1617.0, 1616.0, 1615.0, 1614.0, 1614.0, 1612.0, 1612.0, 1612.0, 1611.0, 1610.0, 1609.0, 1608.0, 1607.0, 1607.0, 1603.0, 1602.0, 1602.0, 1601.0, 1601.0, 1600.0, 1599.0, 1598.0] ypoints=[10570.0, 10572.0, 10572.0, 10573.0, 10572.0, 10572.0, 10571.0, 10570.0, 10569.0, 10565.0, 10564.0, 10563.0, 10562.0, 10560.0, 10558.0, 10556.0, 10554.0, 10551.0, 10548.0, 10547.0, 10544.0, 10542.0, 10541.0, 10538.0, 10534.0, 10532.0, 10531.0, 10528.0, 10525.0, 10522.0, 10519.0, 10517.0, 10516.0, 10512.0, 10509.0, 10509.0, 10507.0, 10504.0, 10502.0, 10500.0, 10501.0, 10499.0, 10498.0, 10496.0, 10491.0, 10492.0, 10488.0, 10488.0, 10488.0, 10486.0, 10486.0, 10485.0, 10485.0, 10486.0, 10483.0, 10483.0, 10482.0, 10480.0]

Parcelas: ¿Alguien puede sugerir lo que está pasando? Gracias por adelantado......


En realidad, no tiene que definir una nueva función usted mismo. Es similar a esta interpolación de trayectoria: scipy: trayectoria de interpolación ( scipy: trayectoria de interpolación )

Y la respuesta es buena para mí, espero que pueda ayudarte.

from scipy import interpolate as itp mytck,myu=itp.splprep([xpoints,ypoints]) xnew,ynew= itp.splev(np.linspace(0,1,1000),mytck) plot(xnew,ynew)