LyonHPC LyonHPC

4.10. Exercices

%matplotlib inline
import numpy as np
from IPython.display import HTML,display

consigne essayer de résoudre les exercices avant de regarder la solution

4.10.1. Calcul d’une approximation fractionnaire de \(\pi\)

Sur un carré de coté 1, avec un maillage de \(n\) points dans chaque direction, on compte le nombre de points dans le cercle. Le rapport entre ce nombre et le nombre de points total tend vers \(\pi/4\).

Attention au choix du pas \(\frac{1}{n}\) ou \(\frac{1}{n-1}\)

# Ecrire votre solution

4.10.1.1. solution

n=100
h=1./n
inside=0
for i in range(n):
    for j in range(n):
        r2 = (i*h)**2 + (j*h)**2
        if r2 <= 1.0 :
            inside += 1
print("approximation de Pi = ",4*inside,"/",n*n," ~ ",4.*inside/(n*n))
approximation de Pi =  31812 / 10000  ~  3.1812

4.10.2. Calcul approximation de exp(x)

Soit la suite suivante:

\[ x_n = 1 + \frac{x}{n} \]
\[ x_i = 1 + \frac{x}{i}x_{i+1} \mbox{ pour } 0\le i \lt n \]

Écrire un algorithme et un programme Python pour calculer la valeur de \(x_0\), et vérifier que cette valeur tend vers \(e^x\) quand \(n\rightarrow\infty\)

# Ecrire votre solution

4.10.2.1. solution

from numpy import exp
# calcul suite recurrente
def suite(x,n):
    """ approximation ordre n+1 de exp(x) en serie entiere """
    un = 1. + x/(n+1)
    for i in range(n,0,-1) :
        un = 1. + (x/i) * un
    return un
#
x=10.
print(suite(x,100),exp(x))
22026.465794806725 22026.465794806718

4.10.3. Suite de Syracuse

Écrire un programme qui calcule la suite d’entiers définie par la règle suivante:

  • on part d’un nombre entier n plus grand que zéro; s’il est pair, on le divise par 2 ; s’il est impair, on le multiplie par 3 et on ajoute 1

  • on recommence et on s’arrête lorsque l’on arrive à 1

La conjecture de Collatz, énoncée en 1937, postule que cette suite de Syracuse s’arrête au bout d’un nombre fini d’itérations.

validation

Pour n=3, on obtient la suite suivante: 3, 10, 5, 16, 8, 4, 2, 1

# Votre code ici

4.10.3.1. Solution

n=3
print(n)
for k in range(20):
    if n%2:
        n = 3*n+1
    else:
        n = n//2
    print(n)
    if n==1: break
3
10
5
16
8
4
2
1

4.10.4. FIN des exercices