我使用R来计算这样的嵌套函数:
C1_B <- function(T){integrate(function(tau)f(tau),lower=0.01*T,upper=0.99*T)$value}
f <- function(tau) {integrate(function(tau1)sqrt(1/(tau-tau1)),lower=0.01*tau,upper=0.99*tau)$value}
C1_B(0.5)
但是,我收到了一条消息,例如
“积分错误(函数(tau1)sqrt(1 /(tau - tau1)),lower = 0.01 *:非有限函数值
另外:警告信息:**
以sqrt(1 /(tau-tau1)):NaNs产生“
我猜问题是关于我的代码中的“(tau-tau1)”;但来自 我定义的积分域(“lower = 0.01 * tau,upper = 0.99 * tau”),(tau-tau1)不能等于零。
请问有谁可以告诉我如何解决这个问题?
答案 0 :(得分:0)
你的积分f存在一个精确的解决方案。然而,我得到的值与这个数值近似不一致。我会说
的积分 d(tau1)/sqrt(tau - tau1)
是
-2 * sqrt(tau - tau1)
在0.99*tau
的上限和0.01*tau
的下界,你得到
-2 * (sqrt(tau - 0.99 * tau) - sqrt(tau - 0.01 * tau)) =
-2 * sqrt(tau) * (sqrt(0.01) - sqrt(0.99))
tau的整合可以再次完全解决。它产生
-(4/3)(sqrt(0.01) - sqrt(0.99)) * tau^(3/2)
编辑:根据您的边界0.01*T
和0.99*T
,最终得到的解决方案是
-(4/3)(sqrt(0.01)-sqrt(0.99)) * ((0.99 * T)^3/2 - (0.01 * T)^3/2)
您可以在第一个精确积分结果上使用integrate
(对于f)。没有错误产生。您报告的错误可能是由于近似方法造成的。也许你可以尝试另一种使用另一种近似的积分函数。函数f的精确解决方案与程序中计算的积分相匹配。
当您使用integrate
整合f的确切结果时,结果等于我给出的确切最终解决方案。
答案 1 :(得分:0)
我试了一下 - 问题是整合期望移交函数能够处理输入向量并输出相同大小的向量。
幸运的是,解决方案很简单 - 只需将您的功能包裹在sapply
。
以下代码有效:
f <- function(tau) {integrate(function(tau1)sqrt(1/(tau-tau1)),lower=0.01*tau,upper=0.99*tau)$value}
intfun <- function(x) sapply(x,f)
C1_B <- function(T){integrate(function(tau) intfun(tau),lower=0.01*T,upper=0.99*T)$value}
C1_B(0.5)