# fnval

Evaluate function

## Syntax

`v = fnval(f,x) fnval(x,f) fnval(...,'l') `

## Description

`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.

## Examples

### Evaluate Functions at Specified Points

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] ) `

expand all

### Algorithms

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.