Python 误差内近似pi

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

首先,这就是问题所在

数学常数π(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和approxPi(0.05)=3.165979272843257


再次感谢您的帮助。我只想了解我在这方面做错了什么。

有几个问题:

A)
i=i+-2
不做你想做的事,不确定是什么

正确的代码应该是(有很多方法):

应该是:

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:

因为当前值超出了目标值,一个值大一个小,所以一个错误为正,一个错误为负。

如果您试图使用该系列近似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
我是这样做的:

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)

第一:您是否意识到浮点数固有的不精确性?Python2.x还是3.x?它改变了除法的行为。我正在运行的是Python 3.3,我知道浮点数非常不准确,但这正是我被要求使用的。无论何时编写
1
4
或诸如此类的内容,除非您只希望它是一个整数值而不是一个浮点,否则请将其写成
1.0
4.0
,etcI刚刚试过这个,但我没有得到例子说我应该得到的答案。近似值μpi(0.5)最终为3.2523659347188767,而不是3.3396825396825403。我还真的不明白节目里发生了什么。我真的很困惑。@Ikyraki:现在试试。我添加了一些评论,但如果有任何部分不合理,请告诉我。现在它工作得很好,谢谢。我想我现在明白了它是如何工作的,但是(如果这不是一个愚蠢的问题)你是如何知道该怎么做的?我真的没有想到第n项函数对程序本身有帮助。当我尝试I=I+-2部分时,我认为它会交替顺序(因此4/1-4/3+4/5),但显然不是。我也不知道应该把这些更改放在哪里,因为无论我放在哪里,我都会得到一个错误,即变量在赋值之前被引用。@Ikyraki:交替的想法很酷,但是系统如何确切地知道何时添加和何时删除?最好用一个变量,你不觉得吗?关于新错误,请重新阅读代码:在为变量赋值之前,不能使用变量。
>>> approximate_pi(0.000001)
    3.1415929035895926
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)