[Rd] segmentation fault in integrate (PR#812)
Prof Brian D Ripley
ripley@stats.ox.ac.uk
Fri, 12 Jan 2001 08:22:42 +0000 (GMT)
On Fri, 12 Jan 2001, Torsten Hothorn wrote:
>
> > I tried to integrate numerically a function wich is similar to the
> > following:
> >
> > > dummy <- function(x) { exp(-1*x) * dnorm(x) }
> > > dummy(-100)
> > [1] 0
> > > dummy(-1000)
> > [1] NaN
> > > dummy(-10000)
> > [1] NaN
> >
> > If I choose the lower boundary to be too small integrate causes a
> > segmentation fault:
> >
> > > library(integrate)
> > > integrate(dummy, -100, 0)$value
> > [1] 1.387143
> > > integrate(dummy, -1000, 0)$value
> > [1] NaN
> > Warning message:
> > Ifail=1, maxpts was too small. Check the returned relerr! in: adapt(1,
> > lower, upper, minpts, maxpts, functn, eps, ...)
> > > integrate(dummy, -10000, 0)$value
> > Segmentation fault
>
> Running Version 1.2.0 Patched (2001-01-07) and integrate Version 2.2-3
> on SuSE 6.4 gives:
>
> > integrate(dummy, -1000000, 0)$value
> [1] NaN
> Warning message:
> Ifail=1, maxpts was too small. Check the returned relerr! in: adapt(1,
> lower, upper, minpts, maxpts, functn, eps, ...)
>
> I has not able to reproduce the segfault ;-)
>
> BTW: if one uses
>
> > dummy <- function(x) { a <- exp(-1*x) * dnorm(x); ifelse(is.na(a), 0,
> a) }
>
> this returns
>
> > integrate(dummy, -100, 0)$value
> [1] 1.387143
> > integrate(dummy, -1000, 0, maxpts=1000)$value
> [1] 0.6935715
Better, try
dummy <- function(x) { exp(-1*x + dnorm(x, log=TRUE))}
that is, do your calculations on log scale as far as possible. This is
more accurate than cop-ing out at Inf*0.
Even better, you can adjust the normal mean to cancel the linear term
exactly: dnorm(x, mu) has linear term -mu*x. So use
dummy <- function(x) exp(0.5)*dnorm(x, -1)
You will still need to adjust maxpts or find a sensible lower end.
(BTW, I don't get a segfault either, and we need you to debug it
on your system, I am afraid.)
--
Brian D. Ripley, ripley@stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272860 (secr)
Oxford OX1 3TG, UK Fax: +44 1865 272595
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._