Cubic
Interface
Class Cubic
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.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. For an optimal fit, the elements should also be equally spaced, though this is by no mean essential.
Below you will find the interpolation graphs for a set of points obtained by evaluating the function , 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.
MISSING IMAGE!
1/cubic-378.png cannot be found in /users/1/cubic-378.png. Please contact the submission author.
References:
- PlanetMath, http://planetmath.org/encyclopedia/CubicSplinInterpolation.html
- 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 with abscissas equally spaced in the
interval. The X and Y coordinate arrays are initialized by evaluating
this function for N = 12 points equally spaced in the domain from to .
#include <codecogs/maths/approximation/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
See Also
Also consider the regression methods: Regression/Discrete, Regression/Forsythe, Regression/Orthogonal, Regression/StiefelAuthors
- Lucian Bentea (August 2005)
Source Code
Source code is available when you agree to a GP Licence or buy a Commercial Licence.
Not a member, then Register with CodeCogs. Already a Member, then Login.
Members of Cubic
Cubic
Initializes the necessary data for following evaluations of the spline.Cubic( int n double* x double* y )[constructor] n The number of initial points x The x-coordinates for the initial points y The y-coordinates for the initial points
GetValue
Returns the approximated ordinate at the given abscissa.doublegetValue( double x ) Note
- The value of the x parameter needs to be in the X[1]...X[N - 1] interval (including endpoints).
x The abscissa of the interpolation point
Cubic Once
doubleCubic_once( | int | N | |
double* | x | ||
double* | y | ||
double | a | ) |
Example 2
- 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
There is an error with your graph parameters for Cubic_once with options 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 .inputError Message:Function Cubic_once failed. Ensure that: Invalid C++
Parameters
N The number of initial points x The x-coordinates for the initial points 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.
Source Code
Source code is available when you agree to a GP Licence or buy a Commercial Licence.
Not a member, then Register with CodeCogs. Already a Member, then Login.