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对此类任务中的大整数没有问题。另一方面,浮点是……浮点——精度和数学计算的垃圾。谢谢,但我还是得到了同样的答案回答者:(谢谢,但是他们问的是相同的答案谢谢,但是他们问的是相同的答案也许一些解释是正确的?也许一些解释是正确的?