【问题标题】:Integration in RR中的集成
【发布时间】:2018-08-07 23:12:29
【问题描述】:

我想通过在 R 中使用积分函数将 exp(-x) 从 0 积分到 100000。但是我发现答案是 2.061453e-45,它几乎是 0(零)。真正的答案是 1-exp(-100000),它几乎是 1。如何使用 R 中的集成函数进行这种集成以接近正确的解决方案?

以下是使用的R代码

ab<-function(x) { return(exp(-x)) }
integrate(ab,0,100000)$value

输出是

 2.061453e-45

【问题讨论】:

  • 您介意分享您用于执行集成的代码吗?
  • @Aziz ab
  • @Onyambu 实际上,我想使用集成功能。我在这里提出的问题是一个更大问题的一个子部分。我只是想看看集成功能的工作标准。
  • 如果您希望积分在无限区间内,积分文档建议您使用 Inf 而不是大数。你要计算这样的积分吗?
  • @Hugh 是的,我明白你的意思。但是你能告诉我,如果有人要求我在这个范围 (0, 100000) 上积分 $exp(-x)$,我是否将 100000 替换为 Inf ?对于任何给定的可积函数,我如何知道是否将上限替换为 Inf?

标签: r numerical-integration


【解决方案1】:

这是 R 中使用的大区间数值积分方法的限制。 documentation of the integrate function 声明:

在无限区间积分时,明确地这样做,而不是仅仅使用一个大数作为端点。这增加了正确答案的机会——任何在无限区间上的积分是有限的函数在该区间的大部分时间里都必须接近于零。

由于函数exp(-x)x=100000 处非常接近零(实际值约为3.56 × 10^-43430),并且由于函数在递减,越来越接近于零,您可以安全地将函数积分到无穷大,

integrate( ab , 0 , Inf)

你会得到正确的结果,

1

【讨论】:

    【解决方案2】:

    这是对@Aziz 好答案的补充

    integrate 的参数之一是

    细分:细分过程中产生的子区间数。

    默认值为 100。即该函数在 0 到 100000 之间展开 100 个点。这将从根本上对重要的点进行欠采样 - x=0 附近的点。如果您在积分到无穷大时遇到问题,您可以将积分分成更小的部分 - 从 0 到 10、10 到 20 和 20 到 100000 - 强制在 x=0 附近进行更重的采样。

    > integrate(ab,0,10)$value 
    [1] 0.9999546
    > integrate(ab,10,20)$value
    [1] 4.539787e-05
    > integrate(ab,20,100000)$value
    [1] 4.341375e-54
    > 
    > integrate(ab,0,10)$value + integrate(ab,10,20)$value + integrate(ab,20,100000)$value
    [1] 1
    

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 2013-01-19
      • 2011-11-19
      • 2017-06-19
      • 2020-11-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多