【发布时间】:2021-11-09 04:34:29
【问题描述】:
我正在尝试使用 R 来评估包含 exp(exp(x)) 形式的表达式的单变量函数的定积分,x 的上限超过 100。使用基本 integrate() 函数时,我在这种情况下得到错误“非有限函数值”,因为所涉及的值超过了使用 R 的双精度算术可以表示的最大数字(2^1024 或 ~10^300)。
Brobdingnag 包在处理非常大的数字时非常有用,但 integrate() 在内部强制所有值加倍,所以如果我尝试将被积函数定义为,例如,exp(as.brob(exp(x)))(一个表达式可以评估),我只是得到一个不同的错误(“函数评估给出了错误长度的结果”)。我还尝试使用 Rmpfr 包中的 integrateR() 函数,但在我的设置(包版本 0.8-40,R 版本 4.1.0)中,甚至只是尝试运行文档中给出的示例代码(@ 987654329@) 将中止我的 R 会话。
是否有替代 R 的 integrate() 可以处理被积函数中出现的非常大的数字?
从 2021 年 9 月 15 日开始编辑:下面添加的尝试解决方案的最小可重复示例:
if(!require("Brobdingnag") {install.packages("Brobdingnag")}
library(Brobdingnag)
f <- function(x) {
term1 <- 0.8361913 * exp(0.1516063*x) * exp(0.1788979 * exp(8.577809*x))
term2 <- 0.9512496 * exp(8.577809*x) + 0.04875068
return(term1 * term2)
}
log_f <- function(x) {
x <- as.brob(x)
term1 <- 0.1788979 * (exp(8.577809*x) - 1) + 0.1516063*x
term2 <- log(0.9512496 * exp(8.577809*x) + 0.04875068)
return(term1 + term2)
}
u <- 131.6
log_S <- log(u) + log_f(u) # +exp(1127.1)
integrate(function(x) {as.double(exp(log_f(x) - log_S))}, lower = 0, upper = u)
# 0 with absolute error < 0
【问题讨论】:
标签: r precision numerical-integration