Python 主题5

Python 主题5,python,pi,Python,Pi,编写一个函数estimatePi(),根据印度数学家Srinivasa Ramanujan发现的公式估算并返回Pi的值。它应该使用while循环来计算求和项,直到最后一项小于1e-15。估算Pi的公式如下所示: 根据Ramanujam的估计 (很抱歉,我无法上传图像) def estimatePi(): 输入数学 def阶乘(n): 如果n==0: 返回1 其他: 返回n*阶乘(n-1) k=0 最终=0 pi=0 而pi你的答案是正确的。浮点数特别适用于小数点后的大量数字;当计算非精确值时 您

编写一个函数
estimatePi()
,根据印度数学家Srinivasa Ramanujan发现的公式估算并返回Pi的值。它应该使用while循环来计算求和项,直到最后一项小于1e-15。估算Pi的公式如下所示: 根据Ramanujam的估计

(很抱歉,我无法上传图像)

def estimatePi():
输入数学
def阶乘(n):
如果n==0:
返回1
其他:
返回n*阶乘(n-1)
k=0
最终=0
pi=0

而pi你的答案是正确的。浮点数特别适用于小数点后的大量数字;当计算非精确值时


您可以从您的答案中看出,它正确估计了小数点后5位的pi值。

您的答案是正确的。浮点数特别适用于小数点后的大量数字;当计算非精确值时

import math
def factorial(n):
if n == 0:
    return 1
else:
    return n * factorial(n-1)
def series_term(k):
a=factorial(4*k)
b=(1103+26390*k)
c=factorial(k)
d=c**4
e=396**(4*k)
return float(a*b)/(d*e)
def estimatePi():
k=0
final=0
while True:
    term = series_term(k)
    final += term
    if term < 1.0e-15:
        break
    else:
        k += 1
f=2*math.sqrt(2)/9801 
pi = 1.0/(final * f)
return pi
从您的答案中可以看出,它正确估计了小数点后5位的pi值。

import math
import math
def factorial(n):
if n == 0:
    return 1
else:
    return n * factorial(n-1)
def series_term(k):
a=factorial(4*k)
b=(1103+26390*k)
c=factorial(k)
d=c**4
e=396**(4*k)
return float(a*b)/(d*e)
def estimatePi():
k=0
final=0
while True:
    term = series_term(k)
    final += term
    if term < 1.0e-15:
        break
    else:
        k += 1
f=2*math.sqrt(2)/9801 
pi = 1.0/(final * f)
return pi
def阶乘(n): 如果n==0: 返回1 其他: 返回n*阶乘(n-1) def系列_术语(k): a=阶乘(4*k) b=(1103+26390*k) c=阶乘(k) d=c**4 e=396**(4*k) 返回浮动(a*b)/(d*e) def estimatePi(): k=0 最终=0 尽管如此: 术语=系列\术语(k) 期末+=学期 如果术语<1.0e-15: 打破 其他: k+=1 f=2*数学sqrt(2)/9801 pi=1.0/(最终*f) 返回pi
导入数学
def阶乘(n):
如果n==0:
返回1
其他:
返回n*阶乘(n-1)
def系列_术语(k):
a=阶乘(4*k)
b=(1103+26390*k)
c=阶乘(k)
d=c**4
e=396**(4*k)
返回浮动(a*b)/(d*e)
def estimatePi():
k=0
最终=0
尽管如此:
术语=系列\术语(k)
期末+=学期
如果术语<1.0e-15:
打破
其他:
k+=1
f=2*数学sqrt(2)/9801
pi=1.0/(最终*f)
返回pi

你遇到的问题不是你的代码,而是你对问题的理解。问题是:

它应该使用while循环来计算求和项,直到最后一项小于1e-15


使变量等于1,将while循环的条件更改为:
while variable>=1e-15:
,并在while循环中,将变量设置为等于求和的最后一项。这将为您提供更准确的值。值得一提的是,这生成了正确的值,但是
pyschools
仍然没有通过我的代码。

您遇到的问题不是您的代码,而是您对所问问题的理解。问题是:

它应该使用while循环来计算求和项,直到最后一项小于1e-15


使变量等于1,将while循环的条件更改为:
while variable>=1e-15:
,并在while循环中,将变量设置为等于求和的最后一项。这将为您提供更准确的值。值得一提的是,这生成了正确的值,但是
pyschools
仍然没有通过我的代码。

