You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:11:01