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.
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]