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

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...