Bonjour,
Je cherchais un algo basé sur de la géométrie simple (je sais très bien qu'il existe une foultitude de méthodes basées sur fourrier ou autres techniques encore plus compliquées ...) pour calculer pi. Que pensez vous de mon idée ? Peut-on faire plus simple en conservant la même idée ?
L'idée est de calculer une approximation de la circonférence cercle. Grâce à ça, on aura 2piR, il suffira de diviser ce nombre par 2R pour avoir pi.
Je considère un cercle de rayon 1.Je pars du point D (0,1) (cf pj). Ensuite, je "monte vers le haut" en suivant un petit vecteur . Je normalise ensuite le en . Ainsi OD =1, D est sur le cercle. J'approxime la longueur de l'arc DD' par la longueur du segment DD'.
Puis je recommence : je pars de D'. Pour savoir quel vecteur suivre, je prend que je normalise de façon à avoir . Cela me donne donc le vecteur . Je normalise en , et encore une fois approxime l'arc D'D'' avec le segment D'D'' ...
ainsi de suite jusqu'à ce que l'abscisse de D'''' soit inférieure à d (en valeur absolue, bien sur). On aura ainsi calculé le quart du périmètre du cercle en sommant DD' + D'D'' + ... . Il suffira de multiplier par 2R = 2 pour avoir pi (ici R=1).
Voilà un code qui applique cet algo en python (à la reflexion, j'aurais mieux fait de faire ça en scilab-like, pour les vecteurs c'eut été plus facile) :
Code:from math import * def norm(v) : return sqrt( v[0]**2 + v[1]**2 ) def normalize(v): n = norm(v) return ( v[0]/n , v[1]/n) def plus(v1,v2) : return (v1[0]+v2[0],v1[1]+v2[1]) def moins(v1,v2) : return (v1[0]-v2[0],v1[1]-v2[1]) def fois(a,v): return (a*v[0],a*v[1]) DA = (1.,0.) OD = (0.,1.) d = 0.0001 circ = 0. while abs(OD[1]) > d : # calcul du nouveau vecteur OD (le calcul de OA est fait par le `plus(.,.)` new_OD = normalize( plus( OD , fois( d , DA ) ) ) # calcul du nouveau vecteur DD' DDp = moins(new_OD,OD) #Ajout a la circonference circ += norm(DDp) #Preparation au passage a la prochaine etape DA=normalize(DDp) OD=new_OD print 2*circ
-----