You're reading: Travels in a Mathematical World

π approximation: Machin’s formula

In the excellent $\pi$ approximation video, Katie Steckles asked for $\pi$ approximations. I teach a first year techniques module (mostly calculus and a little complex numbers and linear algebra). This year I have changed a few bits in my module; in particular I gave some of my more numerical topics to the numerical methods module and took in return some of the more analytic bits from that module. This gives both modules greater coherence, but it means I have lost one of my favourite examples, from the Taylor series topic, which uses a Maclaurin series to approximate $\pi$.

This uses a formula for $\pi$ due to John Machin (1680–1751) (for which a derivation can be found):

\[ \pi = 16 \tan^{-1}\left(\frac{1}{5}\right) – 4 \tan^{-1}\left(\frac{1}{239}\right)\text{.} \]

First, we need a Maclaurin series for $\tan^{-1}$. That would be:

\[ f(x) = f(0) + f'(0)x + \frac{f”(0)}{2!}x^2 + \frac{f^{(3)}(0)}{3!}x^3 + \ldots \]

To find this, we need to know the derivative of $f(x)=\tan^{-1}(x)$, which I claim to be $\frac{1}{x^2+1}$.

(To see this, let $x=\tan(\theta)$ in $\int \frac{1}{x^2+1} \, \mathrm{d}x$, remembering $\frac{\mathrm{d}x}{\mathrm{d}\theta}=\sec^2(\theta)$ and $\tan^2(\theta)+1 = \sec^2(\theta)$.)

So, back to our Maclaurin series, the relevant derivatives are: $f(x)=\tan^{-1}(x)$, $f'(x)=(x^2+1)^{-1}$, $f”(x)=-2x(x^2+1)^{-2}$, and so on (I’m waving my arms here because the quotient rule is involved at this point and it gets messy!).

Then the function values end up as: $f(0)=0$, $f'(0)=1$, $f”(0)=0$, $f^{(3)}(0)=-2!$, $f^{(4)}(0)=0$, $f^{(5)}(0)=4!$, $f^{(6)}(0)=0$, $f^{(7)}(0)=-6!$, etc.

So

\[ \begin{align*}
\tan^{-1}(x)&=0+x+\frac{0}{2!}x^2+\frac{-2!}{3!}x^3+\frac{0}{4!}x^4+\frac{4!}{5!}x^5+\frac{0}{6!}x^6+\frac{-6!}{7!}x^6+\ldots \\
&= x – \frac{x^3}{3} + \frac{x^5}{5} – \frac{x^7}{7} + \ldots
\end{align*}\]

I’m happy, for an approximation, to say $\tan^{-1}(x) \approx x – \frac{x^3}{3} + \frac{x^5}{5} – \frac{x^7}{7}$, so that

\[ \tan^{-1}\left(\frac{1}{5}\right) \approx \left(\frac{1}{5}\right) – \frac{\left(\frac{1}{5}\right)^3}{3} + \frac{\left(\frac{1}{5}\right)^5}{5} – \frac{\left(\frac{1}{5}\right)^7}{7} \approx 0.197395504761905 \]

and

\[ \tan^{-1}\left(\frac{1}{239}\right) \approx \left(\frac{1}{239}\right) – \frac{\left(\frac{1}{239}\right)^3}{3} + \frac{\left(\frac{1}{239}\right)^5}{5} – \frac{\left(\frac{1}{239}\right)^7}{7} \approx 0.004184076002075\text{.}\]

Finally,

\[ \pi \approx 16 \times 0.197395504761905 – 4 \times 0.004184076002075 = 3.141591772182177\text{.} \]

I think it is neat to get agreement with the first five decimal places from only four terms.

The first time I did this example in a lecture, I started by joking “this is a long and complicated example. When I get to the end, I fully expect a round of applause”. When I finished, somewhat embarrassingly, I received one — along with ironic whoops from the back row!

To take this a little further, I wrote this quick Python code.

import decimal
import math

for loop in range(1,12):
    pivalue=0
    firstterm=0
    secondterm=0
    for i in range(0, loop):
        firstterm = firstterm + decimal.Decimal((-1)**i * (1/5**(2*i+1))/(2*i+1))
        secondterm = secondterm + decimal.Decimal((-1)**i * (1/239**(2*i+1))/(2*i+1))
    pivalue = decimal.Decimal(16 * firstterm - 4 * secondterm)
    print("Using {} terms: {:.15f}".format(loop,pivalue))
    
print('math.pi:        {:.15f}'.format(math.pi))

This gives the following values, showing that this finds 15 digits of $\pi$ by the time eleven terms of the sequence are computed.

Using 1 terms: 3.183263598326360
Using 2 terms: 3.140597029326060
Using 3 terms: 3.141621029325035
Using 4 terms: 3.141591772182177
Using 5 terms: 3.141592682404400
Using 6 terms: 3.141592652615309
Using 7 terms: 3.141592653623555
Using 8 terms: 3.141592653588602
Using 9 terms: 3.141592653589836
Using 10 terms: 3.141592653589792
Using 11 terms: 3.141592653589793
math.pi:        3.141592653589793

Apparently Machin used his formula to compute 100 digits of $\pi$, but to do that I’d need to get my head around increasing Python’s decimal places. Or get a lot more free time and calculate it by hand!

Leave a Reply

  • (will not be published)

$\LaTeX$: You can use LaTeX in your comments. e.g. $ e^{\pi i} $ for inline maths; \[ e^{\pi i} \] for display-mode (on its own line) maths.

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>