Я пытаюсь сделать что-то вроде следующего (изображение извлечено из википедии)
#!/usr/bin/env python
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt
# sampling
x = np.linspace(0, 10, 10)
y = np.sin(x)
# spline trough all the sampled points
tck = interpolate.splrep(x, y)
x2 = np.linspace(0, 10, 200)
y2 = interpolate.splev(x2, tck)
# spline with all the middle points as knots (not working yet)
# knots = x[1:-1] # it should be something like this
knots = np.array([x[1]]) # not working with above line and just seeing what this line does
weights = np.concatenate(([1],np.ones(x.shape[0]-2)*.01,[1]))
tck = interpolate.splrep(x, y, t=knots, w=weights)
x3 = np.linspace(0, 10, 200)
y3 = interpolate.splev(x2, tck)
# plot
plt.plot(x, y, 'go', x2, y2, 'b', x3, y3,'r')
plt.show()
Первая часть кода - это код, извлеченный из основной ссылки, но он не объяснил, как использовать точки в качестве узлов управления.
Результатом этого кода является следующее изображение.
Точками являются образцы, синяя линия - сплайн с учетом всех точек. И красная линия - это та, которая не работает для меня. Я стараюсь учитывать все промежуточные точки в качестве узлов управления, но я просто не могу. Если я пытаюсь использовать knots=x[1:-1]
, это просто не работает. Я был бы признателен за любую помощь.
Короче говоря: как использовать все промежуточные точки в качестве узлов управления в функции сплайна?
Примечание: это последнее изображение именно то, что мне нужно, и это разница между тем, что у меня есть (сплайн, передающий все точки) и тем, что мне нужно (сплайн с контрольными узлами). Есть идеи?