2013-08-03 3 views
1

Я выполняю упражнение, которое запрашивает функцию, которая аппроксимирует значение pi, используя формулу Лейбница. Это объяснения в Википедии:

enter image description here

! enter image description here

Логическое мышление приходит ко мне легко, но мне не уделялось много формального образования по математике, поэтому я немного потерял то, что представляют собой самые левые символы во втором. Я попытался сделать код pi = ((-1)**n/(2*n + 1)) * 4, но это вернуло 1.9999990000005e-06 вместо 3.14159 ..., поэтому вместо этого я использовал шаблон аккумулятора (так как глава руководства, о котором это говорилось, также упоминает их), и он работал нормально. Однако я не могу не думать о том, что это несколько надуманно, и, вероятно, это лучший способ сделать это, учитывая, что Python сосредоточен на простоте и делает программы как можно более короткими. Это полный код:
Формула Лейбница для π - Это хорошо? (Python)

def myPi(n): 
    denominator = 1 
    addto = 1 

    for i in range(n): 
     denominator = denominator + 2 
     addto = addto - (1/denominator) 
     denominator = denominator + 2 
     addto = addto + (1/denominator) 

    pi = addto * 4 

    return(pi) 

print(myPi(1000000)) 

Кто-нибудь знает лучше функцию?

+1

Это означает - * вычисляет суммирование присоединенного выражения при п = 0 до бесконечности * –

+0

@RohitJain Спасибо за информацию! – reggaelizard

+1

Вы обнаружите, что самая большая проблема [не является алгоритмом] (http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems). –

ответ

1

Столица сигм здесь является sigma notation , Это обозначение, используемое для представления суммирования в сжатой форме.

Итак, ваша сумма на самом деле бесконечная сумма. Первый член, при п = 0, является:

(-1)**0/(2*0+1) 

Это добавляется к

(-1)**1/(2*1+1) 

, а затем к

(-1)**2/(2*2+1) 

и так далее навсегда. Суммирование - это то, что известно математически как сходящаяся сумма .

В Python можно было бы написать так:

def estimate_pi(terms): 
    result = 0.0 
    for n in range(terms): 
     result += (-1.0)**n/(2.0*n+1.0) 
    return 4*result 

Если вы хотите, чтобы оптимизировать немного, вы можете избежать возведения в степень.

def estimate_pi(terms): 
    result = 0.0 
    sign = 1.0 
    for n in range(terms): 
     result += sign/(2.0*n+1.0) 
     sign = -sign 
    return 4*result 

.... 

>>> estimate_pi(100) 
3.1315929035585537 
>>> estimate_pi(1000) 
3.140592653839794 
1

Использование чистого Python вы можете сделать что-то вроде:

def term(n): 
    return ((-1.)**n/(2.*n + 1.))*4. 

def pi(nterms): 
    return sum(map(term,range(nterms))) 

, а затем вычислить pi с количеством терминов, которые необходимо достичь заданной точности:

pi(100) 
# 3.13159290356 

pi(1000) 
# 3.14059265384 
4

Формула Лейбница выливается непосредственно в Python, не пачкать или суеты:

>>> steps = 1000000 
>>> sum((-1.0)**n/(2.0*n+1.0) for n in reversed(range(steps))) * 4 
3.1415916535897934 
-1

Следующая версия использует формулу Рамануджана как указано в this SO пост - он использует соотношение между пи и «монстра группа ", как обсуждалось в this article.

import math 

def Pi(x): 
    Pi = 0 
    Add = 0 
    for i in range(x): 
     Add =(math.factorial(4*i) * (1103 + 26390*i))/(((math.factorial(i))**4)*(396**(4*i))) 
     Pi = Pi + (((math.sqrt(8))/(9801))*Add) 
    Pi = 1/Pi 
    print(Pi) 

Pi(100) 
+1

Кодовые ответы здесь не поощряются в SO. Пожалуйста, добавьте описание. :) –

Смежные вопросы