我试图在数字上采用函数l
的二阶导数(在矢量x
和lambda=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中使用派生函数。
答案 0 :(得分:1)
我认为您看到的问题是由于四舍五入和其他数字问题。我建议采用两种方法:
delta
和h
值;由于您的计算机具有有限的精度,因此在许多情况下t
和t+1e-12
将完全相同。当然,这在数值计算衍生物时会引起很大的问题。log(prod(x))
替换为sum(log(x))
。通过这两项调整,我们得到了更好的结果:
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