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=DerivOp(1)) | First derivative (continuous) |
quadratic_interp(x, y, xq; deriv=DerivOp(2)) | Second derivative (piecewise constant) |
quadratic_interp(x, y, xq; deriv=DerivOp(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=NoExtrap(), deriv=EvalValue(), search=AutoSearch())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::AbstractExtrap: Extrapolation modeNoExtrap()(default): throws DomainError if outside domainConstExtrap(): clamp to boundary valuesExtendExtrap(): extend the boundary polynomial
deriv::DerivOp: Derivative order – useEvalValue()(default),DerivOp(1), orDerivOp(2)search::AbstractSearchPolicy: Search algorithm for interval findingBinarySearch()(default): O(log n) binary search, statelessLinearBinarySearch(linear_window=0): O(1) if hint valid, O(log n) fallbackLinearBinarySearch(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=LinearBinarySearch(linear_window=8))quadratic_interp(x, y, x_targets; bc=Left(QuadraticFit()), extrap=NoExtrap(), deriv=EvalValue(), search=AutoSearch())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=LinearBinarySearch(linear_window=8))quadratic_interp(x, Y::AbstractMatrix; bc=Left(QuadraticFit()), extrap=NoExtrap())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=NoExtrap(): Extrapolation mode(s)search=AutoSearch(): 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=EvalValue(), kwargs...)One-shot ND quadratic interpolation at a single point. Zero-allocation after warmup.
quadratic_interp(grids, data, queries::NTuple{N,AbstractVector}; deriv=EvalValue(), kwargs...)One-shot ND quadratic interpolation at multiple points (batch SoA). Only allocates the output vector.
quadratic_interp(grids, data, queries::AbstractVector{<:NTuple}; deriv=EvalValue(), kwargs...)One-shot ND quadratic interpolation at multiple points (batch AoS). Only allocates the output vector.
FastInterpolations.quadratic_interp! — Function
quadratic_interp!(output, x, y, x_targets; bc=Left(QuadraticFit()), extrap=NoExtrap(), deriv=EvalValue(), search=AutoSearch())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=LinearBinarySearch(linear_window=8))quadratic_interp!(output, grids, data, queries::NTuple{N,AbstractVector}; deriv=EvalValue(), kwargs...)In-place one-shot ND quadratic interpolation at multiple points (SoA batch). Writes results into pre-allocated output vector.
quadratic_interp!(output, grids, data, queries::AbstractVector{<:NTuple}; deriv=EvalValue(), kwargs...)In-place one-shot ND quadratic interpolation at multiple points (AoS batch). Writes results into pre-allocated output vector.
Interpolant Type
FastInterpolations.QuadraticInterpolant — Type
QuadraticInterpolant{Tg,Tv,X,Y,E,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-valuesE<:AbstractExtrap: Extrapolation mode type (compile-time specialized)P<: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::E: Extrapolation mode (NoExtrap(), ExtendExtrap(), ConstExtrap(), or WrapExtrap())search_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=DerivOp(1)) # first derivative
d2 = itp(0.5; deriv=DerivOp(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
# Search policy: AutoSearch adapts to query type (scalar→BinarySearch, vector→LinearBinarySearch)
itp = quadratic_interp(x, y)
val = itp(0.5) # AutoSearch resolves to BinarySearch() for scalar
itp = quadratic_interp(x, y; search=LinearBinarySearch()) # explicit override
val = itp(0.5; search=BinarySearch()) # per-call overrideFastInterpolations.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.