Gegeven is een reeks van $$N+1$$ waarden $$x_i$$ met bijhorende functiewaarden $$y_i$$ ($$0 \le i \le N$$). De $$x$$-punten zijn equidistant, zodat $$x_{i+1} - x_{i} = h > 0$$.

We wensen een functie te fitten aan deze punten, en daartoe stellen we in elk interval $$[x_i, x_{i+1}]$$ een kubische veelterm voor, namelijk:

$$P_i(x) = y_i + b_i(x-x_i) + c_i(x-x_i)^2 + d_i(x-x_i)^3, \text{met } 0 \le i \lt N$$

De functie $$f(x)$$ is dus per interval gedefinieerd als een veeltermfunctie. Over het volledige interval $$[x_0,x_N]$$ is de functie $$f(x)$$ dus een aaneenschakeling van veeltermen.

De coëfficiënten $$b_i$$, $$c_i$$ en $$d_i$$ zijn te zoeken grootheden. Om deze vast te leggen, worden een reeks voorwaarden opgelegd om de functie $$f(x)$$ continu en voldoende glad te maken, wat aanleiding geeft tot onderstaand stelsel in de onbekenden $$b_i, c_i, d_i$$ ($$0 \le i < N$$)

$$\begin{cases}hb_{i-1} + h^2c_{i-1}+h^3d_{i-1}&=y_i - y_{i-1}\\ b_{i-1}-b_i+2hc_{i-1}+3h^2d_{i-1}&=0\\c_{i-1}-c_i+3hd_{i-1}&=0\\ hb_{N-1}+h^2c_{N-1}+h^3d_{N-1}&=y_N - y_{N-1}\\ c_0&=0\\ \\c_{N-1}+3hd_{N-1}&=0\end{cases}$$

waarbij de eerste 3 vergelijkingen gelden voor $$1 \le i < N$$.

Schrijf de functie spline3() met als argumenten de 1D NumPy- rijen x en y, elk bestaande uit N+1 reële getallen. Het resultaat van de functie is de 1D NumPy-rij, met $$3N$$ componenten, die de oplossing van bovenstaand stelsel bevat, namelijk [b0, c0, d0, b1, c2, d1, ...]. Het is hierbij de bedoeling dit stelsel volledig te construeren en vervolgens op te lossen. Gebruik zo veel mogelijk de geziene ingebouwde NumPy-functionaliteit.

Voorbeeld

x = np.array([-7.0, -6.0, -5.0, -4.0, -3.0, -2.0])
y = np.array([5.089685242514852, 2.4208420859231627, 10.82540893401563, 6.503962993840951, 2.1015572909559777, 9.552280583187677])
s = spline3(x, y)
print(s)
#[ -6.49096844   0.           3.82212528   4.97540741  11.46637585
#  -8.03721641   3.79650988 -12.64527338   4.52731756  -7.9120842
#   0.93667929   2.57299921   1.68027201   8.65567692  -2.88522564]