R中pracma包quadinf计算无穷积分报错及非向量化函数疑问
问题分析
错误Error in if (delta < tol) break : the condition has length > 1的核心原因是:你的被积函数integrand返回的是向量,而quadinf要求被积函数接收单个数值输入时,必须返回单个数值输出。
具体触发逻辑:
- 你定义的
tau <- -5:5是长度为11的向量,因此mu <- beta - tau也变成了长度为11的向量 - 当
quadinf调用integrand时,传入的Ti是单个数值,但dlnorm(x = Ti, meanlog = mu, sd = sigma)会因为mu是向量,返回长度为11的向量,最终Ti*dlnorm(...)也是长度为11的向量,完全不符合quadinf对被积函数的输出要求
解决方案
你需要针对tau的每个值单独计算积分,而不是让mu成为向量。这里提供两种实现方式:
方法1:使用for循环
library(pracma) beta <- 3.2 sigma <- 1.2 tau_values <- -5:5 results <- numeric(length(tau_values)) for (i in seq_along(tau_values)) { tau <- tau_values[i] mu <- beta - tau integrand <- function(Ti){ Ti * dlnorm(x = Ti, meanlog = mu, sd = sigma) } results[i] <- quadinf(integrand, 0, Inf)$Q } results
方法2:使用purrr包的map_dbl(更简洁)
library(pracma) library(purrr) beta <- 3.2 sigma <- 1.2 tau_values <- -5:5 results <- map_dbl(tau_values, function(tau) { mu <- beta - tau integrand <- function(Ti) Ti * dlnorm(Ti, meanlog = mu, sd = sigma) quadinf(integrand, 0, Inf)$Q }) results
额外说明
quadinf确实不需要被积函数向量化,它会自动处理单值输入,但前提是被积函数对单值输入返回单值输出- 你的原始代码里,被积函数本身不是“向量化问题”,而是外部的
mu是向量,导致计算结果变成了向量,这才是触发错误的关键
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

