R: Monotone (Shape-Preserving) Interpolation

spinterp {pracma} | R Documentation

## Monotone (Shape-Preserving) Interpolation

### Description

Monotone interpolation preserves the monotonicity of the data being interpolated, and when the data points are also monotonic, the slopes of the interpolant should also be monotonic.

### Usage

    spinterp(x, y, xp)

### Arguments

`x, y` | x- and y-coordinates of the points that shall be interpolated.
`xp` | points that should be interpolated.

### Details

This implementation follows a cubic version of the method of Delbourgo and Gregory. It yields ‘shaplier’ curves than the Stineman method.

The calculation of the slopes is according to recommended practice:

- monotonic and convex –> harmonic
- monotonic and nonconvex –> geometric
- nonmonotonic and convex –> arithmetic
- nonmonotonic and nonconvex –> circles (Stineman) [not implemented]

The choice of supplementary coefficients `r[i]` depends on whether the data are montonic or convex or both:

- monotonic, but not convex
- otherwise

and that can be detected from the data. The choice `r[i]=3` for all `i` results in the standard cubic Hermitean rational interpolation.

### Value

The interpolated values at all the points of `xp`.

### Note

At the moment, the data need to be monotonic and the case of convexity is not considered.

### References

Stan Wagon (2010). Mathematica in Action. Third Edition, Springer-Verlag.

### See Also

`stinepack::stinterp`, `demography::cm.interp`

### Examples

    data1 <- list(x = c(1,2,3,5,6,8,9,11,12,14,15),
                  y = c(rep(10,6), 10.5,15,50,60,95))
    data2 <- list(x = c(0,1,4,6.5,9,10),
                  y = c(10,4,2,1,3,10))
    data3 <- list(x = c(7.99,8.09,8.19,8.7,9.2,10,12,15,20),
                  y = c(0,0.000027629,0.00437498,0.169183,0.469428,
                        0.94374,0.998636,0.999919,0.999994))
    data4 <- list(x = c(22,22.5,22.6,22.7,22.8,22.9,
                        23,23.1,23.2,23.3,23.4,23.5,24),
                  y = c(523,543,550,557,565,575,
                        590,620,860,915,944,958,986))
    data5 <- list(x = c(0,1.1,1.31,2.5,3.9,4.4,5.5,6,8,10.1),
                  y = c(10.1,8,4.7,4.0,3.48,3.3,5.8,7,7.7,8.6))

    data6 <- list(x = c(-0.8, -0.75, -0.3, 0.2, 0.5),
                  y = c(-0.9,  0.3,   0.4, 0.5, 0.6))
    data7 <- list(x = c(-1, -0.96, -0.88, -0.62, 0.13, 1),
                  y = c(-1, -0.4,   0.3,   0.78, 0.91, 1))

    data8 <- list(x = c(-1, -2/3, -1/3, 0.0, 1/3, 2/3, 1),
                  y = c(-1, -(2/3)^3, -(1/3)^3, -(1/3)^3, (1/3)^3, (1/3)^3, 1))

    ## Not run:
    opr <- par(mfrow=c(2,2))

    # These are well-known test cases:
    D <- data1
    plot(D, ylim=c(0, 100)); grid()
    xp <- seq(1, 15, len=51); yp <- spinterp(D$x, D$y, xp)
    lines(spline(D), col="blue")
    lines(xp, yp, col="red")

    D <- data3
    plot(D, ylim=c(0, 1.2)); grid()
    xp <- seq(8, 20, len=51); yp <- spinterp(D$x, D$y, xp)
    lines(spline(D), col="blue")
    lines(xp, yp, col="red")

    D <- data4
    plot(D); grid()
    xp <- seq(22, 24, len=51); yp <- spinterp(D$x, D$y, xp)
    lines(spline(D), col="blue")
    lines(xp, yp, col="red")

    # Fix a horizontal slope at the end points
    D <- data8
    x <- c(-1.05, D$x, 1.05); y <- c(-1, D$y, 1)
    plot(D); grid()
    xp <- seq(-1, 1, len=101); yp <- spinterp(x, y, xp)
    lines(spline(D, n=101), col="blue")
    lines(xp, yp, col="red")

    par(opr)
    ## End(Not run)

[Package pracma version 2.0.4 Index]