2015-03-31 48 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