program pi; {Calcul de valeurs approchées de Pi, TP6}


CONST EPS = 10e-7;
CONST FORMAT = 6;


{uses crt;}

procedure dicho(precision :real);
var a,b,c,ancienne_valeur : real;
   nb_etapes		  : integer;
begin
   nb_etapes:=0;
   a:=2;
   b:=4;
   c:=b;
   repeat
      inc(nb_etapes);
      ancienne_valeur:=c;
      c:=(b+a)/2;
      if (sin(a)*sin(c)<0) then b:=c else a:=c;
   until (abs(ancienne_valeur - c) <= precision);
   writeln('Dichotomie : ',c:FORMAT:FORMAT,' en ',nb_etapes,' étapes')
end;

procedure newton(depart,precision :real);
var p,ancienne_valeur : real;
   nb_etapes	      : integer;
begin
   nb_etapes:=0;
   p:=depart;
   repeat
      inc(nb_etapes);
      ancienne_valeur:=p;
      p:=p-sin(p)/cos(p)
   until ((abs(p - ancienne_valeur) <= precision) or (nb_etapes>=20));
   writeln('Newton : ',p:FORMAT:FORMAT,' en ',nb_etapes,' étapes');
end;


procedure serie(precision : real);
var terme_courant, somme_partielle,ancienne_valeur : real;
   indice_courant				   : integer;
begin
   somme_partielle:=0;
   indice_courant:=0;
   repeat
      ancienne_valeur := somme_partielle;
      terme_courant :=4* ((-1) POW indice_courant) / (2*indice_courant+1);
      somme_partielle:= somme_partielle + terme_courant;
      indice_courant:=indice_courant + 1
   until (abs(somme_partielle - ancienne_valeur) <= precision);
   writeln('Série : ',somme_partielle:FORMAT:FORMAT,' en ',indice_courant,' étapes')
end;

function rectangles(n :integer ):real;
var somme : real;
   i	  : integer;
begin
   somme:=0;
   for i:=0 to n-1 do somme:=somme+sqrt(1-(i/n)**2);
   rectangles:=4*somme/n
end;


function trapezes(n :integer ):real;
var somme : real;
   i	  : integer;
begin
   somme:=0;
   for i:=1 to n-1 do somme:=somme+2*sqrt(1-(i/n)**2);
   somme:=somme+sqrt(1-(0/n)**2);
   somme:=somme+sqrt(1-(n/n)**2);
   trapezes:=2*somme/n
end;

function simpson(n :integer ):real;
var somme : real;
   i	  : integer;
begin
   somme:=0;
   for i:=0 to n-1 do
      somme:=somme+sqrt(1-(i/n)**2)
                  +4*sqrt(1-((2*i+1)/2/n)**2)
                  +sqrt(1-((i+1)/n)**2);
   simpson:=4*somme/(6*n);
end;


var k:integer;
   
begin 
   dicho(EPS);
   readln;

   newton(3.0,EPS);
   readln;

   serie(EPS);
   readln;

   for k:=1 to 7 do writeln('rectangles(',10 POW k,')=',
			    rectangles(10 POW k):FORMAT:FORMAT);
   readln;

   for k:=1 to 5 do writeln('trapezes(',10 POW k,')=',
			    trapezes(10 POW k):FORMAT:FORMAT);
   readln;

   for k:=1 to 5 do writeln('simpson(',10 POW k,')=',
			    simpson(10 POW k):FORMAT:FORMAT);
   readln;
end.



{ RESULTATS 

Dichotomie : 3.141593 en 21 étapes

Newton : 3.141593 en 3 étapes

Série : 3.141593 en 2000001 étapes

rectangles(10)=3.304518
rectangles(100)=3.160417
rectangles(1000)=3.143555
rectangles(10000)=3.141791
rectangles(100000)=3.141613
rectangles(1000000)=3.141595
rectangles(10000000)=3.141593

trapezes(10)=3.104518
trapezes(100)=3.140417
trapezes(1000)=3.141555
trapezes(10000)=3.141591
trapezes(100000)=3.141593

simpson(10)=3.136447
simpson(100)=3.141430
simpson(1000)=3.141588
simpson(10000)=3.141592
simpson(100000)=3.141593

}



















}