Skip to main content

differential equations - How can I numerically pre-compute an indefinite integral with a parameter?


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

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....