Inverting integrals
Solving implicit integral problems of the following form is supported:
\[\begin{equation} \text{find $t$ such that } \int_{t_1}^t f(\tau)\text{d}\tau = V \ge 0, \end{equation}\]
where $t_1$ is given by first(A.t). This is supported for interpolations $f$ that are strictly positive and of one of these types:
ConstantInterpolationLinearInterpolation
This is achieved by creating an 'integral inverse' interpolation object which can efficiently compute $t$ for a given value of $V$, see the example below.
using DataInterpolations
using Plots
# Create LinearInterpolation object from the
u = sqrt.(1:25) + (2.0 * rand(25) .- 1.0) / 3
t = cumsum(rand(25))
A = LinearInterpolation(u, t)
# Create LinearInterpolationIntInv object
# from the LinearInterpolation object
A_intinv = DataInterpolations.invert_integral(A)
# Get the t values up to and including the
# solution to the integral problem
V = 25.0
t_ = A_intinv(V)
ts = t[t .<= t_]
push!(ts, t_)
# Plot results
plot(A; label = "Linear Interpolation")
plot!(ts, A.(ts), fillrange = 0.0, fillalpha = 0.75,
fc = :blues, lw = 0, label = "Area of $V")Docstrings
DataInterpolations.invert_integral — Functioninvert_integral(A::AbstractInterpolation)::AbstractIntegralInverseInterpolationCreates the inverted integral interpolation object from the given interpolation. Conditions:
- The range of
Amust be strictly positive A.umust be a number type (on which an ordering is defined)- This is currently only supported for
ConstantInterpolationandLinearInterpolation
Arguments
A: interpolation object satisfying the above requirements
DataInterpolations.ConstantInterpolationIntInv — TypeConstantInterpolationIntInv(u, t, A)It is the interpolation of the inverse of the integral of a ConstantInterpolation. Can be easily constructed with invert_integral(A::ConstantInterpolation{<:AbstractVector{<:Number}})
Arguments
u: Given byA.tt: Given byA.I(the cumulative integral ofA)A: TheConstantInterpolationobject
DataInterpolations.LinearInterpolationIntInv — TypeLinearInterpolationIntInv(u, t, A)It is the interpolation of the inverse of the integral of a LinearInterpolation. Can be easily constructed with invert_integral(A::LinearInterpolation{<:AbstractVector{<:Number}})
Arguments
u: Given byA.tt: Given byA.I(the cumulative integral ofA)A: TheLinearInterpolationobject