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