From fd7b540d1c49608cad300900fdfbdbaa0066e451 Mon Sep 17 00:00:00 2001 From: 2967c9aae1a2f4cee2d1ad632cabf260 <2967c9aae1a2f4cee2d1ad632cabf260@app-learninglab.inria.fr> Date: Thu, 2 Jun 2022 22:40:28 +0000 Subject: [PATCH] Update toy_notebook_en.ipynb --- module2/exo1/toy_notebook_en.ipynb | 98 ++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 24 deletions(-) diff --git a/module2/exo1/toy_notebook_en.ipynb b/module2/exo1/toy_notebook_en.ipynb index 0bbbe37..a4d20f3 100644 --- a/module2/exo1/toy_notebook_en.ipynb +++ b/module2/exo1/toy_notebook_en.ipynb @@ -1,25 +1,75 @@ -{ - "cells": [], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +# On the computation of $\pi$ + +## Asking the maths library +My computer tells me that $\pi$ is _approximatively_ + + +```python +from math import * +print(pi) +``` + + 3.141592653589793 + + +## Buffon’s needle +Applying the method of [Buffon’s needle](https://en.wikipedia.org/wiki/Buffon%27s_needle_problem), we get the __approximation__ + + +```python +import numpy as np +np.random.seed(seed=42) +N = 10000 +x = np.random.uniform(size=N, low=0, high=1) +theta = np.random.uniform(size=N, low=0, high=pi/2) +2/(sum((x+np.sin(theta))>1)/N) +``` + + + + + 3.128911138923655 + + + +## Using a surface fraction argument +A method that is easier to understand and does not make use of the sin function is based on the +fact that if $X\sim U(0, 1)$ and $Y\sim U(0, 1)$, then $P[X^2 + Y^2\le 1] = \pi/4$ (see ["Monte Carlo method" +on Wikipedia](https://en.wikipedia.org/wiki/Monte_Carlo_method)). The following code uses this approach: + + +```python +%matplotlib inline +import matplotlib.pyplot as plt + +np.random.seed(seed=42) +N = 1000 +x = np.random.uniform(size=N, low=0, high=1) +y = np.random.uniform(size=N, low=0, high=1) +accept = (x*x+y*y) <= 1 +reject = np.logical_not(accept) + +fig, ax = plt.subplots(1) +ax.scatter(x[accept], y[accept], c='b', alpha=0.2, edgecolor=None) +ax.scatter(x[reject], y[reject], c='r', alpha=0.2, edgecolor=None) +ax.set_aspect('equal') +``` + + +![png](output_6_0.png) + + +It is then straightforward to obtain a (not really good) approximation to $\pi$ by counting how +many times, on average, $X^2 + Y^2$ is smaller than 1: + + +```python +4*np.mean(accept) +``` + + + + + 3.112 + -- 2.18.1