Suppose I have a function $f(t)$, and I want to compute its indefinite integral $$F(t)=\int_0^tf(\tau)\mathrm d\tau.$$ Moreover, suppose that, for any of a number of reasons, I require this integral to be done numerically, I need it to be done in a single swoop for all $t$ in a range $[0,T]$ of interest, and I need to be able to evaluate $F(t)$ for any $t$ in that range.
One standard trick (which is perhaps not as well known as it should be) is that one of the better ways to do this is to reinterpret the indefinite integral as an initial-value problem, $$F'(t)=f(t)\quad\text{under }F(0)=0$$ and then simply give it to the differential-equations solver NDSolve
directly, e.g.
NDSolve[{F'[t]==f[t], F[0]==0}, F, {t, 0, T}]
and this will return $F$ as an InterpolatingFunction
object which can be evaluated anywhere in $[0,T]$.
I would like to extend this to the case where the indefinite integral comes with a parameter, say, of the form $$F(t,t')=\int_{0}^tf(\tau,t')\mathrm d\tau.$$ Is there an equivalently clean way to obtain $F$ as an indefinite integral?
One such way is to invoke a similar solver, ParametricNDSolve
, in the form
ParametricNDSolve[{F'[t]==f[t,tt], F[0]==0}, F, {t, 0, T}, {tt}]
which will return a solution of the form {f-> ParametricFunction}
, where the ParametricFunction
is evaluated as ParametricFunction[tt]
(for a numeric tt
) to give an InterpolatingFunction
object, so e.g. ParametricFunction[4][5]
will return a number.
I find this solution unsatisfactory because it is very slow when one needs to repeat the process over and over for different $t'$s. While the ParametricFunction
object it returns is nice (including, for example, the ability to compute derivatives like $\frac{\partial F}{\partial t'}$), it is essentially based on a single ray on the $(t,t')$ plane, and there's no way for the different rays to talk to each other, with the downside that Mathematica ends up calculating many things which are very similar in a highly sub-optimal way.
I would like, then, clean solutions where I can run the whole calculation once, and then simply query for the values of $F(t,t')$ without incurring in additional computation.
Comments
Post a Comment