Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Cubic spline Interpolation

  • Last Updated : 18 Jul, 2021

Interpolation:

We estimate f(x) for arbitrary x, by drawing a smooth curve through the xi. If the desired x is between the largest and smallest of the xi then it is called interpolation, otherwise, it is called Extrapolation.

Random points

Linear Interpolation:

Linear Interpolation is a way of curve fitting the points by using linear polynomial such as the equation of the line. This is just similar to joining points by drawing a line b/w the two points in the dataset.

Linear Interpolation

Polynomial Interpolation: 

Polynomial Interpolation is the way of fitting the curve by creating a higher degree polynomial to join those points.

Spline Interpolation: 

Spline interpolation similar to the Polynomial interpolation x’ uses low-degree polynomials in each of the intervals and chooses the polynomial pieces such that they fit smoothly together. The resulting function is called a spline.

Cubic Spline Interpolation

Cubic spline interpolation is a way of finding a curve that connects data points with a degree of three or less. Splines are polynomial that are smooth and continuous across a given plot and also continuous first and second derivatives where they join.

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

S(x) =\begin{bmatrix} S_0 (x), x \epsilon [x_0, x_1] \\ S_1 (x), x \epsilon [x_1, x_2] \\ ... \\ ... \\ ... \\ S_{n-1} (x), x \epsilon [x_1, x_2] \end{bmatrix}

Here Si(x) is the cubic polynomial that will be used on the subinterval [xi, xi+1]

The main factor about spline is that it combines different polynomials and not use a single polynomial of degree n to fit all the points at once, it avoids high degree polynomials and thereby the potential problem of overfitting. These low-degree polynomials need to be such that the spline they form is not only continuous but also smooth.

But for the spline to be smooth and continuous, the two consecutive polynomials and Si (x) and Si+1 (x) must join at xi

S_i (x_i) = S_{i+1} (x_i)= f(x_i) = y_i

Or, Si (x) must be passed through two end-points:

S_{i-1} (x_{i-1}) = S_{i} (x_i)= f(x_{i-1}) ; S_i (x_i) = S_{i+1} (x_i)= f(x_i) = y_i

Assume, S” (x) = Mi (i= 0,1,2, …, n). Since S(x) is cubic polynomial, so S” (x) is the linear polynomial in [xi, xi+1], then S”’ (x) will be:

S''' (x) = \frac{M_{i+1} - M_i }{x_{i+1} - x_i} \, \forall x \epsilon [x_i, x_{i+1}]

By applying the Taylor series:

S(x) = S(x_i) + S'(x_i)(x-x_{i}) + \frac{S'' (x)}{2!}(x-x_i)^{2} + \frac{M_{i+1}-M_i}{3! (x_{i+1} - x_i)} (x -x_i)^{3}

Let, x = xi+1:

y_{i+1} = y_i + S'(x_i)(x_{i+1} - x_i) + \frac{M_i}{2!}(x_{i+1} - x_i)^{2} + \frac{M_{i+1} - M_i}{3!} (x_{i+1} - x_i)^{2} \\ \\ \\ S'(x_i) = \frac{y_{i+1} - y_i}{x_{i+1} -x_i} - \frac{1}{6}(M_{i+1} + 2M_i)(x_{i+1}- x_i)        

Similarly, we apply above equation b/w range [xi-1, xi]:

S'(x_i) = \frac{y_{i} - y_{i-1}}{x_{i} -x_{i-1}} - \frac{1}{6}(M_{i} + 2M_{i-1})(x_{i}- x_{i-1})

Let hi =xi – xi-1

\mu_i = \frac{h_i }{h_{i+1} + h_i} \\ \\ \lambda_i = 1-\mu_i =  \frac{h_{i+1} }{h_{i+1} + h_i}

Now, we have n-1 equations, but have n+1 variables i.e M0, M1, M2,…Mn-1, Mn. Therefore, we need to get 2 more equation. For that, we will be using additional boundary conditions.

Let’s consider that we know S’ (x0) = f0‘ and S’ (xn) = fn, especially if S’ (x0) and S’ (xn) both are 0. This is called the clamped boundary condition.

S_{1}'(x_0) = \frac{y_{1} - y_{0}}{h_i} - \frac{1}{6}(M_{1} + 2M_{0})(h_1)

f_{0}^{'} = - M_0 \frac{h}{2} + f[x_0, x_1] - \frac{M_1 - M_0}{6}h_1

2M_0 + M_1 = \frac{6}{h_1} (f[x_0, x_1] - f_{0}')

Similarly, for Mn

2M_{n} + M_{n-1} = \frac{6}{h_n} (f_{n}' -f[x_{n-1}, x_n]  )

or

2M_{n} + M_{n-1} = {6}f[x_0, x_0, x_1] \\ d_n = f[x_{n-1}, x_n, x_n]

Combining the above equation in to the matrix form, we get the following matrix:

\begin{bmatrix} 2&  \lambda_0 &  &  &  &  &  &  &  &  &  &  & \\ \mu_1&  2&  \lambda_1&  &  &  &  &  &  &  &  &  & \\ &  .&  .&  .&  &  &  &  &  &  &  &  & \\ &  &  .&  .&  .&  &  &  &  &  &  &  & \\ &  &  &  .&  .&  .&  &  &  &  &  &  & \\ &  &  &  &  .&  .&  .&  &  &  &  &  & \\ &  &  &  &  &  .&  .&  .&  &  &  &  & \\ &  &  &  &  &  &  .&  .&  .&  &  &  & \\ &  &  &  &  &  &  & & \mu_{n-1}&  2&  \lambda_{n-1}&  &   \\ &  &  &  &  &  &  &  &  &  &  \mu_n&  2& \\ \end{bmatrix} \begin{bmatrix} M_0 \\ M_1\\ .\\ .\\ .\\ .\\ .\\ .\\ M_{n-1}\\ M_n \end{bmatrix} = \begin{bmatrix} d_0 \\ d_1 \\ .\\ .\\ .\\ .\\ .\\ .\\ d_{n-1}\\ d_n \end{bmatrix}

Implementation

  • We will be using the Scipy to perform the linear spline interpolation. We will be using Cubic Spline and interp1d function of scipy to perform interpolation of function f(x) =1/(1+x^2).

Python3




#imports
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import CubicSpline, interp1d
plt.rcParams['figure.figsize'] =(12,8)
  
x = np.arange(-10,10)
y = 1/(1+x**2)
# apply cubic spline interpolation
cs = CubicSpline(x, y)
# Apply Linear interpolation
linear_int = interp1d(x,y)
  
xs = np.arange(-10, 10)
ys = linear_int(xs)
  
# plot linear interpolation
plt.plot(x, y, 'o', label='data')
plt.plot(xs,ys,  label="S", color='green')
plt.legend(loc='upper right', ncol=2)
plt.title('Linear Interpolation')
plt.show()
  
# plot cubic spline interpolation
plt.plot(x, y, 'o', label='data')
plt.plot(xs, 1/(1+(xs**2)), label='true')
plt.plot(xs, cs(xs), label="S")
plt.plot(xs, cs(xs, 1), label="S'")
plt.plot(xs, cs(xs, 2), label="S''")
plt.plot(xs, cs(xs, 3), label="S'''")
plt.ylim(-1.5, 1.5)
plt.legend(loc='upper right', ncol=2)
plt.title('Cubic Spline Interpolation')
plt.show()


Linear Interpolation

Cubic Spline interpolation

References:


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!