Evaluate spline function

`v = fnval(f,x) `

fnval(x,f)

fnval(...,'l')

`v = fnval(f,x) `

and ```
v
= fnval(x,f)
```

both provide the value *f*(*x*)
at the points in `x`

of the spline function *f* whose
description is contained in `f`

.

Roughly speaking, the output `v`

is obtained
by replacing each entry of `x`

by the value of *f* at
that entry. This is literally true in case the function in `f`

is
scalar-valued and univariate, and is the intent in all other cases,
except that, for a `d`

-valued `m`

-variate
function, this means replacing `m`

-vectors by `d`

-vectors.
The full details are as follows.

For a univariate *f* :

If

*f*is scalar-valued, then v is of the same size as`x`

.If

*f*is`[d1,...,dr]`

-valued, and`x`

has size`[n1,...,ns]`

, then`v`

has size`[d1,...,dr, n1,...,ns]`

, with`v(:,...,:, j1,...,js)`

the value of*f*at`x(j1,...,js)`

, – except that(1)

`n1`

is ignored if it is`1`

and`s`

is`2`

, i.e., if`x`

is a row vector; and(2) MATLAB

^{®}ignores any trailing singleton dimensions of`x`

.

For an `m`

-variate *f* with `m>1`

,
with *f* `[d1,...,dr]`

-valued, `x`

may
be either an array, or else a cell array `{x1,...,xm}`

.

If

`x`

is an array, of size`[n1,...,ns]`

say, then`n1`

must equal`m`

, and`v`

has size`[d1,...,dr, n2,...,ns]`

, with`v(:,...,:, j2,...,js)`

the value of*f*at`x(:,j2,...,js)`

, – except that(1)

`d1`

, ...,`dr`

is ignored in case*f*is scalar-valued, i.e., both`r`

and`n1`

are`1`

;(2) MATLAB ignores any trailing singleton dimensions of

`x`

.If

`x`

is a cell array, then it must be of the form`{x1,...,xm}`

, with`xj`

a vector, of length`nj`

, and, in that case,`v`

has size`[d1,...,dr, n1,...,nm]`

, with`v(:,...,:, j1,...,jm)`

the value of*f*at (`x1`

(`j1`

), ...,`xm`

(`jm`

)), – except that`d1`

, ...,`dr`

is ignored in case*f*is scalar-valued, i.e., both`r`

and`n1`

are`1`

.

If *f* has a jump discontinuity at `x`

,
then the value *f*(*x* +), i.e.,
the limit from the right, is returned, except when `x`

equals
the right end of the basic interval of the form; for such `x`

,
the value *f*(*x*–), i.e.,
the limit from the left, is returned.

`fnval(x,f) `

is the same
as `fnval(f,x)`

.

`fnval(...,'l') `

treats *f* as
continuous from the left. This means that if *f* has
a jump discontinuity at `x`

, then the value *f*(*x*–),
i.e., the limit from the left, is returned, except when `x`

equals
the left end of the basic interval; for such `x`

,
the value *f*(*x* +) is returned.

If the function is *multivariate*,
then the above statements concerning continuity from the left and
right apply coordinatewise.

Interpolate some data and plot and evaluate the resulting functions.

Define some data.

x = [0.074 0.31 0.38 0.53 0.57 0.58 0.59 0.61 0.61 0.65 0.71 0.81 0.97]; y = [0.91 0.96 0.77 0.5 0.5 0.51 0.51 0.53 0.53 0.57 0.62 0.61 0.31];

Interpolate the data and plot the resulting function, `f`

.

f = csapi( x, y ) fnplt( f )

Find the value of the function `f`

at ```
x
= 0.5
```

.

fnval( f, 0.5 )

Find the value of the function `f`

at ```
0,
0.1, ..., 1
```

.

fnval( f, 0:0.1:1 )

Create a function `f2`

that represents
a surface.

x = 0.0001+(-4:0.2:4); y = -3:0.2:3; [yy, xx] = meshgrid( y, x ); r = pi*sqrt( xx.^2+yy.^2 ); z = sin( r )./r; f2 = csapi( {x,y}, z );

Plot the function `f2`

.

fnplt( f2 ) axis( [-5, 5, -5, 5, -0.5, 1] );

Find the value of the function `f2`

at ```
x
= -2
```

and `y = 3`

.

fnval( f2, [-2; 3] )

For each entry of `x`

, the relevant break-
or knot-interval is determined and the relevant information assembled.
Depending on whether `f`

is in ppform or in B-form, nested multiplication
or the B-spline recurrence
(see, e.g., [*PGS*; X.(3)]) is
then used vector-fashion for the simultaneous evaluation at all entries
of `x`

. Evaluation of a multivariate polynomial spline
function takes full advantage of the tensor product structure.

Evaluation of a rational spline follows up evaluation of the corresponding vector-valued spline by division of all but its last component by its last component.

Evaluation of a function in stform makes essential use of `stcol`

, and tries to keep the matrices
involved to reasonable size.