scipy: интерполирующая траектория

У меня есть траектория, образованная последовательностью пар (x, y). Я хотел бы интерполировать точки на этой траектории с помощью сплайнов.

Как мне это сделать? Использование scipy.interpolate.UnivariateSpline не работает, потому что ни x, ни y не являются монотонными. Я мог бы ввести параметризацию (например, длину d вдоль траектории), но тогда у меня есть две зависимые переменные x (d) и y (d) .

Пример:

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

пример данных


person Nikratio    schedule 09.01.2013    source источник
comment
@alinsoar: данные (x, y) в примере не подходят?   -  person Nikratio    schedule 09.01.2013


Ответы (1)


Используя splprep, вы можете интерполировать кривые любой геометрии.

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)

Это создает график, подобный приведенному, но только с использованием точек x и y, а не параметров alpha и r. То же, что и ваш, только с использованием точек x и y.

Извините за свой первоначальный ответ, я неправильно понял вопрос.

person Adam Cadien    schedule 09.01.2013
comment
Есть ли способ контролировать толщину соединений? - person crypdick; 13.07.2018