首先,我不知道教授是否给出了错误的问题。无论如何,我尝试生成F(x)~U(0,1)
CDF 的位置F(x)=1-(1+x)exp(-x)
(对于此 CDF,您无法x=g(F(x))
手动计算)。然后计算根F(x)
来实现问题想要的。
0
因为从到INF
的根范围uniroot()
是没有问题的。因此,我用牛顿法来写一个。
然后,我的代码是这样的:
f=function(x) {
ifelse(x>=0,x*exp(-x),0)
}
in.C=function(n) {
a=runif(n)
G=NULL
for(i in 1:n) {
del=1
x=2
while(abs(del)>1e-12){
del=(1-(1+x)*exp(-x)-a[i])/f(x)
x=x-del
}
G[i]=x
}
G
}
system.time(tt<-in.C(100000))
但是,如果F(x)
太小,并且在牛顿法中一步,结果可能小于零,那么就会发生错误。此外,我这样修改了我的代码:
f=function(x) {
ifelse(x>=0,x*exp(-x),0)
}
in.C=function(n) {
a=runif(n)
G=NULL
for(i in 1:n) {
del=1
x=2
while(abs(del)>1e-12){
if(x>=0){ del=(1-(1+x)*exp(-x)-a[i])/f(x)
x=x-del
}
else break
}
if(x>=0) G[i]=x
}
G[!is.na(G)]
}
system.time(tt<-in.C(100000))
hist(tt, breaks=70, right=F, freq=F)
curve(f(x),from=0,to=20,add=T)
显然,代码是错误的,因为我拒绝了接近零的结果。
所以,我的问题是我的代码是否可以修改以计算正确,如果不能,是否有其他方法可以做到。任何帮助表示赞赏。