使用pertubation

时间:2016-05-04 18:56:53

标签: matlab simulation numerical-methods

对于某些模拟,我需要使用指数函数的近似值。现在,我遇到的问题是:

function s=expone(N,k)
s=0
for j=1:k
    s=s+(exp(-N+j*log(N)-log(factorial(j))));
end
end

非常稳定,从某种意义上来说,对于足够大的k,它几乎是1。但是,只要N大于200,它就会迅速降至零。我怎么能改进呢,我需要大N.我无法真正改变数学写这个的原因,因为我有一个额外的插曲,我的最终代码看起来有些谎言:

function s=expone(N,k)
s=0
for j=1:k
    s=s+(exp(-N+j*log(N)-log(factorial(j))))*pertubation(N,k);
end
end

摄影在0和1之间,所以没有问题,但是前因子似乎不适用于N> 200。有人可以帮忙吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

函数log(x) - x有正负部分 Graphic in Wolframalpha

而x - log(x!)对于x> = 0是负的 Graphic in Wolframalpha

因此当(N - log(N))远大于(j - log(j))时出现问题。所以解决方案是选择比N大得多的j。 Exp(负)倾向于零

例如expone(20,1)= 7.1907e-05但是expone(20,20)= 0.5591并且expone(20,50)= 1.000

作为结论,如果你想使用N大,j应该更大,作为一个额外的提示你可能想要改变你的功能,以避免循环:

function s = expone(N,k)
j = 1:k;
s = sum ((exp(-N+j*log(N)-log(factorial(j)))));
end