22
$\begingroup$

Bug introduced in 8.0 or earlier and persisting through 13.2 or later


There is a rather simple integral ($K_0$ is the 0-th order MacDonald function) $$\int_0^\infty e^{-x \cosh\xi}\, d\xi = K_0(x)$$ which mathematica cannot solve. This even though the documentation claims that Integrate can give results in terms of many special functions. In fact it can solve the integral obtained by substituting $r=\cosh \xi$, $$\int_1^\infty \frac{e^{-x r}}{\sqrt{r^2-1}}\,dr=K_0(x).$$ In fact it also failed in solving the more general integral $$\int_0^\infty e^{-x \cosh\xi} \cosh(\alpha \xi)\, d\xi = K_\alpha(x).$$

I am using "8.0 for Mac OS X x86 (64-bit) (October 5, 2011)". Are there more recent or older versions of Mathematica which can solve this class of integrals?


Edit:

I want to stress that this is not an arbitrary integral but can be thought of as a definition of $K_0$ (the corresponding integral $\int_0^{2\pi} \!e^{i x \cos \xi}\,d\xi$ for $J_0$ mathematica handles very well). I am just curious how it can happen that a system as developed as Mathematica cannot handle this "elementary" integral.

Here is the Mathematica code for those who want to test:

Integrate[Exp[-x Cosh[ξ]],{ξ,0,Infinity}]

Now I found a related integral which indeed is a bug in mathematica. If you try to evaluate ($x \in \mathbb{R}$) $$\int_0^\infty \cos(x \sinh \xi)\,d\xi = K_0(|x|)$$ then Mathematica claims that the integral diverges.

$\endgroup$
15
  • 1
    $\begingroup$ The integration is with respect to \[Xi] $\endgroup$ Commented Apr 25, 2012 at 8:57
  • 2
    $\begingroup$ Please include the MMA code for the rest of us to test easily... $\endgroup$
    – tkott
    Commented Apr 25, 2012 at 10:05
  • 3
    $\begingroup$ @Artes: However this is not an example of Integrate behaving improperly, but an example of Integrate not being able to calculate a given integral. Which may be unfortunate, but as long as it doesn't give an incorrect result, is neither improper behaviour nor a bug. $\endgroup$
    – celtschk
    Commented Apr 25, 2012 at 10:31
  • 1
    $\begingroup$ @Artes Integrate is one of the most difficult to get right functions, especially when it comes to definite integration. You'll find similar problems in other systems as well. $\endgroup$
    – Szabolcs
    Commented Apr 25, 2012 at 13:09
  • 4
    $\begingroup$ Send in this integral as a suggestion to wolfram technical support. The email is [email protected]. Let then know you are suggesting that this integral should evaluate to the value you suggested here. $\endgroup$
    – Searke
    Commented Apr 25, 2012 at 14:52

2 Answers 2

24
$\begingroup$

An experimental internal function Integrate`InverseIntegrate helps here, although it's intended more for integrands involving logs. This is what it returns in the development version:

Integrate`InverseIntegrate[Exp[-x Cosh[t]], {t, 0, Infinity}, Assumptions -> Re[x] > 0]
(*  BesselK[0, x]  *)
$\endgroup$
4
  • 2
    $\begingroup$ This code returns $Failed on my machine (version 8.0.4, Windows 7). $\endgroup$
    – Verbeia
    Commented Jun 13, 2012 at 6:28
  • 1
    $\begingroup$ Sorry, I should have tested it. This is what it returns in the development version. In[1]:= Integrate`InverseIntegrate[Exp[-x Cosh[t]], {t, 0, Infinity}, Assumptions -> Re[x] > 0] Out[1]= BesselK[0, x] $\endgroup$
    – Bhuvanesh
    Commented Jun 20, 2012 at 21:03
  • $\begingroup$ Could you tell me how could I find the file related to "Integrate`InverseIntegrate"? $\endgroup$
    – WateSoyan
    Commented Apr 12, 2015 at 12:58
  • 1
    $\begingroup$ Integrate`InverseIntegrate is included as part of Mathematica versions 9.0+. It is not possible to load a file and make it work in earlier versions. $\endgroup$
    – Bhuvanesh
    Commented Apr 14, 2015 at 19:55
10
$\begingroup$

For those who are interested, what Integrate`InverseIntegrate seems to do is to try various substitutions of the form u == g[x], where g[x] is an expression in the integrand. Here is a function that can make such substitutions in an integral.

ClearAll[sub];
SetAttributes[sub, HoldFirst];
sub[Integrate[f_, {x_, a_, b_}, opts___?OptionQ], g_] := 
 Module[{xx, u, inv},
  inv = Simplify[
    InverseFunction[Function[xx, ConditionalExpression[g /. x -> xx, a < xx < b]]][u]
    ];
  Integrate[(f /. x -> inv) * D[inv, u],
    {u,
     Limit[g, x -> 0, Direction -> -1],
     Limit[g, x -> Infinity, Direction -> 1]},
    opts] /; FreeQ[inv, InverseFunction]
  ]

Applied to a couple of the OP's examples:

sub[Integrate[Exp[-x Cosh[r]], {r, 0, Infinity}, Assumptions -> Re[x] > 0], Cosh[r]]
(*  BesselK[0, x]  *)

sub[Integrate[Cos[-x Sinh[t]], {t, 0, Infinity}, Assumptions -> x ∈ Reals], Sinh[t]]
(*  BesselK[0, Abs[x]]  *)

The integrand Exp[-x Cosh[t]] Cosh[a t] seems beyond the reach of this sort of stratagem.

$\endgroup$
3
  • $\begingroup$ I tested your code (mma 11.0.1): the second expression is evaluated as in your case but the first gives: imgur.com/gallery/itE7M. Also the Integral mentioned in mathematica.stackexchange.com/questions/128340/… is this way not solvable. $\endgroup$
    – mrz
    Commented Oct 11, 2016 at 12:27
  • $\begingroup$ @mrz Thanks! I fixed the typo & the code should work. -- And, no, it's no help to your other integral (but that's sort of obvious, since this answer is just showing what Integrate`InverseIntegrate does, and it was already clear that InverseIntegrate didn't work). $\endgroup$
    – Michael E2
    Commented Oct 11, 2016 at 12:55
  • 1
    $\begingroup$ @MichaelE2 it might be worthwhile to add that Integrate[Exp[-x Cosh[t]], {t, 0, Infinity}, Assumptions -> Re[x] > 0] fails even in V13.0.0. (+1) for the very nice manual approach for substitutions. $\endgroup$
    – bmf
    Commented Apr 14, 2022 at 4:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.