I know that I asked the same question before, but as I am pretty new here the question was asked poorly and not reproducible. Therefore I try to do it better here. (If I only edit the old one probably nobody will read it)
I have this double integral that I would like to integrate:Here is a picture
ff<-function(g,t) exp((16)*g)*exp(-8*t-(-t-0.01458757)^2/(0.0001126501))
integrate(Vectorize(function(t) integrate(function(g)
ff(g,t), -2.5,0)$value), -2, 2)
Running this in R gives me the error:
the integral is probably divergent
When I try to run the sam function in Wolfram it gives me a proper value: (i had to switch g=x and t=y)
Link:
As you can see it gets a finite result, can somebody help me out here?
I plotted the function on the defined area and couldn't find a singularity issue. see:
library('Plot3D')
x <- seq(-2.5,0, by = 0.01) #to see the peak change to: seq(-0.2,0, by = 0.001)
y <- seq(-2,2, by = 0.01) #"": seq(-0.1,0.1, by = 0.001)
grid <- mesh(x,y)
z <- with(grid,exp((16)*x)*
exp(-8*y-(-0.013615734-y-0.001+0.5*0.007505^2*1)^2/(2*0.007505^2)))
persp3D(z = z, x = x, y = y)
Thanks for your help and I hope the question is better structured then the old one.
It's also worth noting that in the integrate.c source file, the description for the error message is
so despite the fact the message says "probably-divergent" it seems with your code it is more likely to be slowly convergent.
Also, you can continue to run when you get this message and extract the error if you set
stop.on.error=FALSE
R doesn't claim to be a fancy mathematical solver like the Wolfram products such as Mathematica. It doesn't do any symbolic simplifications of integrals and that's the kind of stuff that Wolfram's been perfecting over the years. if you're just looking to numerically solve a bunch of double integrals, programs like Mathematica or Maple are probably better choices. That just doesn't seem to be where R spends as much of its development resources.
Your integrand is significantly nonzero only for a small range around y=0. From
?integrate
While you're not strictly integrating over an infinite interval, the same numerical problem applies. And indeed:
It's interesting that the answer is different to that obtained from Wolfram Alpha. I'm not sure who to trust here; on the one hand I've used R's
integrate
many times and haven't had problems (that I can tell); however as @MrFlick says R isn't a dedicated mathematical solver like Wolfram Alpha.You can also set the
rel.tol
convergence parameter to a more stringent value, say, 1e-7 or 1e-8. This is more important in the inner integral than the outer one, since errors in the former will propagate to the latter. In this case, it didn't make a difference to the final result.For double integrals, it is better to use the
cubature
package.The
hcubature
function gives a result which is not stable when one decreases the tolerance:Contrary to the result of
pcubature
, which is stable:Next,
RcppNumerical
provides a powerful multiple integration.It gives the same result as
pcubature
:By the way, an exact integration with Mathematica 11 also provides this result: