Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scipy: Interpolating trajectory

I have a trajectory formed by a sequence of (x,y) pairs. I would like to interpolate points on this trajectory using splines.

How do I do this? Using scipy.interpolate.UnivariateSpline doesn't work because neither x nor y are monotonic. I could introduce a parametrization (e.g. length d along the trajectory), but then I have two dependent variables x(d) and y(d).

Example:

import numpy as np
import matplotlib.pyplot as plt
import math

error = 0.1
x0 = 1
y0 = 1
r0 = 0.5

alpha = np.linspace(0, 2*math.pi, 40, endpoint=False)
r = r0 + error * np.random.random(len(alpha))
x = x0 + r * np.cos(alpha)
y = x0 + r * np.sin(alpha)
plt.scatter(x, y, color='blue', label='given')

# For this special case, the following code produces the
# desired results. However, I need something that depends
# only on x and y:
from scipy.interpolate import interp1d
alpha_i = np.linspace(alpha[0], alpha[-1], 100)
r_i = interp1d(alpha, r, kind=3)(alpha_i)
x_i = x0 + r_i * np.cos(alpha_i)
y_i = x0 + r_i * np.sin(alpha_i)
plt.plot(x_i, y_i, color='green', label='desired')

plt.legend()
plt.show()

example data

like image 272
Nikratio Avatar asked Jan 09 '13 18:01

Nikratio


People also ask

How do you interpolate time series data in Python?

Preparing the Data and Initial Visualization First, we generate a pandas data frame df0 with some test data. We create a mock data set containing two houses and use a sin and a cos function to generate some sensor read data for a set of dates. To generate the missing values, we randomly drop half of the entries.

How do you fit a cubic spline in Python?

In cubic spline interpolation (as shown in the following figure), the interpolating function is a set of piecewise cubic functions. Specifically, we assume that the points (xi,yi) and (xi+1,yi+1) are joined by a cubic polynomial Si(x)=aix3+bix2+cix+di that is valid for xi≤x≤xi+1 for i=1,…,n−1.


1 Answers

Using splprep you can interpolate over curves of any geometry.

from scipy import interpolate
tck,u=interpolate.splprep([x,y],s=0.0)
x_i,y_i= interpolate.splev(np.linspace(0,1,100),tck)

Which produces a plot like the one given, but only using the x and y points and not the alpha and r paramters. Same as yours only using x and y points.

Sorry about my original answer, I misread the question.

like image 112
Adam Cadien Avatar answered Nov 04 '22 17:11

Adam Cadien