多次评估 R 中的积分

Posted

技术标签:

【中文标题】多次评估 R 中的积分【英文标题】:Evaluating an integral in R multiple times 【发布时间】:2021-07-07 15:14:32 【问题描述】:

我正在尝试集成关于 x 的下一个功能

integrand <- function(x) 
f1 <- pnorm((1/sqrt(u/x))*( sqrt((t*u*v)/x) - sqrt(x/(t*u*v)) ))

在哪里,

v=10
u=5

但是,我需要综合考虑不同的 t 值,因此尝试将一系列值定义为:

t=seq(0,100,0.1)

并将 sapply 函数用作:

data=sapply(t, function(x) integrate(integrand, lower = 0 , upper = 10000)$value )

我收到了这些错误:

    Error in integrate(integrand, lower = 0, upper = 10000) : 
  evaluation of function gave a result of wrong length
In addition: Warning messages:
1: In (t * u * v)/x : longer object length is not a multiple of shorter object length
2: In x/(t * u * v) : longer object length is not a multiple of shorter object length
3: In (1/sqrt(u/x)) * (sqrt((t * u * v)/x) - sqrt(x/(t * u * v))) :
  longer object length is not a multiple of shorter object length

我没有运气。

如果有任何帮助,我将不胜感激。

问候!

【问题讨论】:

对于初学者 u/x,当您的 seq 从 0 开始时,将是未定义的。然后你分配给f1,但你的函数没有返回任何东西。您的意思是在正态分布函数中评估该函数吗? 导致您的错误的原因是 t 是长度为 1001 的向量。我相信您正在尝试遍历所有这些值并将其分配给您的函数中的 x。但是,您的函数也是t 的函数。因此,它试图评估您的函数,其中uvx 都具有单个值,而t 具有 1001,这会引发错误。 感谢您的帮助,感谢您指出两个问题。我试图找到一种方法来评估每个“t”值的积分,假设在 t = 0.1 时评估积分,然后在 t = 0.2 时评估积分,依此类推。也许 sapply 函数不合适。 那么你要评估x 的价值是什么? 我正在考虑积分函数“lower = 0,upper = 10000”中定义的积分限制 【参考方案1】:

你仍然可以像这样使用sapply

sapply(t, function(t) 
  integrate(function(x) 
    pnorm((1/sqrt(u/x))*( sqrt((t*u*v)/x) - sqrt(x/(t*u*v)) ))
  , lower = 0, upper = 1000)$value
)

输出

[1]  0.000000  5.416577 10.251273 15.146418 20.084907 25.049283 ...

【讨论】:

【参考方案2】:

上一篇帖子也有类似问题,具体解决方法here

代码结果如下:

t=seq(0,100,0.1)
fu<- list()
int<- numeric()
for(i in 1:length(t))
  
    fu[[i]] = function(x)
    f1 <- pnorm((1/sqrt(u/x))*( sqrt((t[i]*u*v)/x) - sqrt(x/(t[i]*u*v)) ));
  
    int[i] = integrate(h[[i]], lower=0, upper=1000)$value
  
  int

【讨论】:

以上是关于多次评估 R 中的积分的主要内容,如果未能解决你的问题,请参考以下文章

使用黎曼和评估积分

sympy:如何评估绝对值的积分

分析 R 代码时如何验证函数评估的次数

为啥在评估复值积分时 boost::multiprecision::exp 会卡住?

R中的标准评估和非标准评估

R中的预先评估导致错误消息