what is the problem of my code doing inverse Poisson cumulative distribution?
1 次查看(过去 30 天)
显示 更早的评论
Dear friends,
I write a code doing inverse Poisson cumulative distribution. However, the code get same results compared to icdf function when u>0.5. When u<0.5, the result is 1 less than the result from icdf.
function m = iPoisson(lambda,u)
p(1)=exp(-lambda)/factorial(0);
absolute=zeros(1,1000);
summation=p(1);
%u=0.6322;
%u=rand(1);
for k=2:1000
p(k)=lambda.^(k-1)*exp(-lambda)./factorial(k-1);
summation=summation+p(k);
distance(k-1)=abs(summation-u);
[a,b]=min(distance);
m=b;
end
end
2 个评论
Torsten
2022-10-18
Use a while-loop instead of a for loop for which you don't know when to stop it (do you know how large factorial(1000) is ?) .
采纳的回答
Torsten
2022-10-18
编辑:Torsten
2022-10-18
lambda = 10;
u = 0.6;
m = iPoisson(lambda,u)
m1 = icdf('Poisson',u,lambda)
function m = iPoisson(lambda,u)
if u == 1
m = Inf;
return
end
s = 1;
m = 0;
quot = 1;
while s*exp(-lambda) < u
m = m + 1;
quot = quot*lambda/m;
s = s + quot;
end
end
3 个评论
Torsten
2022-10-19
You search for the first value m for which
exp(-lambda) * sum_{i=0}^{i=m} lambda^i/factorial(i) >= u.
Since
s(k) = sum_{i=0}^{i=k} lambda^i/factorial(i)
is increasing with k, you need to add the terms
quot(i) = lambda^i / factorial(i)
by writing
s = s + quot
as long as
exp(-lambda)*s(k) < u.
If
exp(-lambda)*s(k) >= u
for the first time, then
m = k-1
Since
quot(i) = lambda/i * quot(i-1)
with
quot(0) = 1
you can update
quot = quot * lambda/i
with an initial value for quot
quot = 1
and you do not need to recalculate
quot = lambda^i / factorial(i)
for every value of i. Moreover, the simple update
quot = quot * lambda/i
prevents overflow in numerator and/or denominator since lambda^i and factorial(i) both can become very large.
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!