Вы можете изменить количество базовых функций B-сплайна, указав вектор узла с параметром t
. Поскольку существует соединение number of knots = number of coefficients + degree + 1
, количество узлов также будет определять количество коэффициентов (== количество базисных функций).
Использование параметра t
не так интуитивно понятно, поскольку данные узлы должны быть только внутренними узлами. Так, например, если вы хотите 7 коэффициентов для кубического сплайна, вам нужно дать 3 внутренних узла. Внутри функции он дополняет первый и последний (градус + 1) узлы xb
и xe
(условия зажимного конца см., Например, здесь ).
Кроме того, как говорится в документации, узлы должны удовлетворять условиям Шенберга-Уитни.
Вот пример кода, который делает это:
# Input:
x = np.linspace(0,2*np.pi, 9)
y = np.sin(x)
# Your code:
spl = scipy.interpolate.splrep(x, y)
t,c,k = spl # knots, coefficients, degree (==3 for cubic)
# Computing the inner knots and using them:
t3 = np.linspace(x[0],x[-1],5) # five equally spaced knots in the interval
t3 = t3[1:-1] # take only the three inner values
spl3 = scipy.interpolate.splrep(x, y, t=t3)
Что касается вашего второго вопроса, вы правы, что коэффициенты действительно хранятся в spl[1]
. Однако обратите внимание, что (как сказано в документации) последние (градус + 1) значения дополняются нулями и должны игнорироваться.
Для оценки результирующего B-сплайна вы можете использовать функцию splev
или класс BSpline
.
Ниже приведен пример кода, который оценивает и рисует вышеупомянутые сплайны (в результате на следующем рисунке):
xx = np.linspace(x[0], x[-1], 101) # sample points
yy = scipy.interpolate.splev(xx, spl) # evaluate original spline
yy3 = scipy.interpolate.splev(xx, spl3) # evaluate new spline
plot(x,y,'b.') # plot original interpolation points
plot(xx,yy,'r-', label='spl')
plot(xx,yy3,'g-', label='spl3')