1
votes

I have the following program:

nknots = 4
x_i = [0, 1, 2, 3]
y_i = [1, np.exp(1), np.exp(2), np.exp(3)]
coeff = interpolate.make_interp_spline(x_i, y_i, bc_type="natural")

I want to construct a cubic spline using the knots whose coordinates are given by x_i and y_i arrays. However, I'm having a hard time obtaining all the coefficients. A cubic spline function has the following form:

y_i(x) = a + b*(x - x_i) + c*(x - x_i)^2 + d*(x - x_i)^3

When I do

print(coeff(x_i))

I get only the array of a values:

[ 1.          2.71828183  7.3890561  20.08553692]

However, I'm missing the arrays for the b, c, and d coefficients. How do I extract those? Or are there steps I'm missing? I read the scipy documentation on make_interp_spline but I didn't understand how to get the b, c and d coefficients.

2

2 Answers

2
votes

I'd recommend checking out interpolate.CubicSpline. It's much more convenient if what you're after are the polynomial coefficients. Using your variables:

spl = interpolate.CubicSpline( x_i, y_i )
spl.c

array([[-1.57973952e-01,  2.93118310e-01, -1.35144359e-01],
       [ 1.11022302e-16, -4.73921855e-01,  4.05433076e-01],
       [-3.01723742e-01, -7.75645598e-01, -8.44134377e-01],
       [ 1.00000000e+00,  5.40302306e-01, -4.16146837e-01]])

see the PPoly doc for how the piecewise polynomial coefficients are stored.

Addendum: It's possible to extract the coefficients from the output of make_interp_spline, but it's not straightforward it requires an extra step described by @ev-br because "coefficients" for BSplines (emphasis on the B) are not the same as the polynomial coefficients.

1
votes

Given spl = make_interp_spline(...), the spl is a BSpline object which has spl.t as the knots and spl.c the coefficients --- in the b-spline basis. If you really need the coefficients in the power basis, you can evaluate the derivatives of use PPoly.from_spline(spl).

Or indeed use СubicSpline which works in the power basis. (See the answer by @bogovicj)