Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2023.0.0 - English


cubic spline evaluation function


[yp, yp1, yp2, yp3] = interp(xp, x, y, d)
[yp, yp1, yp2, yp3] = interp(xp, x, y, d, out_mode)



real vectors of same size n: Coordinates of data points on which the interpolation and the related cubic spline (called s(X) in the following) or sub-spline function is based and built.


real vector of size(x): The derivative s'(x). Most often, s'(x) will be priorly estimated through the function splin(x, y,..)


(optional) string defining s(X) for X outside [x1, xn]. Possible values: "by_zero" | "by_nan" | "C0" | "natural" | "linear" | "periodic"


real vector or matrix: abscissae at which Y is unknown and must be estimated with s(xp)


vector or matrix of size(xp): yp(i) = s(xp(i)) or yp(i,j) = s(xp(i,j))

yp1, yp2, yp3

vectors (or matrices) of size(x): elementwise evaluation of the derivatives s'(xp), s''(xp) and s'''(xp).


The cubic spline function s(X) interpolating the (x,y) set of given points is a continuous and derivable piece-wise function defined over [x1, xn]. It consists of a set of cubic polynomials, each one pk(X) being defined on [xk, xk+1] and connected in values and slopes to both its neighbours. Thus, we can state that for each X ∈ [xk, xk+1], s(X) = pk(X), such that s(xi) = yi,  and   s'(xi) = di. Then, interp() evaluates s(X) (and s'(X), s''(X), s'''(X) if needed) at xp(i), such that

ypi = s(xpi)    or    ypij = s(xpij)
yp1i = s'(xpi)    or    yp1ij = s'(xpij)
yp2i = s''(xpi)    or    yp2ij = s''(xpij)
yp3i = s'''(xpi)    or    yp3ij = s'''(xpij)

The out_mode parameter set the evaluation rule for extrapolation, i.e. for xp(i) outside [x1, xn] :


an extrapolation by zero is done


extrapolation by Nan (%nan)


the extrapolation is defined as follows :

xpi < x1  ⇒  ypi = y1
xpi > xn  ⇒  ypi = yn


the extrapolation is defined as follows (pi(x) being the polynomial defining s(X) on [xi, xi+1]):

xpi < x1  ⇒  ypi = p1(xpi)
xpi > xn  ⇒  ypi = pn-1(xpi)

the extrapolation is defined as follows :

xpi < x1  ⇒  ypi = y1 + d1.(xpi - x1)
xpi > xn  ⇒  ypi = yn + dn.(xpi - xn)

s(X) is extended by periodicity:

ypi = s( x1 + (xpi - x1) modulo  (xn-x1) )


// see the examples of splin and lsq_splin

// an example showing C2 and C1 continuity of spline and subspline
a = -8; b = 8;
x = linspace(a,b,20)';
y = sinc(x);
dk = splin(x,y);  // not_a_knot
df = splin(x,y, "fast");
xx = linspace(a,b,800)';
[yyk, yy1k, yy2k] = interp(xx, x, y, dk);
[yyf, yy1f, yy2f] = interp(xx, x, y, df);
plot2d(xx, [yyk yyf])
plot2d(x, y, style=-9)
legends(["not_a_knot spline","fast sub-spline","interpolation points"],...
        [1 2 -9], "ur",%f)
xtitle("spline interpolation")
plot2d(xx, [yy1k yy1f])
legends(["not_a_knot spline","fast sub-spline"], [1 2], "ur",%f)
xtitle("spline interpolation (derivatives)")
plot2d(xx, [yy2k yy2f])
legends(["not_a_knot spline","fast sub-spline"], [1 2], "lr",%f)
xtitle("spline interpolation (second derivatives)")
// here is an example showing the different extrapolation possibilities
x = linspace(0,1,11)';
y = cosh(x-0.5);
d = splin(x,y);
xx = linspace(-0.5,1.5,401)';
yy0 = interp(xx,x,y,d,"C0");
yy1 = interp(xx,x,y,d,"linear");
yy2 = interp(xx,x,y,d,"natural");
yy3 = interp(xx,x,y,d,"periodic");
plot2d(xx,[yy0 yy1 yy2 yy3],style=2:5,frameflag=2,leg="C0@linear@natural@periodic")
xtitle(" different way to evaluate a spline outside its domain")

See also

  • splin — cubic spline interpolation
  • lsq_splin — weighted least squares cubic spline fitting
Report an issue
<< eval_cshep2d Interpolation interp1 >>

Copyright (c) 2022-2023 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon Mar 27 11:52:43 GMT 2023