2016-05-04 51 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