Cubic spline data interpolation
s = spline(x,y,xq)
pp = spline(x,y)
spline to interpolate a sine curve over unevenly-spaced sample points.
x = [0 1 2.5 3.6 5 7 8.1 10]; y = sin(x); xx = 0:.25:10; yy = spline(x,y,xx); plot(x,y,'o',xx,yy)
Use clamped or complete spline interpolation when endpoint slopes are known. This example enforces zero slopes at the end points of the interpolation.
x = -4:4; y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0]; cs = spline(x,[0 y 0]); xx = linspace(-4,4,101); plot(x,y,'o',xx,ppval(cs,xx),'-');
Extrapolate a data set to predict population growth.
Create two vectors to represent the census years from 1900 to 1990 (
t) and the corresponding United States population in millions of people (
t = 1900:10:1990; p = [ 75.995 91.972 105.711 123.203 131.669 ... 150.697 179.323 203.212 226.505 249.633 ];
Extrapolate and predict the population in the year 2000 using a cubic spline.
ans = 270.6060
Generate the plot of a circle, with the five data points
y(:,2),...,y(:,6) marked with o's. The matrix
y contains two more columns than does
y(:,end) as the endslopes. The circle starts and ends at the point (1,0), so that point is plotted twice.
x = pi*[0:.5:2]; y = [0 1 0 -1 0 1 0; 1 0 1 0 -1 0 1]; pp = spline(x,y); yy = ppval(pp, linspace(0,2*pi,101)); plot(yy(1,:),yy(2,:),'-b',y(1,2:5),y(2,2:5),'or') axis equal
Use spline to sample a function over a finer mesh.
Generate sine and cosine curves for a few values between 0 and 1. Use spline interpolation to sample the functions over a finer mesh.
x = 0:.25:1; Y = [sin(x); cos(x)]; xx = 0:.1:1; YY = spline(x,Y,xx); plot(x,Y(1,:),'o',xx,YY(1,:),'-') hold on plot(x,Y(2,:),'o',xx,YY(2,:),':') hold off
Compare the interpolation results produced by
pchip for two different functions.
Create vectors of
x values, function values at those points
y, and query points
xq. Compute interpolations at the query points using both
pchip. Plot the interpolated function values at the query points for comparison.
x = -3:3; y = [-1 -1 -1 0 1 1 1]; xq1 = -3:.01:3; p = pchip(x,y,xq1); s = spline(x,y,xq1); plot(x,y,'o',xq1,p,'-',xq1,s,'-.') legend('Sample Points','pchip','spline','Location','SouthEast')
In this case,
pchip is favorable since it does not oscillate as freely between the sample points.
Perform a second comparison using an oscillatory sample function.
x = 0:25; y = besselj(1,x); xq2 = 0:0.01:25; p = pchip(x,y,xq2); s = spline(x,y,xq2); plot(x,y,'o',xq2,p,'-',xq2,s,'-.') legend('Sample Points','pchip','spline')
When the underlying function is oscillatory,
spline captures the movement between points better than
x-coordinates, specified as a vector. The
x specifies the points at which the data
given. The elements of
x must be unique.
y— Function values at x-coordinates
Function values at x-coordinates, specified as a numeric vector, matrix, or
y typically have the same
y also can have exactly two more elements
x to specify endslopes.
y is a matrix or array, then the values in the last dimension,
y(:,...,:,j), are taken as the values to match with
x. In that case, the last dimension of
y must be the same length as
have exactly two more elements.
The endslopes of the cubic spline follow these rules:
vectors of the same size, then the not-a-knot end conditions are used.
a scalar, then it is expanded to have the same length as the other
and the not-a-knot end conditions are used.
y is a vector that contains two more values than
has entries, then
spline uses the first and
last values in
y as the endslopes for the cubic
spline. For example, if
y is a vector, then:
y(2:end-1) gives the function
values at each point in
y(1) gives the slope at the
beginning of the interval located at
y(end) gives the slope at the end
of the interval located at
y is a matrix or an
size(y,N) equal to
y(:,...,:,j+1) gives the function values at each point in
y(:,:,...:,1) gives the slopes at the beginning of the intervals located
y(:,:,...:,end) gives the slopes at the end of the intervals located at
xq— Query points
Query points, specified as a vector. The points specified in
the x-coordinates for the interpolated function
s— Interpolated values at query points
Interpolated values at query points, returned as a vector, matrix, or array.
The size of
s is related to the sizes of
y is a vector, then
s has the same size as
y is an array of size
Ny = size(y), then these
xq is a scalar or vector, then
xq is an array, then
pp— Piecewise polynomial
Piecewise polynomial, returned as a structure. Use this structure
ppval function to
evaluate the piecewise polynomial at one or more query points. The
structure has these fields.
Vector of length
Number of pieces,
Order of the polynomials
Dimensionality of target
Since the polynomial coefficients in
local coefficients for each interval, you must subtract the lower
endpoint of the corresponding knot interval to use the coefficients
in a conventional polynomial equation. In other words, for the coefficients
[x1,x2], the corresponding polynomial
You also can perform spline interpolation using the
interp1 function with the command
spline performs interpolation on rows of
an input matrix,
interp1 performs interpolation
on columns of an input matrix.
A tridiagonal linear system (possibly with several right-hand
sides) is solved for the information needed to describe the coefficients
of the various cubic polynomials that make up the interpolating spline.
unmkpp. These routines form a small suite
of functions for working with piecewise polynomials. For access to
more advanced features, see
the Curve Fitting
Toolbox™ spline functions.
 de Boor, Carl. A Practical Guide to Splines. Springer-Verlag, New York: 1978.
Usage notes and limitations:
x must be strictly increasing.
Code generation does not remove
Code generation does not report an error for infinite
If you generate code for the
pp = spline(x,y) syntax,
then you cannot input
pp to the
in MATLAB®. To create a MATLAB
pp structure created by the code generator:
In code generation, use
return the piecewise polynomial details to MATLAB.
In MATLAB, use
mkpp to create
If you supply
xq, and if
y has a
variable-size and is not a variable-length vector, then the orientation
of vector outputs in the generated code might not match the orientation