Approximations de Pi: Formule de Leibniz

Description

Bonjour,

La formule de Leibniz est un exemple de série alternée:
Pi = 4 * {1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 + ...}
qui, déjà mentionnée en Inde vers 1400, n'apparait en Occident qu'au 17e siècle.

Cet article fait partie de la série Approximations de Pi.
Voir aussi Wiki: Formule de Leibniz.

Nous verrons qu'avec cette formule, le résultat ne converge que très lentement vers Pi.
En effet, il faudra faire la somme d'un million de termes pour obtenir Pi avec une précision de 6 ou 7 chiffres !

Voici d'abord deux codes "équivalents", dont le second évite de calculer explicitement (2*i + 1):
double Leibniz_A(int n) {
  double pi=1.0;
  for (int i=1; i<=n; ++i) pi += ((i&1) ? -1.0 : 1.0) / (2*i + 1);
  return 4*pi;
} // pi = 4 * {1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...}

double Leibniz_B(int n) {
  double pi=1.0;
  for (int i=3, N=2*n+1; i<=N; i+=2) pi += ((i&2) ? -1.0 : 1.0) / i;
  return 4*pi;
} // pi = 4 * {1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...}


Dans la formule, réunissons maintenant chaque terme positif avec le terme consécutif négatif, ce qui "diminue" le nombre de termes et les rend tous positifs.
Pi = 8 * {1/(1*3) + 1/(5*7) + 1/(9*11) + 1/(13*15) + ...}
double Leibniz_C(int n) {
  double pi=0.0;
  for (int i=0; i<n; ++i) pi += 1.0 / (4*i + 1) / (4*i + 3);
  return 8*pi;
} // pi = 8*{1/(1*3)+1(5*7)+1/(9*11)+1/(13*15)+...}


En écrivant Pi = 8 * {1/3 + 1/35 + 1/99 + 1/195 + ...}, nous remarquons qu'à chaque pas, le dénominateur d augmente de 32 de plus:
double Leibniz_D(int n) {
  double pi=0.0, d=3;
  for (int i=0, N=32*n; i<N; i+=32) pi += 1.0 / (d += i);
  return 8*pi;            
}// pi = 8 * {1/3 + 1/35 + 1/99 + 1/195 + ...}

A partir de 3, d est augmenté de 32, de 64, de 96, ...: donc Pi/8 = Somme(i>=0) 1/(3 + 32*i).

Le Zip contient le seul fichier source Leibniz.cpp dont voici l'Output:
Leibniz_A: pi = 4*{1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...}
  n=     10: pi=3.23231580940559
  n=    100: pi=3.15149340107099
  n=   1000: pi=3.14259165433954
  n=  10000: pi=3.14169264359053
  n= 100000: pi=3.14160265348972
  n=1000000: pi=3.14159365358877
     precis: pi=3.14159265358979

Leibniz_B: pi = 4*{1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...}
  n=     10: pi=3.23231580940559
  n=    100: pi=3.15149340107099
  n=   1000: pi=3.14259165433954
  n=  10000: pi=3.14169264359053
  n= 100000: pi=3.14160265348972
  n=1000000: pi=3.14159365358877
     precis: pi=3.14159265358979

Leibniz_C: pi = 8*{1/(1*3)+1(5*7)+1/(9*11)+1/(13*15)+...}
  n=     10: pi=3.09162380666784
  n=    100: pi=3.13659268483881
  n=   1000: pi=3.14109265362104
  n=  10000: pi=3.14154265358982
  n= 100000: pi=3.14158765358982
  n=1000000: pi=3.14159215358990
     precis: pi=3.14159265358979

Leibniz_D: pi = pi = 8 * {1/3 + 1/35 + 1/99 + 1/195 + ...}
  n=     10: pi=3.09162380666784
  n=    100: pi=3.13659268483881
  n=   1000: pi=3.14109265362104
  n=  10000: pi=3.14154265358982
  n= 100000: pi=3.14158765358982
  n=1000000: pi=3.14159215358990
     precis: pi=3.14159265358979

Malgré notre effort de mieux adapter la formule, les performances restent très médiocres !


Bonne lecture ...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.