如何在R中解决这个“非有限函数值”?

时间:2016-12-23 12:54:22

标签: r

我使用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)不能等于零。

请问有谁可以告诉我如何解决这个问题?

2 个答案:

答案 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*T0.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)