我的朋友,您的代码有两个问题。 首先,在您的代码中,请记住变量pi的任何形状或形式都不等于final。您正在计算一个不会迭代的while循环,因为pi显然比1e-15大。简单地说,您的代码只是在k=0时计算公式,然后停止。 因此,这里有一种可能的方法:

    def estimatePi():
        import math
        def factorial(n):
            if n == 0:
                return 1
            else:
                return math.factorial(n)
        k=1  # we want it at k=1 not 0 since we already have k=0 as Final
        Final=0.31830987844  #this is the value at k=0, the first value
        while Final>1e-15:   """ Note that 1e-15 is the limiting value and we want all b values that are less than 1e-15. k=2 is the final k value where b has the last smaller number than 1e-15.""" 

            b=(2*math.sqrt(2)/9801)*(factorial(4*k)*(1103+26390*k))/((factorial(k)**4)*(396**(4*k)))

            Final=Final+b
            k=k+1
            return 1/Final
   print estimatePi()
#This gives you the number you are looking for ---3.14159265359.

我的朋友,你的代码有几处问题。 首先,在您的代码中,请记住变量pi的任何形状或形式都不等于final。您正在计算一个不会迭代的while循环,因为pi显然比1e-15大。简单地说,您的代码只是在k=0时计算公式,然后停止。 因此,这里有一种可能的方法:

    def estimatePi():
        import math
        def factorial(n):
            if n == 0:
                return 1
            else:
                return math.factorial(n)
        k=1  # we want it at k=1 not 0 since we already have k=0 as Final
        Final=0.31830987844  #this is the value at k=0, the first value
        while Final>1e-15:   """ Note that 1e-15 is the limiting value and we want all b values that are less than 1e-15. k=2 is the final k value where b has the last smaller number than 1e-15.""" 

            b=(2*math.sqrt(2)/9801)*(factorial(4*k)*(1103+26390*k))/((factorial(k)**4)*(396**(4*k)))

            Final=Final+b
            k=k+1
            return 1/Final
   print estimatePi()
#This gives you the number you are looking for ---3.14159265359.

这是我的密码。它返回与所需结果相同的结果:

    import math
    def factorial(n): 
        if n == 0:
            return 1
        else:
            return n * factorial(n-1) 
    def estimatePi():
        f=2*math.sqrt(2)/9801
        k=0
        RHS = 0
        while True:
            num = factorial(4*k)*(1103+26390*k)
            den = (factorial(k))**4 * 396**(4*k)
            a = f*num/den
            RHS += a
            if a < 1e-15: break 
            k+=1
        return 1/RHS
导入数学
def阶乘(n):
如果n==0:
返回1
其他:
返回n*阶乘(n-1)
def estimatePi():
f=2*数学sqrt(2)/9801
k=0
RHS=0
尽管如此:
num=阶乘(4*k)*(1103+26390*k)
den=(阶乘(k))**4*396**(4*k)
a=f*num/den
RHS+=a
如果a<1e-15:断开
k+=1
返回1/RHS

这是我的代码。它返回与所需结果相同的结果:

    import math
    def factorial(n): 
        if n == 0:
            return 1
        else:
            return n * factorial(n-1) 
    def estimatePi():
        f=2*math.sqrt(2)/9801
        k=0
        RHS = 0
        while True:
            num = factorial(4*k)*(1103+26390*k)
            den = (factorial(k))**4 * 396**(4*k)
            a = f*num/den
            RHS += a
            if a < 1e-15: break 
            k+=1
        return 1/RHS
导入数学
def阶乘(n):
如果n==0:
返回1
其他:
返回n*阶乘(n-1)
def estimatePi():
f=2*数学sqrt(2)/9801
k=0
RHS=0
尽管如此:
num=阶乘(4*k)*(1103+26390*k)
den=(阶乘(k))**4*396**(4*k)
a=f*num/den
RHS+=a
如果a<1e-15:断开
k+=1
返回1/RHS

您可以使用一个
math.factorial()
函数。此外,我建议您使用整数进行计算,并尽可能长时间地延迟到浮点的转换——对于此类任务,Python对大整数没有问题。另一方面,浮点是。。。浮点——精度和数学计算的垃圾。谢谢,但我还是得到了同样的答案:(这里有一个
math.factorial()
您可以使用的函数。此外,我建议您使用整数进行计算,并尽可能推迟到浮点的转换——Python对此类任务中的大整数没有问题。另一方面,浮点是……浮点——精度和数学计算的垃圾。谢谢,但我还是得到了同样的答案回答者:(谢谢,但是他们问的是相同的答案谢谢,但是他们问的是相同的答案也许一些解释是正确的?也许一些解释是正确的?