PCHIP (Piecewise Cubic Hermite Interpolating Polynomial) spline interpolation of arbitrarily spaced one-dimensional data in Julia. This package is a fork of SimplePCHIP with some extra features.
PCHIP interpolation preserves monotonicity (i.e., it will not over- or undershoot monotonic data points). See this SciPy documentation page for more details.
using PCHIPInterpolation
You will be prompted to install the package if you do not already have it.
xs = [0.0, 1.2, 2.0, 5.0, 10.0, 11.0]
ys = [2.0, 2.1, 1.0, 0.0, 0.0, 3.0]
itp = Interpolator(xs, ys)
The xs
and ys
inputs to the Interpolator
can be of any subtype of AbstractVector
, including the default Julia Vector
(as in the example), custom vector types from other packages, and ranges (e.g., 1:2:5
).
y = itp(1.5) # At a single point
ys = itp.(xs) # At multiple points
Plot (with Plots)
using Plots
plot(itp, markers=true, label="PCHIP")
The monotonicity-preserving property of PCHIP interpolation can be clearly seen in the plot.
We can also using the cubic polynomial at the first and last intervals to extrapolate values outside the domain of itp.xs
by setting itp.extrapolate = true
(default is false) in the constructor:
itp = Interpolator(xs, ys; extrapolate = true)
If extrapolate = true
then plotting the iterpolator will also show extrapolated values, extending the plotted domain by ± maximum(diff(itp.xs)) * 0.5
:
plot(itp,markers=true, label="PCHIP w/ extrapolation")
integral = integrate(itp, 1, 3) # Integral between 1 and 3
Compute a derivative (with ForwardDiff)
using ForwardDiff
dydx = ForwardDiff.derivative(itp, 1.5)
A different Interpolator
constructor also exists that takes the derivative values at the interpolation points as a third argument. This method will create a generic cubic Hermite spline, which will not preserve monotonicity in general.