Using the arctan Power Series to Calculate Pi

(Note: this post is an extension on the calculating pi with python post from a couple of years back. Also here’s another way to inefficiently calculate pi with Buffon’s Needles.)

We’re currently working with Power series and Taylor series in Calculus.
One particularity pretty derivation is going from the series for \frac{1}{(1-x)} = 1 + x + x^2 + x^3 ... to the series for arctan(x) = 1 - \frac{x^3}{3} + \frac{x^5}{5} - \frac{x^7}{7} + ...
Even better you can use this formula to calculate pi, since arctan(1) = \frac{\pi}{4}, so \pi = 4 ( 1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ...).
How quickly does this converge to pi? Let’s find out.
Here’s the first ten partial sums:

n= 0 and the partial sum is 4.0
n= 1 and the partial sum is 2.666666666666667
n= 2 and the partial sum is 3.466666666666667
n= 3 and the partial sum is 2.8952380952380956
n= 4 and the partial sum is 3.3396825396825403
n= 5 and the partial sum is 2.9760461760461765
n= 6 and the partial sum is 3.2837384837384844
n= 7 and the partial sum is 3.017071817071818
n= 8 and the partial sum is 3.2523659347188767
n= 9 and the partial sum is 3.0418396189294032
n= 10 and the partial sum is 3.232315809405594

Ok, that’s slow.
Here’s the first 100 terms:

n= 0 and the partial sum is 4.0
n= 10 and the partial sum is 3.232315809405594
n= 20 and the partial sum is 3.189184782277596
n= 30 and the partial sum is 3.1738423371907505
n= 40 and the partial sum is 3.1659792728432157
n= 50 and the partial sum is 3.1611986129870506
n= 60 and the partial sum is 3.157984995168666
n= 70 and the partial sum is 3.155676462307475
n= 80 and the partial sum is 3.1539378622726155
n= 90 and the partial sum is 3.1525813328751204
n= 100 and the partial sum is 3.1514934010709914

Still not to 3.14 even after adding 100 terms of this sequence?
Here’s the first 10,000 terms:

n= 0 and the partial sum is 4.0
n= 1000 and the partial sum is 3.1425916543395442
n= 2000 and the partial sum is 3.1420924036835256
n= 3000 and the partial sum is 3.1419258758397897
n= 4000 and the partial sum is 3.1418425911015158
n= 5000 and the partial sum is 3.1417926135957908
n= 6000 and the partial sum is 3.1417592924821482
n= 7000 and the partial sum is 3.141735490326666
n= 8000 and the partial sum is 3.1417176379662446
n= 9000 and the partial sum is 3.1417037523562383
n= 10000 and the partial sum is 3.1416926435905346

Two factors of ten more than the last set and still not to 5 digits of precision?
Lastly, here’s the first ten million approximations:

n= 0 and the partial sum is 4.0
n= 1000000 and the partial sum is 3.1415936535887745
n= 2000000 and the partial sum is 3.1415931535894743
n= 3000000 and the partial sum is 3.1415929869229293
n= 4000000 and the partial sum is 3.1415929035895926
n= 5000000 and the partial sum is 3.1415928535897395
n= 6000000 and the partial sum is 3.141592820256488
n= 7000000 and the partial sum is 3.1415927964468655
n= 8000000 and the partial sum is 3.141592778589681
n= 9000000 and the partial sum is 3.141592764700862
n= 10000000 and the partial sum is 3.1415927535897814

I really don’t want to calculate this by hand if after 10,000,000 additions, we only have 7 digits of precision.

(Question: why are all these even terms an over-estimate of pi?)

Graph of the first 1000 partial sums:
2015-03-12_11h35_15

Let’s compare that to Chudnovsky’s algorithm:

Chudnovsky
n= 1 3.1415926535897342076684535915782983407622332609156
n= 2 3.1415926535897932384626433835873506884758663459963
n= 3 3.1415926535897932384626433832795028841971676788547
n= 4 3.1415926535897932384626433832795028841971693993750
n= 5 3.1415926535897932384626433832795028841971693993750
n= 6 3.1415926535897932384626433832795028841971693993750
n= 7 3.1415926535897932384626433832795028841971693993750

Wow, this algorithm maxed out the 51 digits of precision after 4 iterations. Crazy.

Here’s the python code for using arctan to approximate pi:

from decimal import *

#Sets decimal to 50 digits of precision
getcontext().prec = 50

#This program uses the power series for arctan to calculate pi
#arctan(x) = sum (n = 0 to infinity) (-1)^n * (x^(2n+1))/(2n+1)
#So to calculate pi, compute (arctan (1)) = pi/4 = 1 - 1/3 + 1/5 - 1/7 +...

quarterpi = Decimal(0)
n = 0

while True:
    quarterpi = quarterpi + Decimal(-1)**n / (Decimal(2*n + 1))
    #this line allows the code to print only every 10 lines, increase this number
    #to speed up the calculations and reduce the printing
    if (n % 10 == 0):
        print((quarterpi*Decimal(4)))
    n += 1
    

And here’s the chudnovsky python code:

from decimal import *

#Sets decimal to 50 digits of precision
getcontext().prec = 50

def factorial(n):
    if n<1:
        return 1
    else:
        return n * factorial(n-1)

def chudnovskyBig(n): #http://en.wikipedia.org/wiki/Chudnovsky_algorithm
    pi = Decimal(0)
    k = 0
    while k < n:
        pi += (Decimal(-1)**k)*(Decimal(factorial(6*k))/((factorial(k)**3)*(factorial(3*k)))* (13591409+545140134*k)/(640320**(3*k)))
        k += 1
    pi = pi * Decimal(10005).sqrt()/4270934400
    pi = pi**(-1)
    return pi
print ("Chudnovsky")
for i in range(1,50):
    print ("n=",i," ", chudnovskyBig(i))
This entry was posted in Full Posts and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *