2015-03-31 64 views
1

傢伙,我正在努力解決這個方程使用python使用Python來計算長序列

Equation

我們需要找到什麼是值N針對該方程給出2.718的結果。 我做了到現在爲止,具有小數的問題,是這樣的:

import math 
from decimal import Decimal 
import scipy.misc 

limit = 2.718 
ris = 0 
n = 1 
while ris <= limit: 
    ris = Decimal(n/math.pow(scipy.misc.factorial(n), 1/n)) 
    n= n + 1 

    print(n,ris) 

的主要問題是,在某個點它開始只是打印零,我不知道,但如果仍沒有計算再次顯示結果或墜毀。

任何想法解決這個問題?

+1

'scipy.misc.factorial(171)'是無窮大,所以'N/scipy.misc.factorial(171)'是零。也許你可以使用不同的階乘函數來解決問題。 – syntonym 2015-03-31 11:46:50

回答

3

該解決方案使用的功率運算符**比pow稍快,因爲它沒有函數加載和調用的開銷。

import math 
from decimal import Decimal 

limit = Decimal(2.718) 

result = 0 
n = Decimal(1) 
one = Decimal(1) 
n_factor = Decimal(n) 

while result <= limit: 
    result = n/Decimal(n_factor ** (one/n)) 
    n += 1 
    n_factor *= n 
    # print (n, result) # uncomment to see intermediate results 

print ('Final', n, result) 

注:這是不是最佳的,但至少它會計算N個

注2:見一下有關「SciPy的」問題的情況說明如下意見和零

+0

不是'math.pow'是問題,而是'scipy.misc.factorial',它將返回'array(inf)'爲171. – syntonym 2015-03-31 11:53:00

+0

誰投了票,請解釋。我寫的代碼會給你答案,即使它不使用'scipy'庫。 – 2015-03-31 12:14:07

+2

@syntonym:蒂姆的解決方案將工作,你的建議不會。雖然'scipy.misc.factorial'是* a *問題,它不是* only *問題。如果將一個給出正確階乘的函數替換爲一個整數,那麼當它試圖將其轉換爲浮點並且溢出時,您只會在pow計算中得到一個錯誤; 'math.pow'(和帶浮點指數的'**')是問題的一部分。也就是說,Tim的解釋是錯誤的 - 你的問題不是指數太小,而是基數太大。無論哪種方式,使用'Decimal'解決問題。 – 2015-03-31 13:24:47

3

有趣的答案Tim Rijavec和合成詞。這是一些進一步的想法。

由於syntonym建議,問題是,對於n = 171scipy.misc.factorial回報array(inf)。這是因爲當你調用沒有附加參數的函數時,它返回一個浮點數。因此,它返回準確的整數值,你可以將其設置:

>>> scipy.misc.factorial(171) 
array(inf) 
>>> scipy.misc.factorial(171, exact = True) 
1241018070217667823424840524103103992616605577501693185388951803611996075221691752992751978120487585576464959501670387052809889858690710767331242032218484364310473577889968548278290754541561964852153468318044293239598173696899657235903947616152278558180061176365108428800000000000000000000000000000000000000000 
>>> 

所以,如果你重寫程序正是如此,你不會得到一個錯誤:

from decimal import Decimal 
import scipy.misc 

limit = Decimal(2.718) 

ris = 0 
n = 1 
one = Decimal(1) 

while ris <= limit: 
    ris = n/Decimal(scipy.misc.factorial(n, exact= True) ** (one/n)) 
    n= n + 1 

    print(n,ris) 

但由於某些原因,它是效率低下,需要一段時間才能完成。在這樣的情況下,你可能會想,條件緩和:

while abs(ris - limit) > 0.025: 
    ris = n/Decimal(scipy.misc.factorial(n, exact= True) ** (one/n)) 
    n= n + 1 
+0

由於計算階乘因子可能很慢。蒂姆斯的答案每次迭代只能乘以一次,而在你的答案中,必須從頭開始每次計算階乘。 – syntonym 2015-03-31 18:34:53