我使用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)
答案 0 :(得分:1)
好的,这个问题让我感兴趣。
我查看了gaussquad
来源,显然作者没有在内部运行sapply
,因为所有integrands / function都应该在vector参数上返回vector。
文件清楚地说明了这一点:
functn
R 函数,该函数应采用数字参数x和可能的某些参数。
该函数返回给定参数x
如果您正在使用某些内部功能,他们会以这种方式编写,所以一切正常。
你必须重写你的函数才能使用vector参数并返回一个向量
更新
Vectorize()对我有用,可以解决问题,也可以用简单的包装器来解决问题
vf <- function(z) {
sapply(z, f)
}
在其中任何一项更改后,结果都相同:0.2029512