Dear colleagues,
a big thanks to all those who came to the first compu-salon in the Tapir interaction room last Friday.
I'm sending this e-mail to the "big" distribution lists again because I don't think the compu-salon mailing list (below) is complete yet. Please e-mail me if you don't see your e-mail so I can switch and stop spamming everybody.
Per popular request, the next salon will be this Friday, Jan 27, at 4:30pm. The topic of the day will be building a Python tool to pull bibtex citations from the ADS archive, for which we'll need to learn a bit about each of the following:
I'll send out a reminder on Friday morning. And remember, Beautiful is Better than Ugly!
Michele
Also at www.vallis.org/salon.
We then ran through a couple of code examples to compute pi (attached below in one of their iterations). In these examples we learned about:
I left the third, most modern spigot algorithm for pi as homework for the more ambitious. I only flashed my solution, which involved Python generator functions. If you wish, read about the algorithm and then send me your solution.
Python 2.x vs. 3: after looking into major package support, I would suggest sticking to 2.6/2.7 for the moment. In a few months the situation will be different (e.g., matplotlib announced support in its next version; scipy has beta support). Furthermore, most operating systems still have 2.x as default.
Arbitrary-precision arithmetics: I was wrong in suggesting the package "Decimal", which was meant mostly to track money. The right package is mpmath. If you know how to install a package, try replacing import math
with import mpmath as math
in the examples below, then set mpmath.mp.dps = 100
and try archipi(200)
. [Bonus homework question: why does the replacement make the program work?] If you don't know how to install packages, we'll do it first thing next time.
import random
import math
def buffontrial():
"""Returns 1 if a randomly sampled needle configuration intersects the
Buffon rules. (By the way, this is a Python docstring. Look it up.)"""
return 0 if (0 < random.random() + math.sin(2 * math.pi * random.random()) < 1) else 1
def buffonpi(n):
"""Collects n Buffon-needle trials and computes the resulting
approximation of pi."""
trials = [buffontrial() for i in xrange(n)] # a list comprehension
return (2.0 * n) / sum(trials)
def archistep(ab):
"""Performs one iteration of the Archimedian iteration for pi."""
a,b = ab # unpack the tuple
anext = 2 * a * b / (a + b)
bnext = math.sqrt(anext * b)
return (anext,bnext)
def archipi(n):
"""Performs n Archimedian bisections of inscribed and circumscribed
polygons, returning the resulting lower and higher approximations of pi."""
a,b = 2 * math.sqrt(3), 3 # seed the iteration with the hexagon
# a_n = 6 * 2**n * tan(theta_n)
# b_n = 6 * 2**n * sin(theta_n)
# theta_n = pi / (6 * 2**n)
for i in xrange(n):
a,b = archistep((a,b))
return a,b