[R] bivariate vector numerical integration with infinite range
baptiste auguie
baptiste.auguie at googlemail.com
Tue Sep 21 14:47:50 CEST 2010
Hi,
thanks for the pointer to cubature (which i had probably dismissed too
quickly). Your tests with "f" should not work: the domain of f(x,.) is
restricted to positive reals, but this domain of integration is then
transformed in mixedrule() to map the semi-infinite range to a more
reasonable domain (for example [-4,4]).
Thanks,
baptiste
On 21 September 2010 14:16, David Winsemius <dwinsemius at comcast.net> wrote:
> Baptiste;
>
> You should see if this meets your requirements:
>
> help(adaptIntegrate, package=cubature)
>
> (I got errors when I ran the code and NaN's when I looked at the output of
> test function, "f".)
>
>> vAverage(mixedrule, -4, 4, 0.0, 1, 20, f) - c(pi, pi/2, 2*pi)
> Error: object 'mixedrule' not found
>
>> f(-4,0)
> [1] NaN NaN NaN
> Warning message:
> In sqrt(x) : NaNs produced
>> f(-3.9,0)
> [1] NaN NaN NaN
> Warning message:
> In sqrt(x) : NaNs produced
>> f(-3.9,0.1)
> [1] NaN NaN NaN
> Warning message:
> In sqrt(x) : NaNs produced
> --
> David
> On Sep 21, 2010, at 4:11 AM, baptiste auguie wrote:
>
>> Dear list,
>>
>> I'm seeking some advice regarding a particular numerical integration I
>> wish to perform.
>>
>> The integrand f takes two real arguments x and y and returns a vector
>> of constant length N. The range of integration is [0, infty) for x and
>> [a,b] (finite) for y. Since the integrand has values in R^N I did not
>> find a built-in function to perform numerical quadrature, so I wrote
>> my own after some inspiration from a post in R-help,
>>
>> library(statmod)
>>
>> ## performs 2D numerical integration
>> ## using Gauss-Legendre quadrature
>> ## with N points for x and y
>>
>> vAverage <- function(f, a1,b1, a2,b2, N=5, ...){
>>
>> GL <- gauss.quad(N)
>> nodes <- GL$nodes
>> weights <- GL$weights
>>
>> C2 <- (b2 - a2) / 2
>> D2 <- (b2 + a2) / 2
>> y <- nodes*C2 + D2
>>
>> C1 <- (b1 - a1) / 2
>> D1 <- (b1 + a1) / 2
>> x <- nodes*C1 + D1
>>
>> value <- 0
>> for (ii in seq_along(x)){
>> tmp <- 0
>> for (jj in seq_along(y)){
>> tmp <- tmp + C1 * weights[jj] * f(x[jj], y[ii], ...)
>> }
>> value <- value + C2 * weights[ii] * tmp
>> }
>> value
>> }
>>
>> ## test function, the result is pi for y=1
>> f <- function(x, y) {
>> res <- 1 / (sqrt(x)*(1+x))
>> c(res, res/2, 2*res)
>> }
>>
>> ## Transformation rule from Numerical Recipes
>> ## to deal with the [0, infty) range of x
>>
>> mixedrule <- function(x, y, f, ...)
>> {
>> t <- exp(pi*sinh(x))
>> dtdx <- t*(pi*cosh(x))
>> f(t, y, ...)*dtdx
>> }
>>
>>
>> vAverage(mixedrule, -4, 4, 0.0, 1, 20, f) - c(pi, pi/2, 2*pi)
>> ## -3.535056e-06 -1.767528e-06 -7.070112e-06
>>
>>
>> So it seems to work. I wonder though if I may have missed an easier
>> (and more reliable) way to perform such integration using base
>> functions or an add-on package that I may have overlooked.
>>
>> Best regards,
>>
>> baptiste
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> David Winsemius, MD
> West Hartford, CT
>
>
More information about the R-help
mailing list