Algorithmes en lien avec le dénombrement, les suites et l'intégration

TleMathematiquesStructures de contrôle et listesAlgorithmes en lien avec dénombrement, suites, intégration~9 min de lecture

Algorithmes en lien avec le dénombrement, les suites et l'intégration

Avec des boucles (for, while), des conditions et des listes en Python, on fait calculer à la machine ce qui serait long à la main : compter des cas, trouver des termes et des seuils de suites, approcher une intégrale.

Objectifs

  • Utiliser les structures de contrôle : boucle bornée for, boucle non bornée while, test if.
  • Créer et parcourir des listes en Python.
  • Écrire des algorithmes de dénombrement (factorielle, combinaisons, énumération).
  • Calculer les termes d'une suite et déterminer un seuil.
  • Approcher une intégrale par la méthode des rectangles.

1. Rappels : boucles, tests et listes

Une liste est une suite ordonnée de valeurs : L = [3, 7, 2]. On accède au premier élément par L[0], on ajoute un élément avec L.append(x), on obtient la longueur avec len(L). On peut aussi créer une liste « en compréhension » :

carres = [k**2 for k in range(1, 6)]   # [1, 4, 9, 16, 25]
pairs = [k for k in range(10) if k % 2 == 0]   # [0, 2, 4, 6, 8]
flowchart LR
A[Initialiser] --> B{Condition vraie}
B -- oui --> C[Executer le bloc]
C --> D[Mettre a jour]
D --> B
B -- non --> E[Afficher le resultat]

Que contient la liste [2*k + 1 for k in range(4)] ?

  1. [1, 3, 5, 7, 9]
  2. [1, 3, 5, 7]
  3. [3, 5, 7, 9]
k prend les valeurs 0, 1, 2, 3 (quatre valeurs) ; on obtient 2×0+1 = 1, puis 3, 5 et 7.

2. Algorithmes de dénombrement

Factorielle

Le nombre de façons de ranger \(n\) objets est \(n! = 1\times 2\times\cdots\times n\). L'idée de l'algorithme : partir de 1 et multiplier successivement par 2, 3, …, \(n\), comme on empile des briques une à une.

def factorielle(n):
    p = 1
    for k in range(1, n + 1):
        p = p * k
    return p

Trace de factorielle(5) : déroule les étapes.

Au départ \(p = 1\).
\(k=1\) : \(p = 1\) ; \(k=2\) : \(p = 2\) ; \(k=3\) : \(p = 6\).
\(k=4\) : \(p = 24\) ; \(k=5\) : \(p = 120\).
La fonction renvoie \(120 = 5!\).

Combinaisons

Le nombre de parties à \(k\) éléments d'un ensemble à \(n\) éléments est \(\binom{n}{k} = \dfrac{n!}{k!\,(n-k)!}\).

def combinaison(n, k):
    return factorielle(n) // (factorielle(k) * factorielle(n - k))

Énumérer pour compter

Deux boucles imbriquées listent tous les duos \((i, j)\) avec \(i < j\) :

duos = []
for i in range(1, 6):
    for j in range(i + 1, 6):
        duos.append((i, j))
print(len(duos))

Que va afficher ce programme ? Cherche d'abord.

Voir la solution

Pour \(i=1\), \(j\) va de 2 à 5 : 4 duos ; pour \(i=2\) : 3 duos ; pour \(i=3\) : 2 ; pour \(i=4\) : 1 ; pour \(i=5\) : 0. Total \(4+3+2+1 = 10\).

On retrouve \(\binom{5}{2} = \dfrac{5!}{2!\,3!} = \dfrac{120}{2\times 6} = 10\) : les 5 candidats donnent 10 duos de délégués possibles.

Un code de cadenas comporte 4 chiffres de 0 à 9 (répétitions permises). Combien de tours fait la boucle la plus intérieure de 4 boucles imbriquées for … in range(10) ?

  1. 40
  2. 5 040
  3. 10 000
Chaque boucle fait 10 tours : \(10\times10\times10\times10 = 10^4 = 10\,000\) codes, ce sont des 4-listes de chiffres.

3. Algorithmes sur les suites

Calculer un terme et la liste des termes

Soit la suite définie par \(u_0 = 2\) et \(u_{n+1} = 0{,}5\,u_n + 3\).

def termes(n):
    u = 2
    L = [u]
    for k in range(n):
        u = 0.5 * u + 3
        L.append(u)
    return L

termes(4) renvoie [2, 4.0, 5.0, 5.5, 5.75] : \(u_1 = 0{,}5\times2+3 = 4\), \(u_2 = 5\), \(u_3 = 5{,}5\), \(u_4 = 5{,}75\). La suite semble converger vers \(6\) (en effet \(u_n = 6 - 4\times 0{,}5^n\)).

Manipule : la courbe de \(x\mapsto 6 - 4q^{x}\) passe par les points \((n ; u_n)\) quand \(q = 0{,}5\). Fais varier \(q\) entre 0 et 1 : la limite reste 6, mais l'approche est plus ou moins rapide.

Algorithme de seuil

def seuil(s):
    n = 0
    u = 2
    while u <= s:
        u = 0.5 * u + 3
        n = n + 1
    return n

Que renvoie seuil(5.9) ? Cherche d'abord.

