数值计算二阶导数时的大误差

时间:2015-10-18 05:07:12

标签: r poisson

我试图在数字上采用函数l的二阶导数(在矢量xlambda=6上的泊松分布的对数),这是我的代码:

    x=c(2,3)
    t=6
    delta=1e-12
    h=1e-12

    L=function(x,t) dpois(x,t)
    l<-function(x,t) log(prod(L(x,t)))
    ld<-function(x,t) (l(x,t+delta)-l(x,t))/delta
    ldd<-function(x,t) (ld(x,t+h)-ld(x,t))/h
    ld(x,t)
    ldd(x,t)

我的输出是

> ld(x,t)
[1] -1.167066
> ldd(x,t)
[1] 888178420

但是对于这个完全相同的函数,我使用wolfram并获得-7/6~~-1.16667作为一阶导数,-5/36~~-0.138889作为二阶导数。我一直试图找出为什么我的功能在过去两个小时内出现如此大的错误。

注意:这是针对课程项目的,所以我不能在R中使用派生函数。

1 个答案:

答案 0 :(得分:1)

我认为您看到的问题是由于四舍五入和其他数字问题。我建议采用两种方法:

  1. 提高deltah值;由于您的计算机具有有限的精度,因此在许多情况下tt+1e-12将完全相同。当然,这在数值计算衍生物时会引起很大的问题。
  2. 对于数值稳定性,通常最好将log(prod(x))替换为sum(log(x))
  3. 通过这两项调整,我们得到了更好的结果:

    delta = 1e-5
    h = 1e-4
    L=function(x,t) dpois(x,t)
    l<-function(x,t) sum(log(L(x,t)))
    ld<-function(x,t) (l(x,t+delta)-l(x,t))/delta
    ldd<-function(x,t) (ld(x,t+h)-ld(x,t))/h
    ld(x,t)
    # [1] -1.166667
    ldd(x,t)
    # [1] -0.1388853