Skip to main content

calculus and analysis - Somewhat Irreproducible Integrate Results


Backslide introduced in v10 and persisting through v10.3.1.




In the course of considering question 102922, I encountered erratic results from a particular integration. It is illustrated as follows. With a new session of Mathematica


$Version
(* 10.3.0 for Microsoft Windows (64-bit) (October 9, 2015) *)


run


Do[ans = Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞}, 
Assumptions -> {l > 0, R > 0, n ∈ Integers}]; Print[ans], {i, 6}]

Integate returns unevaluated the first time called. Thereafter, it returns


(* ConditionalExpression[(2^(-1 + n)*Sqrt[Pi]*R^(-1 - n)*Gamma[(1 + l + n)/2])/
Gamma[(2 + l - n)/2], n < 1 && l + n > -1] *)

as expected. A variant on this strange behavior, again in a new session of Mathematica, is



Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞}, Assumptions -> {l > 0, R > 0}]
(* returns expected result *)
Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞}, Assumptions -> {l > 0, R > 0,
n ∈ Integers}]
(* returns unevaluated *)
Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞}, Assumptions -> {l > 0, R > 0,
n ∈ Integers}]
(* returns unevaluated *)
Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞}, Assumptions -> {l > 0, R > 0,
n ∈ Integers}]

(* returns expected result, as at the beginning of the question*)

There are many possible combinations of Assumptions for this calculation, and most behave similarly, at first returning unevaluated and later returning evaluated. Moreover, with Assumptions cases a, b, and c, Integrate run with the sets in that order typically returns unevaluated in the first two cases, and evaluated in the third, and shuffling the three cases likewise typically also returns the first two cases (for example, b and c) unevaluated and the third (in the same example, a) evaluated.


I know of two work-arounds. One, due to Bob Hanlon, is to use GenerateConditions -> False which gives the evaluated result but at the cost of no conditions. The second is illustrated at the beginning of this question. It, too, seems unsatisfactory. So, can this behavior be explained, and what is a better work-around? Thanks.



Answer



The reference provided above by Daniel Lichtblau, and the comments therein by Szabolcs and him, suggested that Integrate may be returning unevaluated simply because it timed out, which appears to occur after about 60 seconds. The obvious solution, then, is to give it more time.


TimeConstrained[
Integrate[k^n SphericalBesselJ[l, R*k], {k, 0, ∞},
Assumptions -> {l > 0, R > 0, n ∈ Integers}], 120]


which returns with the desired answer after nearly 100 seconds on my PC.


(As explained by Daniel Lichtblau and Szabolcs in the reference, a second call to Integrate after it times out may provide an answer even though the first call did not, because Integrate stores intermediate results and, therefore, may proceed more rapidly when called the second time. Consequently, the comparison made in the comment above by xzczd between v9 and v10 may reflect that v10 is slower than v9 or has a smaller default time limit in this instance.)


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....