首先,这就是问题所在。
数学常数π(pi)是一个无理数,其值约为3.1415928 ...π的精确值等于下面的无穷和:π= 4/1 - 4/3 + 4/5 - 4 / 7 + 4/9 - 4/11 + ...我们可以通过计算前几个项的总和来得到π的良好近似值。编写一个函数approxPi(),它将浮点值误差作为参数,并通过计算上述和,逐项计算得出误差内的常数π,直到当前总和与前一个总和之差的绝对值(与少一个条款)不大于错误。一旦函数发现差异小于错误,它应该返回新的总和。请注意,此函数不应使用数学模块中的任何函数或常量。您应该使用所描述的算法来逼近π,而不是使用Python中的内置值。
如果有人能帮助我理解问题所在,我真的很感激,因为我已经阅读了很多次,但仍然无法完全理解它的含义。我查看了我的教科书,发现了一个类似的问题,使用e的无限和来逼近e:1/0! + 1/1! + 1/2! + 1/3!+ ...
def approxE(error):
import math
'returns approximation of e within error'
prev = 1 # approximation 0
current = 2 # approximation 1
i = 2 # index of next approximation
while current-prev > error:
#while difference between current and previous
#approximation is too large
#current approximation
prev = current #becomes previous
#compute new approximation
current = prev + 1/math.factorial(i) # based on index i
i += 1 #index of next approximation
return current
在此之后我试图对我的程序进行建模,但我觉得我没有接近解决方案。
def approxPi(error):
'float ==> float, returns approximation of pi within error'
#π = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
prev = 4 # 4/1 = 4 : approx 0
current = 2.6666 # 4/1 - 4/3 = 2.6666 : approx 1
i = 5 # index of next approx is 5
while current-prev > error:
prev = current
current = prev +- 1/i
i = i +- 2
return current
成功的程序应该返回
approxPi(0.5)= 3.3396825396825403 and approxPi(0.05)= 3.1659792728432157
再次,任何帮助将不胜感激。我想了解我在这方面做错了什么。
答案 0 :(得分:3)
如果您尝试使用该系列来尝试近似pi,请先写出几个术语:
π = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
0 1 2 3 4 5 ...
然后编写一个返回该系列第n个术语的函数:
def nth_term(n):
return 4 / (2.0 * n + 1) * (-1) ** n
从那里开始,代码非常通用:
def approximate_pi(error):
prev = nth_term(0) # First term
current = nth_term(0) + nth_term(1) # First + second terms
n = 2 # Starts at third term
while abs(prev - current) > error:
prev = current
current += nth_term(n)
n += 1
return current
这似乎对我有用:
>>> approximate_pi(0.000001)
3.1415929035895926
答案 1 :(得分:1)
有几个问题:
A)i = i +- 2
不按你的想法行事,不确定它是什么。
正确的代码应该是(有很多方法):
if i < 0:
i = -(i-2)
else:
i = -(i+2)
同样适用于:
current = prev +- 1/i
应该是:
current = prev + 4.0/i
或者某种东西,取决于i
中存储的确切内容。谨防!在python2中,除非您从以后导入新分部,否则您必须键入4.0
,而不仅仅是4
。
我个人更喜欢变量,除数的绝对值和符号,以便每次迭代:
current = current + sign * 4 / d
d += 2
sign *= -1
那好多了!
B)循环的结束应该检查错误的绝对值:
类似的东西:
while abs(current-prev) > error:
因为当前值跳过目标值,一个值更大,一个更小,所以一个误差为正,一个为负。
答案 2 :(得分:1)
我是这样做的:
def approxPi(error):
# pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ...
value = 0.0
term = 1.0e6
i = 1
sign = 1
while fabs(term) > error:
term = sign/i
value += term
sign *= -1
i += 2
return 4.0*value
print approxPi(1.0e-5)