Python 3.x 使用Ramajunam方程估计1/pi的值,与(1/math.pi)比较时返回错误值
为更新的代码进行编辑 @拉克曼。我爱你,男人。您不仅帮助我改进了代码,还帮助我理解了等式。谢谢你抽出时间Python 3.x 使用Ramajunam方程估计1/pi的值,与(1/math.pi)比较时返回错误值,python-3.x,Python 3.x,为更新的代码进行编辑 @拉克曼。我爱你,男人。您不仅帮助我改进了代码,还帮助我理解了等式。谢谢你抽出时间 import math # performing ramanujan's infinite series to #generate a numerical approximation of 1/pi: """ 1/pi = (2*sqrt(2))/9801) * (4*k)!*(1103+26390k)/(((k!)**4)*396**(4k)))""" def factorial_1(
import math
# performing ramanujan's infinite series to
#generate a numerical approximation of 1/pi:
""" 1/pi = (2*sqrt(2))/9801) * (4*k)!*(1103+26390k)/(((k!)**4)*396**(4k)))"""
def factorial_1(k):
if k==0:
return 1
else:
result = k* factorial_1(k-1)
return result
def estimate_pi():
k=0
total=0
n=(2*math.sqrt(2)/9801)
limit=int(input("Enter the ending limit = ")) #k=0 until limit=infinity!!!!
while True:
m=factorial_1(4*k)*(1103+26390*k)
o=((factorial_1(k))**4)*(396**(4*k))
result=n*(m/o)
total+=result #assigning result to a new variable to keep track of changes
if k>limit:
break
k+=1 #updating value of k, to improve result & total for each loop.
return 1/total # Return's pi=3.14 only if k=0
print(estimate_pi())
声明:
k = result
问题是-变量k不能既是循环计数器又是运行总数
与该语句不同的是,您需要简单地递减k,并将result
添加到一个新的正在运行的total变量中,该变量在循环外初始化为0
您也只希望打印结果,并仅在循环完成后返回
编辑以添加:
请不要以那种方式使用答案;这不是他们的目的,其他读者可能会感到困惑。问题是包含定义问题的所有(正在进行的)步骤(只需将附加的更新标记为“EDIT TO ADD”(编辑添加),就像我对此评论所做的那样);答案是解决这个问题的方法,如果它们被证明是有用的,就会被接受
Ramanujan的公式肯定适用于增加k的值,但必须从0开始迭代
例如,假设用户为k输入5
您的代码目前正在做的是增加k-因此计算k=5,6,7。。。。。当步骤的结果为0时终止。你错过了k=0,1,2,3,4-主要术语
您要做的是求k=0,1,2,3,4,5的结果之和,那么:
- 让用户输入一个变量
,而不是klimit
- 从0开始k,并在每次迭代时递增
- 当步骤的结果
k>limit
顺便说一句,
n=(2*math.sqrt(2)/9801)
是一个常数,因此可以跳出循环,因此只能计算一次。@racraman。我把更新后的代码作为一个答案,这样我就可以跟踪我所犯的错误,以备将来参考。谢谢你的帮助
# performing ramanujan's infinite series to
#generate a numerical approximation of 1/pi:
""" 1/pi = (2*sqrt(2))/9801) * (4*k)!*(1103+26390k)/(((k!)**4)*396**(4k)))"""
def factorial_1(k):
if k==0:
return 1
else:
result = k* factorial_1(k-1)
return result
def estimate_pi():
k=int(input("enter the value of k = "))
total=0
while True:
n=(2*math.sqrt(2)/9801)
m=factorial_1(4*k)*(1103+26390*k)
o=((factorial_1(k))**4)*(396**(4*k))
result=n*(m/o)
total+=result #assigning result to a new variable to keep track of changes
epsilon=1e-15
if abs(result)<epsilon:
break
k+=1 #updating value of k, to improve result & total for each loop.
return 1/total # Return's pi=3.14 only if k=0
print(estimate_pi())
#在
#生成1/pi的数值近似值:
“1/pi=(2*sqrt(2))/9801)*(4*k)!*(1103+26390k)/((k!)**4)*396**(4k))”
def阶乘_1(k):
如果k==0:
返回1
其他:
结果=k*阶乘_1(k-1)
返回结果
def估算值_pi():
k=int(输入(“输入k=”的值)
总数=0
尽管如此:
n=(2*数学sqrt(2)/9801)
m=阶乘_1(4*k)*(1103+26390*k)
o=((阶乘1(k))**4)*(396**(4*k))
结果=n*(m/o)
总计+=结果#将结果分配给新变量以跟踪更改
ε=1e-15
如果abs(结果)感谢帮助很大。已开始使用'total=0'将结果分配给。加上,我们注意到这个方程只适用于k=0。对于K的其他值,pi值是错误的。如果您找到了解决方案,请告诉我(很好-有些进展:)。您是否可以编辑问题以添加更新的代码。我已使用更新的代码回答问题,以跟踪我在回答问题过程中犯下的错误。我已使用更新的代码编辑问题。谢谢你帮我理解这个等式。