2016-05-04 31 views
0

对于一些模拟,我需要利用指数函数的近似值。现在,我有的问题是:模拟指数函数的摄动

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

是一个非常稳定的,从某种意义上说,它几乎是足够大的k。但是,一旦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之间1,所以这没有问题,但prefactor似乎不适用于N> 200。谁能帮忙? 非常感谢!

+1

近似的目的是什么,而不是使用指数函数本身? “对于k足够大的几乎是1”是什么意思?一个指数不应该等于1,是吗? “快速下降到零”意味着什么:当进一步增加'N'或增加'k'时?你对你的期望是什么? – tvo

+0

它应该是pertubation(N,j)而不是pertubation(N,k)吗? – dmuir

+0

是的,谢谢指出我们! – Liealgebrabach

回答

1

的函数log(X) - x具有正和负部分 Graphic in Wolframalpha

而X - 日志(!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 
+0

非常感谢您的回复!只有两个问题:当我使用你的代码,并且我想绘制它(我的意思是一个向量,改变N),我只是得到一个不断的情节,似乎并没有处理这个向量。其次,当j非常大时,你会建议我开始求和,所以j >> N? – Liealgebrabach

+0

我还发现,使用斯特林公式有助于,因为大量的因素分解... – Liealgebrabach

+0

是的,我尝试了斯特林公式,它更加稳定。另一方面,通过使用arrayfun或for循环,代码可以被向量使用 – daleonpz