我试图用lambda = 100绘制泊松分布,但是当λ值很高时,部分分布被切断了,我无法弄清楚原因。
set xrange [ 0: 150]
lambda = 100
poisson(x) = lambda**x / int(x)! * exp(-lambda)
plot poisson(x) with boxes
答案 0 :(得分:1)
要修复的第一件事,使用上面的代码,您是否注意到即使lambda = 10也不会产生正确的结果。这个问题与gnuplot的函数默认采样有关。它是100.您想要绘制151点(0到150,整数值)。因此,虽然你对factorial使用int()函数,但lambda ** x并没有给你正确的结果。首先将采样设置为您想要的点数:
set sample 151
gnuplot的部门似乎有一个错误。如果你只是print poisson(88)
,你会得到NaN。但是,您可以print 100**88
获取1e+176
,然后print 88!
获取1.85482642257398e+134
。但是如果你print 1e+176 / 1.85482642257398e+134
获得inf.0
。这不应该发生,因为这里没有溢出。
通过使用log(lambda ** x)和log(int(x)!)并使用logarithms属性将所有内容放入exp()函数,我可以正常工作。这消除了除法和乘法中的疯狂大数。尝试:
set xrange [ 0: 150]
set sample 151
lambda = 100
poisson(x) = exp(log(lambda**x) - log(int(x)!) - lambda)
plot poisson(x) with boxes