Важные правки: кто бы ни ожидал этого приближения мация для получения PI - цитата из Wikipedia:
Он сходится довольно медленно, хотя - после 500.000 терминов, он производит только пять правильных десятичных цифр П
Оригинальный ответ: Эта является образовательным примером. Вы пытаетесь использовать ярлык и пытаетесь реализовать «осциллирующий» знак слагаемых, выполнив два шага для k
в той же итерации. Однако вы настраиваете k
только одним шагом на итерацию.
Обычно, по математике, с достигается осциллирующий знак. Итак, я выбрал это для более читаемой реализации:
def pi_approx(num_iterations):
k = 3.0
s = 1.0
for i in range(num_iterations):
s = s-((1/k) * (-1)**i)
k += 2
return 4 * s
Как вы можете видеть, я изменил ваш подход немного, чтобы улучшить читаемость. Вам не нужно проверять на num
в цикле while, и нет никакой особой необходимости в вашей переменной pi
. Ваш est
фактически является суммой, которая растет шаг за шагом, поэтому почему бы не назвать ее s
(«сумма» - это встроенное ключевое слово в Python). Просто умножьте сумму с 4
в конце, согласно вашей формуле.
Тест:
>>> pi_approx(100)
3.1514934010709914
Сближение, однако, не особенно хорошо:
>>> pi_approx(100) - math.pi
0.009900747481198291
Ваш ожидается выход слоеное как-то, потому что ваш piApprox(300)
(должен быть 3.13825932952
, в соответствии с вашими) является слишком далеко от ИП. Как вы это придумали? Возможно, это связано с накопленной числовой ошибкой?
Редактировать
Я не стал бы доверять книгу слишком много в отношении того, что функция должна возвращать через 10 и 300 итераций. Промежуточный результат, после 10 шагов, должен быть скорее свободен от числовых ошибок. Там, действительно, имеет значение, выполняете ли вы два шага от k
одновременно или нет. Так что это, скорее всего, разница между моими pi_approx(10)
и книгами. Для 300 итераций числовая ошибка могла сильно повлиять на результат в книге. Если это старая книга, и они внедрили свой пример в C, возможно, используя одинарную точность, то значительная часть результата может быть вызвана накоплением числовой ошибки (примечание: это яркий пример того, насколько плохо вы можете быть пораженные числовыми ошибками: повторенный сумма малых и больших значений, это не ухудшается!).
Важно то, что вы рассмотрели математику (формулу для PI), и вы внедрили рабочую версию Python, аппроксимирующую эту формулу. Это была цель обучения книги, так что идите дальше и решайте следующую проблему :-).
Try 'piApprox (2)'. –
@ScottHunter 'piApprox (2)' выдает '3.466666666666667' –
Вы уверены, что' piApprox (300) 'должен возвращать' 3.13825932952'? Потому что это не PI. Формула, однако, работает - если правильно реализована. –