\(u_4 = 5{,}75 \le 5{,}9\) : la boucle continue.
\(u_5 = 0{,}5\times5{,}75 + 3 = 5{,}875 \le 5{,}9\) : la boucle continue.
\(u_6 = 0{,}5\times5{,}875 + 3 = 5{,}9375 > 5{,}9\) : la boucle s'arrête.
La fonction renvoie \(n = 6\) : c'est le premier rang pour lequel \(u_n > 5{,}9\).

Exemple résolu : l'épargne d'Awa

Écrire l'algorithme et trouver le nombre d'années.

Voir la solution
c = 100000
n = 0
while c <= 150000:
    c = c * 1.05
    n = n + 1
print(n)

On a \(c_n = 100\,000\times1{,}05^n\). Or \(1{,}05^8 \approx 1{,}477\) donc \(c_8 \approx 147\,746\) F CFA, et \(1{,}05^9 \approx 1{,}551\) donc \(c_9 \approx 155\,133\) F CFA. Le programme affiche \(9\) : il faut 9 ans.

Pourquoi utilise-t-on une boucle while (et non for) pour un algorithme de seuil ?

  1. Parce qu'on ne connaît pas à l'avance le nombre de tours
  2. Parce que while est plus rapide
  3. Parce que for ne peut pas calculer de suite
Le rang cherché est justement l'inconnue : on répète tant que la condition n'est pas atteinte.

4. Approcher une intégrale : méthode des rectangles

On partage \([a;b]\) en \(n\) intervalles de largeur \(h = \dfrac{b-a}{n}\). Avec les rectangles « à gauche », la hauteur de chaque rectangle est la valeur de \(f\) au bord gauche :

\[ S_n = h\sum_{k=0}^{n-1} f(a + k h) \approx \int_a^b f(x)\,dx . \]
Méthode des rectangles à gauche pour x² sur [0 ; 1] avec 4 rectangles 0 1 1 y = x² S4 ≈ 0,219 exact : 1/3

Avec \(n = 4\) et \(h = 0{,}25\), chaque rectangle prend la hauteur de \(f\) au bord gauche (le premier a une hauteur nulle car \(f(0) = 0\)).

La somme des aires vaut \(S_4 \approx 0{,}219\) : c'est une valeur par défaut, car \(f\) est croissante et les rectangles restent sous la courbe.

def rectangles(f, a, b, n):
    h = (b - a) / n
    s = 0
    for k in range(n):
        s = s + f(a + k * h)
    return h * s

def carre(x):
    return x**2

print(rectangles(carre, 0, 1, 4))

Exemple résolu

Calculer à la main rectangles(carre, 0, 1, 4), puis comparer à \(\int_0^1 x^2\,dx\).

\(h = \dfrac{1-0}{4} = 0{,}25\). Les bords gauches sont \(0\) ; \(0{,}25\) ; \(0{,}5\) ; \(0{,}75\).
Somme des hauteurs : \(0 + 0{,}0625 + 0{,}25 + 0{,}5625 = 0{,}875\).
\(S_4 = 0{,}25\times 0{,}875 = 0{,}21875\).
Valeur exacte : \(\int_0^1 x^2\,dx = \left[\dfrac{x^3}{3}\right]_0^1 = \dfrac13 \approx 0{,}333\). Avec les rectangles à droite on trouverait \(0{,}46875\) : la valeur exacte est encadrée. Avec \(n = 1000\), on obtient \(S_n \approx 0{,}3328\), beaucoup plus proche.

Pour une fonction croissante sur \([a;b]\), la méthode des rectangles à gauche donne :

  1. une valeur par excès de l'intégrale
  2. une valeur par défaut de l'intégrale
  3. toujours la valeur exacte
Si \(f\) est croissante, la valeur au bord gauche est la plus petite de chaque bande : les rectangles sont sous la courbe, donc la somme est inférieure à l'intégrale.

Que faut-il changer pour obtenir les rectangles à droite dans la fonction rectangles ?

  1. Remplacer h = (b - a) / n par h = (b - a) * n
  2. Remplacer return h * s par return s
  3. Remplacer f(a + k * h) par f(a + (k + 1) * h)
À droite, le rectangle numéro k prend la hauteur au bord droit de sa bande, c'est-à-dire en \(a + (k+1)h\).

Récapitulatif

  • for quand le nombre de tours est connu, while quand on attend qu'une condition change.
  • Dénombrement : un produit accumulé pour \(n!\), des boucles imbriquées pour énumérer et vérifier une formule.
  • Suites : une variable mise à jour dans une boucle ; un seuil se trouve avec while.
  • Intégrale : \(S_n = h\sum_{k=0}^{n-1} f(a+kh)\) avec \(h = \frac{b-a}{n}\) ; plus \(n\) est grand, meilleure est l'approximation.
for ou while ?
for : nombre de tours connu. while : on répète tant qu'une condition est vraie.
range(1, n + 1)
Les entiers de 1 à n (la borne de droite est exclue).
Algorithme de seuil
Tant que u ≤ s : calculer le terme suivant et ajouter 1 à n ; renvoyer n.
Méthode des rectangles
\(h=\frac{b-a}{n}\) et \(S_n = h\sum_{k=0}^{n-1} f(a+kh)\).
Compter les duos parmi 5
Boucles imbriquées avec i < j : 10 duos, comme \(\binom{5}{2}\).

Teste tes connaissances sur ce cours

Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.