9.1 Chapitre 1
311
Solution 1.10 Le comportement anormal de la suite calculée est dû à la propagation d’erreurs d’arrondi dans les opérations internes. Par exemple, quand
4
1−n z
2
n est inférieur à M /2, l’élément suivant zn+1 vaut 0. Ceci se produit
pour n ≥ 30.
Solution 1.11 La méthode proposée est une méthode de Monte Carlo. Elle
est implémentée dans le programme suivant :
function mypi = p i m o nt ecarl o(n )
x = rand (n ,1); y = rand (n ,1);
z = x .^2+ y .^2;
v = (z <= 1);
m = sum (v ); mypi =4* m /n ;
La commande rand génère une suite de nombres pseudo-aléatoires. L’instruction v = (z <= 1) se lit de la manière suivante : on teste si z(k) <= 1
pour chaque composante du vecteur z ; si l’inégalité est satisfaite pour la k-ème
composante de z (c’est-à-dire, si le point (x(k),y(k)) appartient à l’intérieur
du disque unité) on donne la valeur 1 à v(k), sinon on lui donne la valeur
0. La commande sum(v) calcule la somme de toutes les composantes de v, sum
c’est-à-dire le nombre de points se trouvant à l’intérieur du disque unité.
On exécute le programme mypi=pimontecarlo(n) pour différentes valeurs de n. Plus n est grand, meilleure est l’approximation mypi de π. Par
exemple, pour n=1000 on obtient mypi=3.1120, tandis qu’avec n=300000 on a
mypi=3.1406 (naturellement, comme les nombres sont générés aléatoirement,
les résultats obtenus pour une même valeur de n peuvent changer à chaque
exécution).
Solution 1.12 Pour répondre à la question on peut utiliser la fonction suivante :
function pig= b b p a lgori thm( n)
pig = 0;
for m =0:n
m8 = 8*m;
pig = pig + (1/16)^ m *(4/( m8 +1) -(2/( m8 +4)+ ...
1/( m8 +5)+1/( m8 +6)));
end
return
Pour n=10, on obtient une approximation pig de π qui coïncide (à la précision
MATLAB) avec la variable interne pi de MATLAB. Cet algorithme est en
effet extrêmement efficace et permet le calcul rapide de centaines de chiffres
significatifs de π.
Solution 1.13 On peut calculer les coefficients du binôme avec le programme
suivant (voir aussi la fonction MATLAB nchoosek) :
nchoosek
function bc = bincoeff (n ,k )
k = fix (k ); n = fix( n );
if k > n , disp( ’k doit être entre 0 et n ’ );
return ; end
if k > n/2, k = n-k; end
if k <= 1 , bc = n ^k ; else
num = (n - k +1): n; den = 1:k ; el = num ./ den ;
311
Solution 1.10 Le comportement anormal de la suite calculée est dû à la propagation d’erreurs d’arrondi dans les opérations internes. Par exemple, quand
4
1−n z
2
n est inférieur à M /2, l’élément suivant zn+1 vaut 0. Ceci se produit
pour n ≥ 30.
Solution 1.11 La méthode proposée est une méthode de Monte Carlo. Elle
est implémentée dans le programme suivant :
function mypi = p i m o nt ecarl o(n )
x = rand (n ,1); y = rand (n ,1);
z = x .^2+ y .^2;
v = (z <= 1);
m = sum (v ); mypi =4* m /n ;
La commande rand génère une suite de nombres pseudo-aléatoires. L’instruction v = (z <= 1) se lit de la manière suivante : on teste si z(k) <= 1
pour chaque composante du vecteur z ; si l’inégalité est satisfaite pour la k-ème
composante de z (c’est-à-dire, si le point (x(k),y(k)) appartient à l’intérieur
du disque unité) on donne la valeur 1 à v(k), sinon on lui donne la valeur
0. La commande sum(v) calcule la somme de toutes les composantes de v, sum
c’est-à-dire le nombre de points se trouvant à l’intérieur du disque unité.
On exécute le programme mypi=pimontecarlo(n) pour différentes valeurs de n. Plus n est grand, meilleure est l’approximation mypi de π. Par
exemple, pour n=1000 on obtient mypi=3.1120, tandis qu’avec n=300000 on a
mypi=3.1406 (naturellement, comme les nombres sont générés aléatoirement,
les résultats obtenus pour une même valeur de n peuvent changer à chaque
exécution).
Solution 1.12 Pour répondre à la question on peut utiliser la fonction suivante :
function pig= b b p a lgori thm( n)
pig = 0;
for m =0:n
m8 = 8*m;
pig = pig + (1/16)^ m *(4/( m8 +1) -(2/( m8 +4)+ ...
1/( m8 +5)+1/( m8 +6)));
end
return
Pour n=10, on obtient une approximation pig de π qui coïncide (à la précision
MATLAB) avec la variable interne pi de MATLAB. Cet algorithme est en
effet extrêmement efficace et permet le calcul rapide de centaines de chiffres
significatifs de π.
Solution 1.13 On peut calculer les coefficients du binôme avec le programme
suivant (voir aussi la fonction MATLAB nchoosek) :
nchoosek
function bc = bincoeff (n ,k )
k = fix (k ); n = fix( n );
if k > n , disp( ’k doit être entre 0 et n ’ );
return ; end
if k > n/2, k = n-k; end
if k <= 1 , bc = n ^k ; else
num = (n - k +1): n; den = 1:k ; el = num ./ den ;
