TD: Calcul de Π

Transcription

TD: Calcul de Π
TD: Calcul de Π
1 Position du problème
On se propose d’étudier différentes méthodes pour calculer les décimales du nombre π.
1.1 Convergence d’une suite
Méthode d’Archimède
Le premier calcul mathématique de π remonte à Archimède de Syracuse (287-212 avant J.-C.). Celui-ci
reposait sur un encadrement du périmètre du cercle par ceux de polygones réguliers inscrit et circonscrits. Soit
pn le périmètre d’un polygone régulier à n côtés inscrit dans un cercle de diamètre unité et p0n celui d’un polygone
régulier à n côtés circonscrit au même cercle. En utilisant l’inégalité pn < π < p0n pour n = 6 × 2k , on peut
obtenir une approximation de π avec:
q √
1− 1−u2n
1
π
pn = n.un où un = sin n , u6 = 2 et u2n =
2
π
1
0
0
0
0
0
√
√
et pn = n.un où un = tan n , u6 = 3 et u2n = un 2 .
1−un
Programmer le calcul de la suite un par une méthode itérative et par une méthode récursive. Pour évaluer
la vitesse de convergence de cette suite, tracer log(π − pn ) en fonction de n.
Méthode de Monte-Carlo
p
Tirer au sort un couple (xi , yi ) de nombres compris entre 0 et 1. Évaluer ri = x2i + yi2 . Si ri ≤ 1,
alors incrémenter un compteur c. Réitérer le calcul pour un très grand nombre n de couples {(xi , yi )}. Tracer
un = 4 × c/n en fonction de n.
1.2 Convergence d’une série
Série Arctan
D’après la formule de J. Gregory (1638-1675): Arctan x =
+∞
X
(−1)k .x2k+1
k=0
rang n, l’erreur commise est inférieure ou de l’ordre de
On en déduit la formule de Leibniz:
π
4
2k + 1
. Lorsque l’on arrête la série au
|x|2n+3
2n+3 .
= Arctan 1 =
+∞
X
(−1)k
.
2k + 1
k=0
n
X
(−1)k
Programmer le calcul de la série Sn = 4 ×
.
2k + 1
k=0
Pour évaluer la vitesse de convergence de cette suite, tracer log(|π − Sn |) en fonction de n.
Cette série convergeant assez lentement (car x = 1), on peut - pour accélérer la convergence - utiliser
des combinaisons de fonctions Arctan x avec x 1. Programmer une série utilisant la formule de Gauss:
1
1
1
π = 48. Arctan 18
+ 32. Arctan 57
− 20. Arctan 239
Série de Ramanujan
Au début du vingtième siècle, S. Ramanujan, mathématicien autodidacte indien, proposa la série:
√
+∞
1
2. 2 X (4k)!.(1103 + 26390.k)
.
=
×
π
9801
(n!)4 .3934n
k=0
1
ISEN-Brest. Kany.
Programmer le calcul de la série Sn0 =
TD: Calcul de Π
9801
√
2. 2
×
1
n
X
(4k)!.(1103 + 26390.k)
.
(n!)4 .3934n
k=0
Cette série converge très vite: vérifier qu’au bout de 2 termes, on a déjà π à 8 décimales. Mais les termes
supplémentaires ne permettent de gagner qu’une précision relativement faible. Évaluer l’évolution de la précision
Pn = π − Sn0 en traçant log(|Pn+1 − Pn |) en fonction de n.
2 Code avec Mathematica
Calcul de Pi
Archimède
Méthode par récurrence
In[1]:=U[n ] := If[n == 6, 1/2, Sqrt[(1 - Sqrt[1 - U[n/2]^2])/2]];
Archimede[n ] := n*U[n]; Erreur[n ] := N[Pi - Archimede[n], 100];
liste = Table[Log[10, Erreur[6*2^n]], {n, 0, 10}];
ListPlot[liste, PlotJoined -> False, PlotRange -> Automatic]
Out[1]=
Méthode itérative
In[2]:=k = 6; u = 1/2; liste = Table[n, {n, 1, 10}]; For[n = 1, n <= 10, n++, k = 2*k;
u = Sqrt[(1 - Sqrt[1 - u^2])/2];
liste = ReplacePart[liste, N[Log[10, Pi - k*u], 100], n]]; ListPlot[liste]
Out[2]=
Monte-Carlo
In[3]:=SeedRandom[];
2
ISEN-Brest. Kany.
TD: Calcul de Π
In[4]:=TirageMax = 10000; inclus = 0; liste = Table[n, {n, 1, TirageMax}];
For[tirage = 1, tirage <= TirageMax, tirage++, If[Random[]^2 + Random[]^2 <= 1,
inclus++]; liste = ReplacePart[liste, N[4*inclus/tirage, 100], tirage]; ];
ListPlot[liste]
Out[4]=
In[5]:=Erreur = liste - N[Pi, 10]; ListPlot[Erreur]
Out[5]=
Arctan
In[6]:=SerieArcTan[x , n ] := Sum[(-1)^k*x^(2*k + 1)/(2*k + 1), {k, 0, n}];
In[7]:=Erreur[n ] := N[Abs[Pi - 4*SerieArcTan[1, n]], 10]
In[8]:=liste = Table[Log[10, Erreur[n]], {n, 1, 500}];
In[9]:=ListPlot[liste]
Out[9]=
In[10]:=$ MaxExtraPrecision = 500;
3
ISEN-Brest. Kany.
TD: Calcul de Π
In[11]:=Gauss[n ] := 48*SerieArcTan[1/18, n] + 32*SerieArcTan[1/57, n] 20*SerieArcTan[1/239, n]
In[12]:=Erreur[n ] := N[Abs[Pi - Gauss[n]], 500]
In[13]:=liste = Table[Log[10, Erreur[n]], {n, 1, 100}];
In[14]:=ListPlot[liste]
Out[14]=
Ramanujan
In[15]:=S[n ] := Sum[(4*k)!*(1103 + 26390*k)/(k!^4*393^(4*k)), {k, 0, n}];
In[16]:=Ramanujan[n ] := 9801/(2*Sqrt[2]*S[n]);
In[17]:=Erreur[n ] := N[Pi - Ramanujan[n], 1000]
In[18]:=liste = Table[Log[10, Erreur[n]], {n, 1, 25}];
In[19]:=ListPlot[liste]
Out[19]=
La série converge donc très vite puisque - au bout de 2 termes - on a déjà Pi à 8 décimales mais ensuite
on gagne une précision relativement faible. On va donc tracer l’évolution de la précision en échelle log.
In[20]:=liste2 = Table[Log[10, Erreur[i + 1] - Erreur[i]], {i, 1, 24}];
In[21]:=ListPlot[liste2, PlotJoined -> False, PlotRange -> Automatic]
4
ISEN-Brest. Kany.
TD: Calcul de Π
Out[21]=
3 Code avec Python
import
import
import
import
import
math
decimal #bibliothèque pour pouvoir faire des calculs précis
sympy
matplotlib.pyplot as plt
numpy as np
0
1
2
3
4
5
6
70
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
70
3.5
0.5
3.0
0.0
0.0
0.5
0.5
2.5
1.0
1.0
2.0
1.5
1.5
1.0
2.0
2.5
0.5
0.00
1.5
2.0
2.5
3.0
2000
4000
6000
8000
10000
20
40
60
80
100
3.50
2000
4000
6000
8000
0
50
100
150
200
250
3000
5
10000
3.00
100
200
300
400
500
ISEN-Brest. Kany.
TD: Calcul de Π
1.4 1e 8+6.58230055
0
50
1.2
100
1.0
150
0.8
200
0.6
250
0.4
300
0.2
0.00
350
10
20
30
40
50
4000
10
20
30
40
6
50