为什么Python代码近似圆周率的值没有给我正确的值?

zqdjd7g9  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(102)

pi的值可以近似为
=3+4/(2×3×4)−4/(4×5×6)+4/(6×7×8)−4/(8×9×10)+...
注意它是如何交替使用加号和减号的。
写一个函数,它接收一个整数n并返回pi的近似值,其中n项在上面的和中计算。
当𝑛=1时,它返回3。当𝑛=2时,返回结果3+42×3×4,依此类推。
它应该使用for循环。下面是我的代码:

def approximate_pi(n):
    
    if (n==1):
        approx_pi = 3
    elif(n>1):
        sign = 1
        numb = 2
        approx_pi = 3
        counter = 0
        for counter in range(1, n+1):
            approx_pi = approx_pi + sign*(4/((numb)*(numb+1)*(numb+2)))    
            sign = sign*(-1)
            numb += 2  
            counter +=1
    print(approx_pi)

approximate_pi(2)

字符串
这给了我3.145238095238095,这和我在n =2时应该得到的3.16666667值不一样。为什么?为什么?

vfwfrxfs

vfwfrxfs1#

循环次数太多了,因为range(1,n+1)将迭代n次,但是你已经包含了第一项(3),所以你只需要n-1附加项。
请注意,您不需要为n==1设置例外,如果范围为空,循环将根本不会迭代。
考虑到这一点,再加上一点代数,函数可以简化为:

def approximate_pi(n):
    return 3 - 2 * sum((-1)**i/i/(2*i+1)/(2*i+2) for i in range(1,n))

字符串
这里,符号是使用数学技巧来计算的,该技巧利用负数的奇/偶幂的行为。偶数次幂为1,奇数次幂为1。使用这个,(-1)**i产生附加项的交替符号。由于我们使用的是从1开始的i值,因此我们将获得每个项的反符号,但这很容易通过从3中减去总和而不是相加来处理。
分子(4)通过除以i而不是(2*i)而减少为2,然后在和之外分解。

cl25kdpy

cl25kdpy2#

你有太多的循环。当你调用approximate_pi(2)时,你会得到三次计算的结果。第一个值在循环外部设置为值3。下一个值是3+4/(2*3*4),第三个值是3+4/(2*3*4)-4/(4*5*6)range(1, n+1)应为range(1, n)
现在你甚至不需要n == 1的特殊情况了。

def approximate_pi(n):
    sign = 1
    number = 2
    approx_pi = 3
    for _ in range(1, n):
        approx_pi = approx_pi + sign * (4 / (number * (number + 1) * (number + 2)))
        sign *= -1
        nnumber += 2
    return approx_pi

for i in range(1, 5):
    print(approximate_pi(i))

字符串
这将给您提供结果:

3
3.1666666666666665
3.1333333333333333
3.145238095238095


我将counter变量重命名为_,因为它现在没有使用。
如果你觉得计数器变量应该用于某些东西,那么你可以从它计算符号。;)

def approximate_pi(n):
    number = 2
    approx_pi = 3
    for i in range(1, n):
        approx_pi = approx_pi + ((-1) ** (i+1)) * (4 / ((number) * (number + 1) * (number + 2)))
        number += 2
    return approx_pi


当然,您可以对number采取类似的方法。这会给予你这样的东西:

def approximate_pi(n):
    approx_pi = 3
    for i in range(1, n):
        approx_pi = approx_pi + ((-1) ** (i+1)) * (4 / (i*2)/(i*2+1)/(i*2+2))
    return approx_pi

相关问题