Natural Cubic spline

18 Jul, 2021
The cubic spline is a spline that uses the third-degree polynomial which satisfied the given m control points. To derive the solutions for the cubic spline, we assume the second derivation 0 at endpoints, which in turn provides a boundary condition that adds two equations to m-2 equations to make them solvable. The system of equations for the Cubic spline for 1-dimension can be given by:
We take a set of points [xi, yi] for i = 0, 1, ..., n for the function y = f(x). The cubic spline interpolation is a piecewise continuous curve, passing through each of the values in the table. 
Following are the conditions for the spline of degree K=3:The domain of s is in intervals of [a, b].S, S’, S” are all continuous function on [a,b].
The domain of s is in intervals of [a, b].
S, S’, S” are all continuous function on [a,b].
Here Si(x) is the cubic polynomial that will be used on the subinterval [xi, xi+1]. 
Since, there are n intervals and 4 coefficients of each equation, for that we require a 4n parameters to solve the spline, we can get 2n equation from the fact that each of the cubic spline equation should satisfy the value at both ends:
The above cubic spline equations should not only continuous and differentiable but also have defined first and second derivatives that are also continuous on control points.
and
For 1, 2, 3...n-1 provides the 2n -2 equation constraints. So, we need 2 more equations to solve the above cubic spline. For that, we will use some natural boundary conditions.
In Natural cubic spline, we assume that the second derivative of the spline at boundary points is 0:
 
Now, since the S(x) is a third-order polynomial we know that S”(x) is a linear spline which interpolates. Hence, first, we construct S”(x) then integrate it twice to obtain S(x). 
Now, let’s assume t_i = x_i for i= 0, 1,...n, and  and from the natural boundary condition . Twice differentiating a cubic spline gives a linear spline which can be written as:
where, 
Now, the equation becomes:
Integrating this equation two times to obtain the cubic spline:
where, 
Now, to check for the continuity of derivative at t_i i.e S^{‘}_{i}(t_i) = S^{‘}_{i-1}(t_{i}). We first need to find derivatives and put that condition:
where,
Putting the above equation for the continuity and solving it gives the following equation:
Take, v_i = 6(b_i – b_{i-1}) and the above equation can be written as form of matrix:
In this implementation, we will be performing the spline interpolation for function f(x) = 1/x for points b/w 2-10 with cubic spline that satisfied natural boundary condition.
Python3
#importsimport matplotlib.pyplot as pltimport numpy as npfrom scipy.interpolate import CubicSpline, interp1dplt.rcParams['figure.figsize'] =(12,8)  x = np.arange(2,10)y = 1/(x)# apply cubic spline interpolationcs = CubicSpline(x, y, extrapolate=True)# apply natural cubic spline interpolationns = CubicSpline(x, y,bc_type='natural', extrapolate=True)  # Apply Linear interpolationlinear_int = interp1d(x,y)  xs = np.arange(2, 9, 0.1)ys = linear_int(xs)  # plot linear interpolationplt.plot(x, y,'o', label='data')plt.plot(xs,ys,  label="interpolation", color='green')plt.legend(loc='upper right', ncol=2)plt.title('Linear Interpolation')plt.show()  # define a new xsxs = np.arange(1,15)#plot cubic spline and natural cubic splineplt.plot(x, y, 'o', label='data')plt.plot(xs, 1/(xs), label='true')plt.plot(xs, cs(xs), label="S")plt.plot(xs, ns(xs), label="NS")plt.plot(xs, ns(xs,2), label="NS''")plt.plot(xs, ns(xs,1), label="NS'")  plt.legend(loc='upper right', ncol=2)plt.title('Cubic/Natural Cubic Spline Interpolation')plt.show()  # check for boundary conditionprint("Value of double differentiation at boundary conditions are %s and %s"      %(ns(2,2),ns(10,2)))
Output:
Value of double differentiation at boundary conditions are -1.1102230246251565e-16 and -0.00450262550915248
Linear Interpolation
Cubic/Natural Spline Interpolation
Natural Cubic Spline NTNU university
Machine Learning
Machine Learning
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.