我必须为我的论文准备一个算法来交叉检查一个理论结果,即N个周期的二项式模型收敛于N \到\ infty的对数正态分布。对于那些不熟悉这个概念的人,我必须创建一个算法,该算法采用起始值并将其与上乘数和下乘数相乘,并对N步的每个值继续这样做。该算法应返回一个向量,其元素的形式为StarterValue u ^ i d ^ {N-i} i = 0,\ dots,N 我提出的简单算法是
rata<-function(N,r,u,d,S){
length(x)<-N
for(i in 0:N){
x[i]<-S*u^{i}*d^{N-i}
}
return(x)
}
N是周期数,其余只是非重要值(u表示向上d表示向下等)
为了提取我的结果,我需要制作生成的向量的对数的直方图,以证明它们是正态分布的。但是当我输入hist(x)
时,对于N = 100000(我需要大量的步骤来证明收敛),我得到了error :(invalid number of breaks)
谁能帮忙?提前致谢。
一个例子
taf<-rata(100000,1,1.1,0.9,1)
taf1<-log(taf)
hist(taf1,xlim=c(-400,400))
答案 0 :(得分:3)
首先我修复你的功能:
rata<-function(N,r,u,d,S){
x <- numeric(N+1)
for(i in 0:N){
x[i]<-S*u^{i}*d^{N-i}
}
return(x)
}
或依赖矢量化:
rata<-function(N,r,u,d,S){
x<-S*u^{0:N}*d^{N-(0:N)}
return(x)
}
taf<-rata(100000,1,1.1,0.9,1)
查看结果,我们注意到它包含NaN
值:
taf[7440 + 7:8]
#[1] 0 NaN
发生什么事了?显然乘法变为NaN
:
1.1^7448*0.9^(1e5-7448)
#[1] NaN
1.1^7448
#[1] Inf
0.9^(1e5-7448)
#[1] 0
Inf * 0
#[1] NaN
为什么会出现Inf
值?好吧,因为双重溢出(读help("double")
):
1.1^(7440 + 7:8)
#[1] 1.783719e+308 Inf
当乘法器接近0(读help(".Machine")
)时,浮点精度存在类似问题。
您可能需要使用任意精确数字。