Interpolates a given set of points using cubic spline fitting.

You're viewing an older version of this page (#466). View the current version.

View versions (3)

Interface

#include <codecogs/maths/approximation/interpolation/cubic.h>

using namespace Maths::Approximation::Interpolation;

Overview

A cubic spline is a piecewise cubic polynomial such that the function, its derivative and its second derivative are continuous at the interpolation nodes. The natural cubic spline has zero second derivatives at the endpoints. It is the smoothest of all possible interpolating curves in the sense that it minimizes the integral of the square of the second derivative. For more information on this algorithm, please see references.

Blank

An important detail when using this class is that the abscissas array (the x-axis) given as argument to the constructor needs to be sorted in ascending order and its elements need to be equally spaced, meaning that:

X[i] - X[i - 1] = \alpha \in \mathcal{R} \mbox{ a constant } \qquad 1 \leq i \leq N - 1
(1)

where N is the size of the array. In other words, the associated function needs to be discrete.

Below you will find the interpolation graphs for a set of points obtained by evaluating the function f(x) = \sin(2x) / x, displayed in light blue, at particular abscissas. The spline fitting curve, displayed in red, has been calculated using this class. In the first graph there had been chosen a number of 12 points, while in the second 36 points were considered. You may notice the root mean squared error in each of the cases.

1/cubic-378.png

References

  • PlanetMath, http://planetmath.org/encyclopedia/CubicSplinInterpolation.html
  • Jean-Pierre Moreau's Home Page, http://perso.wanadoo.fr/jean-pierre.moreau/
  • Tuan Dang Trong, "Numath Library"
  • Forsythe, G.E. "Computer methods for mathematical computations", PRENTICE-HALL, INC (1977)

Example 1

The following example displays 20 interpolated values (you may change this amount through the N_out variable) for the given function f(x) with abscissas equally spaced in the [ \pi, 3\pi] interval. The X and Y coordinate arrays are initialized by evaluating this function for N = 12 points equally spaced in the domain from \pi to 5 \pi.

#include <codecogs/maths/interpolation/cubic.h>

#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;

#define PI  3.1415
#define N   12

int main() 
{
    // Declare and initialize two arrays to hold the coordinates of the initial data points
    double x[N], y[N];

    // Generate the points
    double xx = PI, step = 4 * PI / (N - 1);
    for (int i = 0; i < N; ++i, xx += step) {
        x[i] = xx;
        y[i] = sin(2 * xx) / xx;
    }

    // Initialize the Cubic spline interpolation routine with known data points
    Maths::Interpolation::Cubic A(N, x, y);

    // Interrogate spline curve to find interpolated values
    int N_out = 20;
    xx = PI, step = (3 * PI) / (N_out - 1);
    for (int i = 0; i < N_out; ++i, xx += step) {
        cout << "x = " << setw(7) << xx << "  y = ";
        cout << setw(13) << A.getValue(xx) << endl;
	}
  return 0;
}

Output:

x =  3.1415  y = -5.89868e-005
x = 3.63753  y =      0.233061
x = 4.13355  y =      0.216427
x = 4.62958  y =     0.0486148
x = 5.12561  y =     -0.133157
x = 5.62163  y =     -0.172031
x = 6.11766  y =    -0.0456079
x = 6.61368  y =     0.0906686
x = 7.10971  y =      0.116462
x = 7.60574  y =     0.0557287
x = 8.10176  y =      -0.03875
x = 8.59779  y =      -0.10346
x = 9.09382  y =    -0.0734111
x = 9.58984  y =     0.0298435
x = 10.0859  y =      0.094886
x = 10.5819  y =     0.0588743
x = 11.0779  y =    -0.0171021
x = 11.5739  y =    -0.0630512
x =   12.07  y =    -0.0601684
x =  12.566  y =   -0.00994154
GPL Licence — free for non commercial use. See Licence details.

Members of Cubic

CLASS METHOD

Cubic

Initializes the necessary data for following evaluations of the spline.

Parameters

y
The y-coordinates for the initial points
x
The x-coordinates for the initial points (evenly spaced!)
n
The number of initial points

CLASS METHOD

Cubic

m_class destructor

CLASS METHOD

getValue

Returns the approximated ordinate at the given abscissa.

Parameters

x
The abscissa of the interpolation point

The value of the x parameter needs to be in the X[1]...X[N - 1] interval (including endpoints).

CLASS METHOD

Cubic_once

This function implements the Cubic class for one off calculations, thereby avoid the need to instantiate the Cubic class yourself.

Example 1

The following graph is constructed from interpolating the following values:

x = 1  y = 0.22
x = 2  y = 0.04
x = 3  y = -0.13
x = 4  y = -0.17
x = 5  y = -0.04
x = 6  y = 0.09
x = 7  y = 0.11

\graph N=7 x="1 2 3 4 5 6 7" y="0.22 0.04 -0.13 -0.17 -0.04 0.09 0.11" a=1:7:100

Parameters

N
The number of initial points
x
The x-coordinates for the initial points (evenly spaced!)
y
The y-coordinates for the initial points
a
The x-coordinate for the output point

Returns

the interpolated y-coordinate that corresponds to a.