Аппроксимация π путем вычисления суммы первых нескольких членов - PullRequest
0 голосов
/ 14 октября 2019

Константа π является иррациональным числом со значением приблизительно 3.1415928. ,,Точное значение π равно этой бесконечной сумме: π = 4 / 1−4 / 3 + 4 / 5−4 / 7 + 4 / 9−4 / 11 + ... Мы можем получить хорошее приближение π квычисление суммы первых нескольких членов. Напишите функцию прибл. (), Которая принимает в качестве входных данных ошибку с плавающей запятой и аппроксимирует постоянную π в пределах ошибки, вычисляя предыдущую сумму, термин за термином, до тех пор, пока разница между текущей суммой и предыдущей суммой (с одним меньшим термином) не будет равнабольше, чем ошибка. Функция должна возвращать новую сумму. (Подсказки: π1 = 4/1; π3 = 4-4 / 3; π5 = 4-4 / 3 + 4/5; ... πi = πi-2 + знак * 4 /я, где знак = -1 или 1) прибл. пи (0,01) 3,1465677471829556 прибл. пи (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, хотя любые предложения помогут.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Эта реализация более идиоматична и проще для понимания.

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))

Это довольно быстрый процесс расчета 400 000-й серии за 0,05 с на настольном ПК.

0 голосов
/ 14 октября 2019

Исправленная версия вашего кода выглядит следующим образом:

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() необходим для получения абсолютного значения ошибки, поскольку он может чередоваться между положительными и отрицательными значениями ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...