## Documentation Center |

Cubic spline interpolation

`pp=csapi(x,y) values = csapi(x,y,xx) `

`pp=csapi(x,y) ` returns the
ppform of a cubic spline *s* with knot sequence `x` that
takes the value `y(:,j)` at `x(j)` for `j=1:length(x)`.
The values `y(:,j) `can be scalars, vectors, matrices,
even ND-arrays. Data points with the same data site are averaged and
then sorted by their sites. With `x` the resulting
sorted data sites, the spline `s` satisfies the not-a-knot
end conditions, namely `jump`_{x(2)}*D*^{3}*s* =
0 = `jump`_{x(end–1)}*D*^{3}*s* (with *D*^{3}*s* the
third derivative of *s*).

If` x` is a cell array, containing sequences `x1`,
..., `xm`, of lengths `n1`, ..., `nm` respectively,
then `y` is expected to be an array, of size `[n1,...,nm]` (or
of size `[d,n1,...,nm]` if the interpolant is to
be `d`-valued). In that case, `pp` is
the ppform of an `m`-cubic spline interpolant *s* to
such data. In particular, now *s*(*x*l(*i*_{1}),
..., *x*m(*i*_{m}))
equals *y*(:,*i*_{1},
..., *i*_{m}) for *i*_{1} =
1:nl, ..., *i*_{m} = 1:nm.

You can use the structure pp, in `fnval`, `fnder`, `fnplt`,
etc, to evaluate, differentiate, plot, etc, this interpolating cubic
spline.

`values = csapi(x,y,xx) `
is the same as `fnval(csapi(x,y),xx)`, i.e., the
values of the interpolating cubic spline at the sites specified by `xx` are
returned.

This command is essentially the MATLAB^{®} function `spline``,` which, in
turn, is a stripped-down version of the Fortran routine `CUBSPL` in *PGS*, except that `csapi` (and
now also `spline`) accepts vector-valued data and
can handle gridded data.

See the example "Spline Interpolation" for various examples.

Up to rounding errors, and assuming that `x` is
a vector with at least four entries, the statement `pp = csapi(x,y)` should
put the same spline into `pp` as does the statement

pp = fn2fm(spapi(augknt(x([1 3:(end-2) end]),4),x,y),'pp');

except that the description of the spline obtained this second
way will use no break at `x(2)` and `x(n-1)`.

Here is a simple bivariate example, a bicubic spline interpolant to the Mexican Hat function being plotted:

x =.0001+[-4:.2:4]; y = -3:.2:3; [yy,xx] = meshgrid(y,x); r = pi*sqrt(xx.^2+yy.^2); z = sin(r)./r; bcs = csapi( {x,y}, z ); fnplt( bcs ), axis([-5 5 -5 5 -.5 1])

Note the reversal of `x `and `y` in
the call to `meshgrid`, needed because MATLAB likes to
think of the entry `z(i,j)` as the value at (`x(j)`,`y(i)`)
while this toolbox follows the Approximation Theory standard of thinking
of `z(i,j)` as the value at (`x(i)`,`y(j)`).
Similar caution has to be exerted when values of such a bivariate
spline are to be plotted with the aid of the MATLAB `mesh` function,
as is shown here (note the use of the transpose of the matrix of values
obtained from `fnval`).

xf = linspace(x(1),x(end),41); yf = linspace(y(1),y(end),41); mesh(xf, yf, fnval( bcs, {xf, yf}).')

Was this topic helpful?