먼저, 교수가 잘못된 질문을 던졌습니다. 어쨌든 F(x)~U(0,1)
을 생성하려고 시도했습니다. 여기서 CDF F(x)=1-(1+x)exp(-x)
(이 CDF의 경우 수동으로 x=g(F(x))
을 계산할 수 없습니다). 그리고 나서 질문의 목적을 달성하기 위해 F(x)
의 근원을 계산하십시오.역 (逆) CDF를 사용하여 무작위 변수를 생성하십시오.
루트 범위가 0
에서 INF
까지이므로 uniroot()
이 문제가됩니다. 따라서 저는 Newton Method를 사용하여 하나를 씁니다.
그럼, 내 코드는 다음과 같다 : 그러나
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)
가 너무 작고, 뉴턴 방법에서 한 단계, 결과가 0 미만, 다음 오류가 일어날 수 있습니다합니다. 또한 다음과 같이 코드를 수정했습니다.
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)
0에 가까운 결과를 거부했기 때문에 분명히 코드가 잘못되었습니다.
그래서 내 판단은 내 코드가 올바르게 계산되도록 수정 될 수 있는지 아닌지, 그렇지 않은지 여부입니다. 어떤 assitance도 감사하겠습니다.