Quadratic Interpolation API
Overview
One-shot (construction + evaluation)
| Function | Description |
|---|---|
quadratic_interp(x, y, xq) | Quadratic interpolation at point(s) xq |
quadratic_interp(x, y, xq; bc=...) | With boundary condition |
quadratic_interp!(out, x, y, xq) | In-place quadratic interpolation |
quadratic_interp!(out, x, y, xq; bc) | In-place with BC |
Re-usable interpolant
| Function | Description |
|---|---|
itp = quadratic_interp(x, y) | Create quadratic interpolant |
itp = quadratic_interp(x, y; bc=...) | Create with boundary condition |
itp(xq) | Evaluate at point(s) xq |
itp(out, xq) | Evaluate at xq, store result in out |
Derivatives
| Function | Description |
|---|---|
quadratic_interp(x, y, xq; deriv=1) | First derivative (continuous) |
quadratic_interp(x, y, xq; deriv=2) | Second derivative (piecewise constant) |
quadratic_interp(x, y, xq; deriv=3) | Third derivative (always 0) |
deriv1(itp) | First derivative view |
deriv2(itp) | Second derivative view |
deriv3(itp) | Third derivative view (always 0) |
Functions
FastInterpolations.quadratic_interp — Function
quadratic_interp(x, y, xi; bc=Left(QuadraticFit()), extrap=:none, deriv=0, search=Binary())C1 piecewise quadratic spline interpolation at a single point.
Arguments
x::AbstractVector: x-coordinates (sorted, length ≥ 2)y::AbstractVector: y-values (same length as x)xi::Real: Query pointbc: Boundary condition (one of):Left(QuadraticFit()): 3-point parabola fit at left (default, exact for polynomials)Right(QuadraticFit()): 3-point parabola fit at rightLeft(Deriv1(v)): First derivative = v at left endpointLeft(Deriv2(v)): Second derivative = v at left endpointRight(Deriv1(v)): First derivative = v at right endpointRight(Deriv2(v)): Second derivative = v at right endpointMinCurvFit(): Minimize total curvature (globally smooth)
extrap::Symbol: Extrapolation mode:none(default): throws DomainError if outside domain:constant: clamp to boundary values:extension: extend the boundary polynomial
deriv::Int: Derivative order (0, 1, or 2)search::AbstractSearchPolicy: Search algorithm for interval findingBinary()(default): O(log n) binary search, statelessHintedBinary(): O(1) if hint valid, O(log n) fallbackLinearBinary(linear_window=8): Linear search within window, then binary fallback
Returns
- Interpolated value (Float type)
Example
x = [0.0, 1.0, 2.0, 3.0]
y = x.^2 # [0, 1, 4, 9]
# Default: QuadraticFit (exact for quadratic polynomials)
quadratic_interp(x, y, 1.5) # ≈ 2.25 (exact)
# With specific BC
quadratic_interp(x, y, 1.5; bc=Left(Deriv1(0.0))) # zero slope at left
quadratic_interp(x, y, 1.5; bc=MinCurvFit()) # minimize curvature
# Optimized for sorted queries
sorted_queries = sort(rand(1000))
vals = quadratic_interp(x, y, sorted_queries; search=LinearBinary(linear_window=8))quadratic_interp(x, y, x_targets; bc=Left(QuadraticFit()), extrap=:none, deriv=0, search=Binary())Quadratic spline interpolation for multiple query points (allocating version).
Example
x = [0.0, 1.0, 2.0, 3.0]
y = x.^2
result = quadratic_interp(x, y, [0.5, 1.5, 2.5])
# result ≈ [0.25, 2.25, 6.25]
# Optimized for sorted queries
sorted_queries = sort(rand(1000))
vals = quadratic_interp(x, y, sorted_queries; search=LinearBinary(linear_window=8))quadratic_interp(x, Y::AbstractMatrix; bc=Left(QuadraticFit()), extrap=:none)Create a multi-Y quadratic series interpolant from a matrix where each column is a y-series.
Arguments
x::AbstractVector: x-coordinates (length n)Y::AbstractMatrix: n×m matrix, each column is a y-seriesbc,extrap: Same as vector form
Example
x = collect(range(0.0, 1.0, 101))
Y = hcat(sin.(2π .* x), cos.(2π .* x)) # 101×2 matrix
sitp = quadratic_interp(x, Y)quadratic_interp(grids::NTuple{N,AbstractVector}, data::AbstractArray{<:Any,N}; kwargs...)Create an N-dimensional quadratic interpolant from grid vectors and data array.
Arguments
grids::NTuple{N,AbstractVector}: Tuple of grid vectors for each dimensiondata::AbstractArray{<:Any,N}: Function values at grid points
Keywords
bc=Left(QuadraticFit()): Boundary condition(s). Can be:- Single BC: Applied to all axes
NTuple{N}: Per-axis BCs
extrap=:none: Extrapolation mode(s)search=Binary(): Search policy(s)
Returns
QuadraticInterpolantND{Tg, Tv, N, ...}: Callable interpolant object
Examples
x = range(0.0, 2.0, 20)
y = range(0.0, 1.0, 15)
data = [xi^2 + yi^2 for xi in x, yi in y]
itp = quadratic_interp((x, y), data)
itp((1.0, 0.5)) # Evaluate
itp((1.0, 0.5); deriv=(1, 0)) # ∂f/∂xquadratic_interp(grids, data, query; deriv=0, kwargs...)One-shot ND quadratic interpolation at a single point.
quadratic_interp(grids, data, queries; deriv=0, kwargs...)One-shot ND quadratic interpolation at multiple points (batch).
FastInterpolations.quadratic_interp! — Function
quadratic_interp!(output, x, y, x_targets; bc=Left(QuadraticFit()), extrap=:none, deriv=0, search=Binary())In-place quadratic spline interpolation for multiple query points.
Arguments
output: Pre-allocated output vector- Other arguments same as
quadratic_interp
Example
x = [0.0, 1.0, 2.0, 3.0]
y = x.^2
out = zeros(3)
quadratic_interp!(out, x, y, [0.5, 1.5, 2.5])
# out ≈ [0.25, 2.25, 6.25]
# Optimized for sorted queries
sorted_queries = sort(rand(1000))
output = zeros(1000)
quadratic_interp!(output, x, y, sorted_queries; search=LinearBinary(linear_window=8))Interpolant Type
FastInterpolations.QuadraticInterpolant — Type
QuadraticInterpolant{Tg,Tv,X,Y,P}Lightweight callable interpolant for quadratic spline interpolation. Returned by quadratic_interp(x, y) (2-argument form).
Type Parameters
Tg<:AbstractFloat: Grid type (Float32, Float64) for x-coordinatesTv: Value type for y-values (can be Tg, Complex{Tg}, or other Number)X<:AbstractVector{Tg}: Type of x-coordinatesY<:AbstractVector{Tv}: Type of y-valuesP<:AbstractSearchPolicy: Search policy type
Fields
x::X: x-coordinates (sorted)y::Y: y-valuesh::Vector{Tg}: Grid spacing (precomputed, geometry)a::Vector{Tv}: Quadratic coefficients (value-derived)d::Vector{Tv}: Slope coefficients (value-derived)extrap::ExtrapVal: Extrapolation modesearch_policy::P: Default search policy for interval lookup
Usage
itp = quadratic_interp(x, y; bc=Right(Deriv1(6.0)))
val = itp(0.5) # scalar evaluation
vals = itp.([0.5, 1.5]) # broadcast
vals = itp([0.5, 1.5]) # vector call
# Derivatives
d1 = itp(0.5; deriv=1) # first derivative
d2 = itp(0.5; deriv=2) # second derivative
# Complex values
x = [0.0, 1.0, 2.0, 3.0]
y = [1.0+2.0im, 3.0+4.0im, 5.0+6.0im, 7.0+8.0im]
itp = quadratic_interp(x, y)
val = itp(0.5) # returns ComplexF64
# Custom search policy
itp = quadratic_interp(x, y; search=LinearBinary())
val = itp(0.5) # uses LinearBinary() by default
val = itp(0.5; search=Binary()) # override with Binary()FastInterpolations.QuadraticInterpolantND — Type
QuadraticInterpolantND{Tg, Tv, N, NP1, G, S, B, E, P}Generic N-dimensional quadratic interpolant with precomputed partial derivatives.
Stores function values AND all partial derivatives at grid nodes, enabling ultra-fast O(1) evaluation via tensor-product quadratic polynomials.
Type Parameters
Tg: Grid/coordinate type (Float32 or Float64)Tv: Value type (can be Tg, Complex{Tg}, or other Number)N: Number of dimensionsNP1: N + 1 (partials array dimensionality)G: Tuple type for gridsS: Tuple type for spacingsB: Tuple type for boundary conditionsE: Tuple type for extrapolation modesP: Tuple type for search policies
Fields
grids: N-tuple of grid vectors for each dimensionspacings: N-tuple of grid spacing info (for O(1) h lookup)nodal_derivs: NodalDerivativesND containing partial derivatives at grid nodesbcs: N-tuple of boundary conditions used for constructionextraps: N-tuple of extrapolation modessearches: N-tuple of search policies
Performance
- Construction: O(2^N x n^N) - computes all partial derivatives via recurrence
- Query: O(1) - tensor-product quadratic polynomial evaluation
- Memory: 2^N x n^N values
Thread-Safety
Immutable after construction; safe for concurrent read access.
Example
x = range(0.0, 2.0, 20)
y = range(0.0, 1.0, 15)
data = [xi^2 + yi^2 for xi in x, yi in y]
itp = quadratic_interp((x, y), data)
itp((1.0, 0.5)) # Evaluate at (1.0, 0.5)
itp((1.0, 0.5); deriv=(1, 0)) # dfdxBoundary Condition Types
FastInterpolations.MinCurvFit — Type
MinCurvFit <: AbstractBCMinimum curvature boundary condition for quadratic splines. Minimizes total curvature (∫S''² dx) by optimizing the initial slope d[1].
This is a singleton type (structure-only). The optimization is performed during interpolant construction based on the actual data values.
Mathematical Background
For quadratic splines, the slope d[i] depends on d[1] via recurrence:
- d[i] = α[i] * d[1] + β[i] where α[i] = (-1)^(i+1)
The optimal d[1] minimizes:
- ∫(S'')² dx = Σ 4a[i]²h[i] = Σ (s[i] - d[i])²/h[i]
Closed-form solution:
- d[1] = [Σ α[i]*(s[i] - β[i])/h[i]] / [Σ 1/h[i]]
Example
x = [0.0, 0.3, 0.8, 1.5, 2.5, 3.0, 4.0]
y = [0.0, 0.8, 1.2, 0.9, 0.3, 0.6, 1.0]
# Default BC uses QuadraticFit
itp_default = quadratic_interp(x, y)
# MinCurvFit gives globally smooth result via curvature minimization
itp_smooth = quadratic_interp(x, y; bc=MinCurvFit())Derivative Views
See Derivatives for deriv1, deriv2, deriv3 API reference.