让g(x) = 1/(2*pi) exp ( - x^2 / 2)
为均值为0和标准偏差为1的正态分布的密度。在某些计算中,纸上出现了形式为的积分
其中c> 0是一个正数。
由于我无法手动进行评估,因此我想到了将其近似并绘制的想法。我在R中尝试过此操作,因为R提供了dnorm函数和一个执行积分的函数。
您看到我需要数字积分n次,其中n将通过调用plot函数来选择。我的代码有一个for循环,可以迭代地创建那些“不完整”的卷积。
例如,即使n = 3和c = 1,这也会给我一个错误。 n = 2(因此是一个积分)起作用。
N = 3
ngauss <- function(x) dnorm(x , mean = 0, sd = 1)
convoluts <- list()
convoluts[[1]] <- ngauss
for (i in 2:N) {
h <- function(y) {
g <- function(z) {ngauss(y-z)*convoluts[[i-1]](z)}
return(integrate(g, lower = -1, upper = 1)$value)
}
h <- Vectorize(h)
convoluts[[i]] <- h
}
convoluts[[3]](0)
我得到的是:
错误:评估嵌套太深:无限递归/ options(expressions =)?
我知道这是一个艰苦的计算,但是对于“小” n,应该有类似的可能。
也许有人可以帮助我修复我的代码或提供建议,说明如何以更好的方式实现它。另一种更合适的语言也可以。
答案 0 :(得分:1)
问题似乎在于integrate
如何处理不同环境中的变量。特别是,它并没有真正在每次迭代中正确地处理i
。代替使用
h <- evalq(function(y) {
g <- function(z) {ngauss(y - z) * convoluts[[i - 1]](z)}
integrate(g, lower = -1, upper = 1)$value
}, list(i = i))
完成这项工作,例如快速设置N <- 6
可以
convoluts[[N]](0)
# [1] 0.03423872
由于您的积分只是N
个独立标准法线之和的pdf(然后遵循N(0,N)),因此我们也可以通过设置lower = -Inf
和{{ 1}}。然后有了upper = Inf
,我们有了
N <- 4
因此,出于实用目的,当使用dnorm(0, sd = sqrt(N))
# [1] 0.1994711
convoluts[[N]](0)
# [1] 0.1994711
时,最好使用c = Inf
而不是手动计算。