Yorick: Interpolating

Home Manual Packages Global Index Keywords Quick Reference |
## 2.2 Interpolating As I have said, a Yorick array often represents the values of a continuous function at a number of discrete points. In order to find the values of the function at other points, you need to know how it varies between (or beyond) the given points. In general, to interpolate (or extrapolate), you need a detailed understanding of how the function was discretized in the first place. However, when the list of values accurately represents the function, linear interpolation between the known points will suffice. A function which is linear between successive points is called "piecewise linear". The `interp` function is a mechanism for converting a list of function values at discrete points into a piecewise linear function which can be evaluated at any point.
    theta = span(0, pi, 100);
    x_circle = cos(theta);
    y_circle = sin(theta);
    x = span(-2, 2, 64);
    y = interp(y_circle, x_circle, x);
This code fragment produces a `y` array with the same number of points as `x` (64), with the values of the piecewise linear function defined by the points `(x_circle, y_circle)`. Outside the range covered by `x_circle`, the piecewise linear function remains constant -- the simplest possible extrapolation rule. Regarded as a function of its third argument, `interp` behaves just like the `sin` or `cos` function -- its first two arguments are really parameters specifying which piecewise linear function `interp` will evaluate. The `integ` function works just like `interp`, except that it returns the integral of the piecewise linear function. The integration constant is chosen so that `integ` returns zero at the first point of the piecewise linear function. (This point will actually have the maximum value of x if the x array is decreasing.) Thus, the integral of the piecewise linear approximation to the semicircle and the exact integral of the semicircle can be computed by:
    yi = integ(y_circle, x_circle, x);
    yi_exact = 0.5*(acos(max(min(x,1),-1)) - x*sqrt(1-min(x^2,1)));
Again, the piecewise linear function is assumed to remain constant beyond the first and last points specified. Hence, `integ` is a linear function when extrapolating, and piecewise parabolic when interpolating. Use `integ` only when you need the indefinite integral of a piecewise linear function. Yorick has more efficient ways to compute definite integrals. Again, think of `integ`, like `interp`, as a continuous function of its third argument; the first two arguments are parameters specifying which function. Neither `interp` nor `integ` makes sense unless its second argument is either increasing or decreasing. There is no way to decide which branch of a multi-valued function should be returned. Internally, both `interp` and `integ` need a lookup function -- that is, a function which finds the index of the point in x_circle just beyond each of the x values. This lookup function can also be called directly; its name is `digitize`.