2

首先,这就是问题所在。

数学常数 π (pi) 是一个无理数,其值约为 3.1415928... π 的精确值等于以下无穷和:π = 4/1 - 4/3 + 4/5 - 4/7 + 4 /9 - 4/11 + ... 我们可以通过计算前几项的总和来得到 π 的一个很好的近似值。编写一个函数 approxPi(),将浮点值误差作为参数,并通过逐项计算上述总和,直到当前总和与前一个总和之间的差值的绝对值(用少一项)不大于误差。一旦函数发现差值小于误差,它应该返回新的和。请注意,此函数不应使用数学模块中的任何函数或常量。您应该使用所描述的算法来近似 π,

如果有人能帮助我理解问题所在,我将不胜感激,因为我已经阅读了很多次,但仍然无法完全理解它在说什么。我翻阅了我的教科书,发现使用 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 和 approxPi(0.05) = 3.1659792728432157

同样,任何帮助将不胜感激。我只想了解我在这方面做错了什么。

4

3 回答 3

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
于 2013-02-10T23:24:52.813 回答
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:

因为当前值越过目标值,大一小,所以误差一正,一负。

于 2013-02-10T23:22:09.993 回答
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)
于 2013-02-10T23:45:56.800 回答