R

时间:2016-01-06 19:53:05

标签: r math statistics

我使用gaussquad包以数字方式评估一些积分。

我认为ghermite.h.quadrature命令通过在点 x1 ,..., xn f (x)来工作>然后构造总和 w1 * f (x1)+ ... + wn * f (xn),其中 x1 ,.. 。, xn w1 ,..., wn 是用户提供的节点和权重。

因此我想到了命令

ghermite.h.quadrature(f,rule)
sum(sapply(rule$x,f)*rule$w)

会为任何函数 f 产生相同的输出,其中''规则''是一个数据框,它将节点存储在标有“''''''''''和标有" w"的列中的权重。对于许多函数,输出确实是相同的,但对于某些函数,我得到了非常不同的结果。有人可以帮我理解这种差异吗?

谢谢!

代码:

n.quad = 50 
rule = hermite.h.quadrature.rules(n.quad)[[n.quad]]

f <- function(z){ 

 f1 <- function(x,y) pnorm(x+y)

 f2 <- function(y) ghermite.h.quadrature(f1,rule,y = y)

 g <- function(x,y) x/(1+y) / f2(y)*pnorm(x+y)

 h <- function(y) ghermite.h.quadrature(g,rule,y=y)

 h(z)

}

ghermite.h.quadrature(f,rule)
sum(sapply(rule$x,f)*rule$w)

1 个答案:

答案 0 :(得分:1)

好的,这个问题让我感兴趣。

我查看了gaussquad来源,显然作者没有在内部运行sapply,因为所有integrands / function都应该在vector参数上返回vector。

文件清楚地说明了这一点:

functn R 函数,该函数应采用数字参数x和可能的某些参数。 该函数返回给定参数x

的数值向量值

如果您正在使用某些内部功能,他们会以这种方式编写,所以一切正常。

你必须重写你的函数才能使用vector参数并返回一个向量

更新

Vectorize()对我有用,可以解决问题,也可以用简单的包装器来解决问题

vf <- function(z) {
    sapply(z, f)
}

在其中任何一项更改后,结果都相同:0.2029512