Используя scipy splrep I легко вписывается в тестовую синусоиду:
import numpy as np
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt
plt.style.use("ggplot")
# Generate test sinewave
x = np.arange(0, 20, .1)
y = np.sin(x)
# Interpolate
tck = splrep(x, y)
x_spl = x + 0.05 # Just to show it wors
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
В документации splrep что значение по умолчанию для параметра веса np.ones(len(x))
. Однако построение этого графика приводит к совершенно другому сюжету:
tck = splrep(x, y, w=np.ones(len(x_spl)))
y_spl = splev(x_spl, tck)
plt.plot(x_spl, y_spl)
В документации также указано, что условие сглаживания s
отличается, когда задан массив весов, но даже при установке s=len(x_spl) - np.sqrt(2*len(x_spl))
(значение по умолчанию без массива весов) результат не строго соответствует исходной кривой, как показано на графике.
Что мне нужно изменить в приведенном выше коде, чтобы интерполяция с массивом весов (как указано выше) выводила тот же результат, что и интерполяция без весов? Я тестировал это с помощью scipy 0.17.0. Gist с тестовой записной книжкой IPython