提问人:Emilio Velazquez 提问时间:7/27/2023 最后编辑:BarmarEmilio Velazquez 更新时间:7/27/2023 访问量:62
近似 Pi 的 Python 函数
Python Functions Approximating Pi
问:
我是 python 课程免费入门课程的一部分 saylor.org 我在他们的第 5 单元测验中遇到了一个问题:
图像中附加的说明:
我能够获得基本代码,但我无法找到在它要求的 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
答:
1赞
Barmar
7/27/2023
#1
您每次都通过循环重新分配。但是公式说你必须将序列中的每个元素相乘,所以用乘法重新分配变量。V
V *=
你不能把作业放在一边。这不会赋值变量,而是用作命名函数参数。如果要查看变量的值,请在赋值后放置。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.pi
N >= 100
aprox_pi(20)
# 3.1415926535886185
关于样式的一个小说明:运算符创建一个布尔值,因此您可以返回该值:<
而不是:
if x < 1e-7:
return True
else:
return False
只需返回:
return x < 1e-7
上一个:在 r 中快速扩展系列。
评论
print()