Python 近似值π;通过计算前几个项的和

Python 近似值π;通过计算前几个项的和,python,pi,Python,Pi,常数π是一个无理数,其值约为3.1415928。π的精确值等于这个无穷和:π=4/1−4/3+4/5−4/7+4/9−4/11+…通过计算前几个项的和,我们可以得到π的良好近似值。编写一个函数approxPi(),该函数将浮点值误差作为输入,并通过逐项计算前一个和来近似误差内的常数π,直到当前和与前一个和(少一个项)之间的差值不大于误差。函数应该返回新的和。(提示:π1=4/1;π3=4-4/3;π5=4-4/3+4/5;…πi=πi-2+sign*4/i,其中sign=-1或1) approx

常数π是一个无理数,其值约为3.1415928。π的精确值等于这个无穷和:π=4/1−4/3+4/5−4/7+4/9−4/11+…通过计算前几个项的和,我们可以得到π的良好近似值。编写一个函数approxPi(),该函数将浮点值误差作为输入,并通过逐项计算前一个和来近似误差内的常数π,直到当前和与前一个和(少一个项)之间的差值不大于误差。函数应该返回新的和。(提示:π1=4/1;π3=4-4/3;π5=4-4/3+4/5;…πi=πi-2+sign*4/i,其中sign=-1或1) approxPi(0.01)3.146567471829556 approxPi(0.0000001)3.1415927035898146 我的密码是

def approxPi(num): 
prev=1
current=2
i=1
while current-prev>num:
    prev=current
    current+= 4-(4/i)
    i += 1
return current

不过,这只给了我2条建议,任何建议都会有所帮助。

您的代码的更正版本如下所示

def approxPi(num): 
prev=1
current=2
i=1
sign = 1;
while abs(current-prev)>num:
    prev=current
    current+= sign * (4/i)
    sign = -sign
    i += 2
current -= 2
return current

序列中每个分数的分母是2加上上上一个分数,因此
i+=2
sign=-sign
用于在序列中交替使用正负号。
current-=2
是从序列中减去2,因为
current=2
是序列的第一个值。最后,需要使用
abs()
来获取错误的绝对值,因为它可以在正错误值和负错误值之间交替使用。

此实现更习惯于python,也更容易理解

def approxPI(n):
   cal1 = [1.0/float(i) for i in range(1, n, 4)]
   cal2 = [1.0/float(i) for i in range(3, n, 4)]
   pi = (sum(cal1)-sum(cal2)) * 4
   return pi
print(approxPI(400000))

在台式电脑上以0.05秒计算第400000个系列非常快。

使用
print()
显示变量中的值,因为您的计算不正确。在每一步中,你加4,减4/1,4/2,4/3,4/5。如果你在循环中打印
i
,你会看到它只运行了一次循环。“我们可以通过计算前几个项的和来得到π的一个很好的近似值”——不太可能,因为这个级数收敛得非常慢。这是一个非常糟糕的数列,如果你仔细考虑你的循环计算,你会发现它根本不符合公式。拿一张纸和笔/铅笔,手动检查几次。你应该计算
current+=sign*(4/i)
并更改
sign=-sign
并使用
i+=2
,而不是
i+=1
。您必须比较
abs(current-prev)>num
的绝对值。通过这些更改,我得到了正确的结果。这是make被2关闭,所以我减去了2,程序将不会加载答案。@tynastyy你所说的关闭被2关闭是什么意思?@tynastyy也表示什么意思不会加载答案。在任何情况下,我编辑了答案,它包含了一个额外的行,以去除序列中的首字母2。@tynastyy还有what means不会加载答案。在任何情况下,我编辑了答案,它包括一个额外的行,以摆脱最初的2系列。另外,了解Python中的缩进很重要。请小心,因为空间或选项卡放错位置可能会显著改变您的程序。