# Prepare list of objects for shape preserving interpolation.

### Description

This is primitive function which output is used by `sps_eval`

. Function works with both uni- and bi-variate functions and returns list consisting original data provided, values of the derivatives and degrees of polynomial needed to satisfy the shape constraints required

### Usage

1 2 3 4 5 6 |

### Arguments

`x` |
Vector of x-coordinates of points to be interpolated. |

`y` |
Vector of y-coordinates of points to be interpolated. For uni-variate case length should be equal to length of |

`z` |
Bi-variate case only. Matrix of values of function on grid spanned by x and y; |

`fx` |
Matrix of values of the derivative with respect to x of the function; |

`fy` |
Bi-variate case only. Matrix of values of the derivative with respect to y of the function; |

`fxy` |
Bi-variate case only. Matrix of values of mixed partial derivative of the function; |

`shape` |
Specifies which attributes should be preserved. Vector should contain 'monotonicity' and/or 'curvature' only. In bi-variate case this can be set separately for both dimensions using |

`shape.x` |
Specifies which attributes should be preserved for x dimension. |

`shape.y` |
Specifies which attributes should be preserved for y dimension. |

`max.deg` |
Specifies maximum degree of polynomial allowed. In some cases in order to preserve shape, very high degrees are necessary. If maximum degree is reached, it is not guaranteed that resulting spline will preserve all the attributes required. |

`smoothness` |
How many times does the spline needs to be differentiable. |

`tol` |
Tolerance used within program. Default value is suitable for graphical purposes. |

### Details

If `z`

is not provided function will prepare list needed for uni-variate interpolation. If values of the derivatives are provided, resulting spline will preserve them. For bi-variate case it is possible to set some derivatives and let program estimate the rest.

### Value

Uni-variate: list with 6 components:

`x,y` |
Coordinates of the data points |

`k` |
Smoothness (or continuity class) required |

`fx` |
Estimated or given values of derivative |

`deg` |
Degree of polynomial needed on each of the line segments |

`dim` |
Number of variables; numeric equal to 1 |

Bi-variate: list with 10 components:

`x,y` |
Coordinates of the data points |

`z` |
Matrix of vales of the function |

`k` |
Smoothness (or continuity class) required |

`fx, fy, fxy` |
Estimated or given values of respective derivatives |

`deg.x, deg.y` |
Degree of polynomial needed on each of the line segments in each dimension |

`dim` |
Number of variables; numeric equal to 2 |

### Author(s)

Szymon Sacher <s1340144@sms.ed.ac.uk> & Andrew Clausen <andrew.clausen@ed.ac.uk>

Excerpts adapted from Fortran code Copyright (C) Paolo Costantini

### References

Costantini, P; Fontanella, F; 'Shape Preserving Bi-variate Interpolation' SIAM J NUMER. ANAL. Vol. 27, No.2, pp. 488-506, April 1990

### See Also

`sps_eval`

`sps_fun`

### Examples

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ```
## Univariate example
x <- c( 1, 2, 3, 4, 5, 6)
y <- c(16 ,18, 21, 17, 15, 12)
spline <- sps_prep(x, y, shape = 'monotonicity', smoothness = 2)
plot(seq(1, 6, 0.1), sps_eval(spline, seq(1, 6, 0.1)))
## Bivariate example
tower <- function(x, y)
{
X <- abs(x)
Y <- abs(y)
ifelse((X + Y) <= 1, floor(3*(1 - X - Y)),
ifelse(pmax(X, Y) >= 1, pmax(X, Y)/2 - 0.5,
0))
}
X <- Y <- seq(-1.25, 1.25, 2.5/13)
grid <- mesh(X, Y)
Z <- tower(grid$x, grid$y)
spline <- sps_prep(X, Y, Z)
X_ <- Y_ <- seq(-1.25, 1.25, 2.5/60)
persp3D(X_, Y_, sps_eval(spline, x = X_, y = Y_, grid = TRUE))
``` |