Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用Ramajunam方程估计1/pi的值,与(1/math.pi)比较时返回错误值_Python 3.x - Fatal编程技术网

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的结果之和,那么:

  • 让用户输入一个变量
    limit
    ,而不是k

  • 从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值是错误的。如果您找到了解决方案,请告诉我(很好-有些进展:)。您是否可以编辑问题以添加更新的代码。我已使用更新的代码回答问题,以跟踪我在回答问题过程中犯下的错误。我已使用更新的代码编辑问题。谢谢你帮我理解这个等式。