近似 Pi 的 Python 函数

Python Functions Approximating Pi

提问人:Emilio Velazquez 提问时间:7/27/2023 最后编辑:BarmarEmilio Velazquez 更新时间:7/27/2023 访问量:62

问:

我是 python 课程免费入门课程的一部分 saylor.org 我在他们的第 5 单元测验中遇到了一个问题:

图像中附加的说明:

enter image description here

我能够获得基本代码,但我无法找到在它要求的 for 循环中添加 (√2+) 的方法。

这是我拥有的代码:

import math
def pi_approx(N):
    for i in range(N):
        print(V=(math.sqrt(2)/2)*N(math.sqrt(2)+math.sqrt(2))/2)
    pi_est=2/V
    x=math.fabs(pi_est-math.pi)
    if x < 1e-7:
        return True
    else:
        return False

预期结果:True

python 函数 for-loop math pi

评论

0赞 Barmar 7/27/2023
你不应该有你的变量赋值。print()
1赞 John Gordon 7/27/2023
事实上,这不是一个错误吗?我什至不明白这段代码是如何运行的......
0赞 Emilio Velazquez 7/27/2023
@barmar,我在变量赋值周围打印了出来,以测试我得到的输出是什么,但在发布这个我的坏之前忘记把它取下来

答:

1赞 Barmar 7/27/2023 #1

您每次都通过循环重新分配。但是公式说你必须将序列中的每个元素相乘,所以用乘法重新分配变量。VV *=

你不能把作业放在一边。这不会赋值变量,而是用作命名函数参数。如果要查看变量的值,请在赋值放置。print()V=print(V)

您没有执行所需的所有嵌套平方根。在除以 2 之前,您需要一个嵌套循环来计算每个项中重复的平方根。

import math

def pi_approx(N):
    V = 1
    for i in range(1, N):
        radical = 0
        for j in range(i):
            radical = math.sqrt(2 + radical)
        V *= radical / 2
    pi_est=2/V
    print(pi_est)
    x=math.fabs(pi_est-math.pi)
    if x < 1e-7:
        return True
    else:
        return False

print(pi_approx(20))

评论

2赞 Mark 7/27/2023
如果你在外循环的迭代之间保持根式,你似乎不需要内 for 循环。
0赞 Barmar 7/27/2023
我有一种感觉,我错过了一段关系。
1赞 Barmar 7/27/2023
我会支持你的答案,而不是修改我的答案。
1赞 Mark 7/27/2023 #2

有用的见解是,在每次迭代中,您可以使用旧分子来计算新分子:

next_numerator = math.sqrt(2 + old_numerator)

如果将分子和运行乘积保留为单独的值,则可以在单个循环中完成整个计算:

import math

def aprox_pi(n):
    numerator = math.sqrt(2)
    prod = numerator / 2
    
    for _ in range(1,n):
        numerator = math.sqrt(2 + numerator)
        prod *= numerator / 2
    
    return 2 / prod


assert aprox_pi(1) == 2 / (math.sqrt(2) / 2) 
assert aprox_pi(2) == 2 / ((math.sqrt(2) / 2) * (math.sqrt(2 + math.sqrt(2)) / 2)) 
assert aprox_pi(3) == 2 / ((math.sqrt(2) / 2) * (math.sqrt(2 + math.sqrt(2)) / 2) * (math.sqrt(2 + math.sqrt(2 + math.sqrt(2)))) / 2)
# etc

这样,您应该能够插入测试以确定近似值和 之间的增量。它似乎在math.piN >= 100

aprox_pi(20)
# 3.1415926535886185

关于样式的一个小说明:运算符创建一个布尔值,因此您可以返回该值:<

而不是:

if x < 1e-7:
    return True
else:
    return False

只需返回:

return x < 1e-7