EuraStudy
Fiches/Mathématiques/Algorithmique et programmation
Fiches · MathématiquesFR · Bac

Algorithmique et programmation

Python est l'outil numérique transversal du programme de spécialité : il sert à calculer des termes de suites, des sommes et des intégrales approchées, à rechercher un seuil, à encadrer une solution d'équation et à simuler des expériences aléatoires. Ce thème rassemble les bases du langage (variables, conditions, boucles for/while), les fonctions et les listes, les algorithmes liés au programme (seuils, sommes, suites, dichotomie/balayage, méthode des rectangles) et la simulation aléatoire (module random, estimation d'une probabilité par fréquence). On y apprend aussi à lire un programme, à en faire la trace d'exécution et à corriger une erreur.

5 sections·~25 min de lecture·4 compétences·Niveau Base 1 · Standard 2 · Approfondissement 2·Vérifié · 06/2026

T·121212 / 12
Profil d’examen
Écrire, lire, modifier et exécuter « à la main » un programme Python en lien avec le programme (variables, conditions, boucles, fonctions, listes).Programmer un algorithme de recherche de seuil (boucle while) ou de balayage / dichotomie pour encadrer la solution d'une équation f(x)=0.Utiliser fonctions et listes pour structurer un calcul : termes de suites, sommes (accumulateur ou sum), intégrale approchée par la méthode des rectangles.Simuler une expérience aléatoire (loi binomiale, fréquence d'un événement, moyenne d'un échantillon), estimer une probabilité ou une aire et interpréter le résultat.
Opérateurs :écrireliremodifierexécuterprogrammersimulerestimerinterpréterjustifiercorriger

niveau de base

Maîtriser d'abord la lecture et la trace d'exécution d'un programme court (variables, boucle for/while, condition), savoir compléter une ligne manquante et reconnaître l'algorithme attendu (seuil, somme, simulation).

niveau approfondi

En spécialité, savoir écrire entièrement une fonction Python demandée (recherche de seuil, dichotomie, méthode des rectangles, simulation), relier la sortie du programme à un résultat d'analyse (limite, aire, probabilité) et repérer puis corriger une erreur en justifiant la correction.

Profondeur

Profondeur de lecture : Approfondi

Texte

Taille du texte : Standard

Sommaire · 5 sections▾
  1. Algorithmique et programmation
    • 01Bases du langage Python : variables, affectations, conditions, boucles for et while○
    • 02Fonctions et listes : définition, paramètres, valeur de retour, parcours, listes en compréhension◐
    • 03Algorithmes du programme : recherche de seuil, sommes et calcul de termes de suites◐
    • 04Encadrer une solution et approcher une aire : balayage, dichotomie, méthode des rectangles●
    • 05Simulation aléatoire et estimation : module random, fréquences, loi binomiale, lecture et correction d'un programme●
§ 01

Bases du langage Python : variables, affectations, conditions, boucles for et while#

●○○BaseLPBO-2019-spe-maths-terminale-§Algorithmique-et-programmation

for vs while : choisir la bonne boucle

Tableau de 3 colonnes et 3 lignes, cellule mise en évidence : Arrêt sur une conditionTableau de 3 colonnes et 3 lignes, Données: Critère · for · while; Quand l’utiliser · Nombre de tours connu · Arrêt sur une condition; Exemple · Somme de n termes · Recherche de seuil; Sortie · Après n tours · Quand la condition est fausse, cellule mise en évidence : Arrêt sur une conditionCRITÈREFORWHILEQUAND L’UTILISERNombre de tours connuArrêt sur une conditionEXEMPLESomme de n termesRecherche de seuilSORTIEAprès n toursQuand la condition estfausse
Fig. 1On choisit `for` quand le nombre de tours est connu (parcours, somme de n termes) et `while` quand on s'arrête sur une condition (recherche de seuil, précision atteinte).

Points clés

Variable et affectation : une variable est un nom associé à une valeur stockée en mémoire ; l'affectation s'écrit `x = 3` et signifie « ranger la valeur 333 dans la case nommée x » (le `=` n'est PAS une égalité mathématique). Une réaffectation comme `x = x + 1` se lit de droite à gauche : on calcule d'abord `x + 1` avec l'ancienne valeur, puis on la range dans x (on dit qu'on incrémente x). Les types usuels au lycée sont `int` (entier), `float` (réel à virgule, le séparateur décimal est le POINT : `3.5`) et `bool` (`True` / `False`).
Instruction conditionnelle : `if condition: ... elif autre_condition: ... else: ...` exécute un bloc selon la valeur d'un test booléen. Les comparaisons s'écrivent `==` (égal), `!=` (différent), `<`, `<=`, `>`, `>=` ; on combine des tests avec `and`, `or`, `not`. ATTENTION : en Python, c'est l'INDENTATION (le décalage par espaces) qui délimite les blocs — il n'y a ni accolades ni `begin/end`.
Boucle `for` (nombre d'itérations CONNU) : `for k in range(n):` répète le bloc en faisant prendre à k les valeurs 0,1,2,…,n−10, 1, 2, \dots, n-10,1,2,…,n−1 — soit nnn tours. Plus généralement `range(a, b)` parcourt a,a+1,…,b−1a, a+1, \dots, b-1a,a+1,…,b−1 et `range(a, b, p)` avance de ppp en ppp. On l'utilise pour calculer une somme, parcourir une liste, ou itérer une suite explicite.
Boucle `while` (CONDITION D'ARRÊT) : `while condition:` répète le bloc TANT QUE la condition est vraie ; on l'emploie quand on ignore à l'avance le nombre d'itérations, typiquement pour une RECHERCHE DE SEUIL (« combien d'années pour dépasser un capital ? »). Il faut que la condition finisse par devenir fausse, sinon la boucle est infinie.
Différence essentielle : on choisit `for` quand le nombre de répétitions est fixé d'avance (par exemple parcourir une liste ou sommer nnn termes) et `while` quand on s'arrête sur un événement (dépassement d'un seuil, précision atteinte). Dans une recherche de seuil, le compteur d'itérations donne directement le rang ou le nombre de pas cherché.
for k in range(n):⟶k∈{0, 1, 2, …, n−1}  (n tours)\texttt{for k in range(n):}\quad\longrightarrow\quad k \in \{0,\,1,\,2,\,\dots,\,n-1\}\ \ (n\ \text{tours})for k in range(n):⟶k∈{0,1,2,…,n−1}  (n tours)

Sémantique de range

`range(n)` produit les entiers de 000 à n−1n-1n−1 inclus : la boucle effectue exactement nnn itérations, et la borne nnn N'est PAS atteinte.

x←x+1(x = x + 1)x \leftarrow x + 1 \qquad (\texttt{x = x + 1})x←x+1(x = x + 1)

Affectation / incrémentation

On évalue le membre de droite avec l'ANCIENNE valeur de x, puis on range le résultat dans x : c'est une instruction, pas une équation.

Exemple corrigé

Trace d'un programme et choix de la boucle

On donne le programme Python suivant. Indiquer ce qu'il affiche, puis le réécrire avec une boucle `while` produisant le même résultat. ``` s = 0 for k in range(1, 5): s = s + k print(s) ```

  1. 01Suivre la valeur de s tour par tour

    La variable `s` part de 000 ; `k` prend successivement les valeurs 1,2,3,41, 2, 3, 41,2,3,4 (range(1, 5) exclut 555). À chaque tour on ajoute `k` à `s`.

    s:0→0+1=1→1+2=3→3+3=6→6+4=10s : 0 \to 0{+}1{=}1 \to 1{+}2{=}3 \to 3{+}3{=}6 \to 6{+}4{=}10s:0→0+1=1→1+2=3→3+3=6→6+4=10
  2. 02Conclure l'affichage

    Après la boucle, `s` vaut 101010 : le programme calcule 1+2+3+4=101+2+3+4=101+2+3+4=10 et affiche `10`.

    ∑k=14k=4×52=10\sum_{k=1}^{4} k = \frac{4\times 5}{2} = 10k=1∑4​k=24×5​=10
  3. 03Réécrire avec une boucle while

    On introduit un compteur `k` initialisé à 111, qu'on incrémente tant qu'il ne dépasse pas 444 : ``` s = 0 k = 1 while k <= 4: s = s + k k = k + 1 print(s) ``` La condition `k <= 4` joue le rôle de la borne de `range`.

Résultat : Le programme affiche `10` ; la version `while` (compteur `k` de 111 à 444) donne le même résultat. Ici une boucle `for` est plus naturelle car le nombre de tours est connu.

Objectif Bac

  • Objectif Bac : lire un court programme Python et prévoir sa sortie, ou compléter une ligne manquante (condition, borne de `range`, mise à jour d'une variable) pour qu'il réalise la tâche demandée.
  • Objectif Bac : choisir et justifier l'emploi d'une boucle `for` (nombre de termes connu) ou `while` (recherche de seuil) selon la question, et reconnaître que le compteur d'une boucle `while` donne le rang ou le nombre de pas cherché.

Erreurs fréquentes

  • Croire que `for k in range(n)` parcourt 1,2,…,n1, 2, \dots, n1,2,…,n : il parcourt 0,1,…,n−10, 1, \dots, n-10,1,…,n−1 ; la borne nnn est EXCLUE et le premier indice est 000. Pour obtenir 111 à nnn, on écrit `range(1, n+1)`.
  • Confondre `=` (affectation) et `==` (test d'égalité) : `if x = 0:` provoque une erreur ; un test s'écrit `if x == 0:`. De même, oublier l'indentation ou les deux-points `:` après `if`, `for`, `while` casse le programme.

Révision active

Écrire un programme qui demande un entier nnn (`n = 50` par exemple), puis affiche le nombre d'entiers entre 111 et nnn qui sont multiples de 333 (on utilisera une boucle `for`, un test avec l'opérateur `%` de reste, et un compteur incrémenté).

Rappel actif

Rappelle-toi les points clés — puis révèle.

Sources : Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019) (Ministère de l'Éducation nationale — Éduscol)

§ 02

Fonctions et listes : définition, paramètres, valeur de retour, parcours, listes en compréhension#

●●○StandardLPBO-2019-spe-maths-terminale-§Algorithmique-et-programmation

Anatomie d'une fonction Python

Graphe, 4 nœuds, 3 arêtesGraphe, paramètre x → def f(x) : bloc, def f(x) : bloc → return v, return v → y = f(a)paramètre xdef f(x) : blocreturn vy = f(a)
Fig. 2Une fonction reçoit un (ou plusieurs) paramètre, exécute son bloc, puis RENVOIE une valeur via `return` — réutilisable dans un calcul (ici l'accumulateur d'une somme).

Points clés

Définir une FONCTION : `def f(x): ... return resultat`. Le mot-clé `def` ouvre la définition, `x` est un PARAMÈTRE (une variable d'entrée), et `return` renvoie la VALEUR DE RETOUR puis termine l'exécution de la fonction. On appelle ensuite la fonction par `f(2)`, qui vaut la valeur renvoyée. Une fonction peut avoir plusieurs paramètres : `def somme(a, b): return a + b`. Sans `return`, la fonction renvoie `None` (rien d'utilisable).
Distinguer `return` et `print` : `return` RENVOIE une valeur réutilisable dans un calcul (`y = f(3)`), tandis que `print` se contente d'AFFICHER à l'écran sans renvoyer de valeur exploitable. Pour structurer un calcul (sommer, comparer, itérer), il faut `return`.
Une LISTE est une collection ordonnée et modifiable de valeurs, notée entre crochets : `L = [3, 7, 1, 9]`. On accède au terme d'indice iii par `L[i]` — les indices commencent à 000, donc `L[0]` vaut 333 et `L[-1]` vaut le dernier terme. `len(L)` donne la longueur, `L.append(v)` ajoute `v` à la fin, et on parcourt la liste par `for x in L:` (sur les valeurs) ou `for i in range(len(L)):` (sur les indices).
LISTE EN COMPRÉHENSION : `[f(k) for k in range(n)]` construit en une ligne la liste [f(0),f(1),…,f(n−1)][f(0), f(1), \dots, f(n-1)][f(0),f(1),…,f(n−1)]. C'est l'outil idéal pour fabriquer la liste des termes d'une suite uku_kuk​, des images f(xk)f(x_k)f(xk​) ou des valeurs d'une simulation. On peut filtrer : `[k for k in range(20) if k % 2 == 0]` ne garde que les entiers pairs.
Sommer une liste de valeurs : soit avec la fonction intégrée `sum(L)`, soit « à la main » avec un ACCUMULATEUR — on initialise `s = 0`, puis `for x in L: s = s + x`. L'accumulateur est le motif universel pour calculer une somme ∑uk\sum u_k∑uk​ ou une aire approchée ; `sum` est un raccourci équivalent.
def f(x): return ...appel : y=f(a) vaut la valeur renvoyeˊe\texttt{def f(x): return ...}\qquad\text{appel : } y = f(a)\ \text{vaut la valeur renvoyée}def f(x): return ...appel : y=f(a) vaut la valeur renvoyeˊe

Définition et appel d'une fonction

`def` crée la fonction, `return` fixe la valeur de sortie ; l'appel `f(a)` remplace le paramètre par l'argument aaa et renvoie le résultat.

[f(k) for k in range(n)]  =  [ f(0), f(1), …, f(n−1) ]\texttt{[f(k) for k in range(n)]} \;=\; \big[\,f(0),\ f(1),\ \dots,\ f(n-1)\,\big][f(k) for k in range(n)]=[f(0), f(1), …, f(n−1)]

Liste en compréhension

Construit en une instruction la liste des nnn premières images : c'est la traduction directe d'une famille (f(k))0≤k≤n−1(f(k))_{0\le k\le n-1}(f(k))0≤k≤n−1​.

s = 0  ;  for x in L: s = s + x⟺sum(L)  =  ∑k=0 ∣L∣−1L[k]\texttt{s = 0} \;;\; \texttt{for x in L: s = s + x} \quad\Longleftrightarrow\quad \texttt{sum(L)} \;=\; \sum_{k=0}^{\,|L|-1} L[k]s = 0;for x in L: s = s + x⟺sum(L)=k=0∑∣L∣−1​L[k]

Somme par accumulateur

L'accumulateur `s` cumule les termes un à un ; `sum(L)` réalise exactement la même somme.

Exemple corrigé

Fonction renvoyant un terme de suite et somme par accumulateur

Soit la suite définie par un=1n+1u_n = \dfrac{1}{n+1}un​=n+11​ pour n≥0n \ge 0n≥0. 1. Écrire une fonction Python `u(n)` qui renvoie unu_nun​. 2. Écrire une fonction `somme(N)` qui renvoie la somme SN=u0+u1+⋯+uNS_N = u_0 + u_1 + \dots + u_NSN​=u0​+u1​+⋯+uN​ à l'aide d'un accumulateur. 3. Donner la valeur affichée par `somme(3)`.

  1. 01Définir la fonction u

    Le terme est explicite : on renvoie directement 1n+1\frac{1}{n+1}n+11​. ``` def u(n): return 1 / (n + 1) ```

  2. 02Construire la somme par accumulateur

    On initialise l'accumulateur `s = 0`, puis on ajoute `u(k)` pour `k` de 000 à NNN inclus (donc `range(N + 1)`). ``` def somme(N): s = 0 for k in range(N + 1): s = s + u(k) return s ```

    SN=∑k=0N1k+1S_N = \sum_{k=0}^{N} \frac{1}{k+1}SN​=k=0∑N​k+11​
  3. 03Évaluer somme(3)

    On somme les quatre premiers termes u0,u1,u2,u3u_0, u_1, u_2, u_3u0​,u1​,u2​,u3​.

    S3=1+12+13+14=12+6+4+312=2512≈2,083S_3 = 1 + \tfrac{1}{2} + \tfrac{1}{3} + \tfrac{1}{4} = \tfrac{12+6+4+3}{12} = \tfrac{25}{12} \approx 2{,}083S3​=1+21​+31​+41​=1212+6+4+3​=1225​≈2,083

Résultat : `u(n)` renvoie 1n+1\frac{1}{n+1}n+11​, `somme(N)` cumule les termes par accumulateur, et `somme(3)` affiche 2512≈2,083\frac{25}{12} \approx 2{,}0831225​≈2,083.

Objectif Bac

  • Objectif Bac : écrire une fonction Python `def u(n): ...` renvoyant le terme de rang nnn d'une suite (explicite ou par itération de la récurrence), puis l'utiliser pour construire la liste des premiers termes ou en calculer la somme.
  • Objectif Bac : reconnaître et compléter un calcul de somme par accumulateur (`s = 0` puis `s = s + ...`) ou par liste en compréhension, et relier la sortie de la fonction au résultat mathématique attendu (terme, somme, moyenne).

Erreurs fréquentes

  • Confondre `return` et `print` : une fonction qui se contente de `print(x)` ne renvoie rien d'exploitable, donc `y = f(3)` vaut `None` et tout calcul ultérieur échoue. Pour réutiliser la valeur, il faut `return`.
  • Se tromper d'indice : `L[0]` est le PREMIER terme (pas `L[1]`), et `L[len(L)]` n'existe pas (dernier indice valide =len(L)−1= \text{len}(L)-1=len(L)−1), ce qui provoque une erreur d'« index out of range ».

Révision active

On considère la suite définie par u0=2u_0 = 2u0​=2 et un+1=0,5 un+3u_{n+1} = 0{,}5\,u_n + 3un+1​=0,5un​+3. Écrire une fonction `terme(n)` qui renvoie unu_nun​ en itérant la relation de récurrence avec une boucle `for`, puis construire par compréhension la liste `[terme(k) for k in range(8)]` des huit premiers termes.

Rappel actif

Rappelle-toi les points clés — puis révèle.

Sources : Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019) (Ministère de l'Éducation nationale — Éduscol)

§ 03

Algorithmes du programme : recherche de seuil, sommes et calcul de termes de suites#

●●○StandardLPBO-2019-spe-maths-terminale-§Algorithmique-et-programmation

Organigramme d'une recherche de seuil (boucle while)

Graphe, 4 nœuds, 4 arêtesGraphe, u = u₀ ; n = 0 → u < S ?, u < S ? → u = g(u) ; n = n + 1, u = g(u) ; n = n + 1 → u < S ?, u < S ? → renvoyer nu = u₀ ; n = 0u < S ?u = g(u) ; n = n + 1renvoyer nouibouclenon
Fig. 3On part de u=u0u = u_0u=u0​ et n=0n = 0n=0, puis tant que u<Su < Su<S on itère la suite (u←g(u)u \leftarrow g(u)u←g(u)) et on incrémente nnn ; dès que u≥Su \ge Su≥S, on sort et nnn est le rang cherché.

Points clés

RECHERCHE DE SEUIL : pour une suite (un)(u_n)(un​) qui tend vers +∞+\infty+∞ (ou converge), on cherche le plus petit rang nnn tel que unu_nun​ dépasse (ou approche à ε\varepsilonε près) une valeur fixée. On itère la relation de récurrence dans une boucle `while` qui s'arrête dès que le seuil est atteint, en comptant les tours. La SORTIE de l'algorithme est le rang cherché ; l'analyse (comportement de qnq^nqn, croissances comparées, limite monotone) garantit ensuite que ce rang existe.
Calcul d'un TERME de suite : si unu_nun​ est explicite (un=f(n)u_n = f(n)un​=f(n)), on renvoie directement `f(n)` ; si la suite est définie par récurrence un+1=g(un)u_{n+1} = g(u_n)un+1​=g(un​), on part de u0u_0u0​ et on applique ggg exactement nnn fois dans une boucle `for k in range(n)`. C'est le squelette de toute fonction `terme(n)`.
Calcul d'une SOMME : on accumule. Pour SN=∑k=0NukS_N = \sum_{k=0}^{N} u_kSN​=∑k=0N​uk​, on initialise `s = 0`, puis on ajoute chaque terme dans une boucle `for k in range(N + 1)`. Variante : construire la liste des termes par compréhension puis appliquer `sum`. Attention au nombre de termes : la somme de u0u_0u0​ à uNu_NuN​ comporte N+1N+1N+1 termes, d'où `range(N + 1)`.
Schéma type de la boucle de seuil : `n = 0 ; u = u0 ; while u < S: u = g(u) ; n = n + 1`. À la sortie, `n` est le premier rang tel que `u >= S`. On adapte le test (`u > S`, `abs(u - L) <= eps`, etc.) selon la question, et on veille à incrémenter `n` au bon endroit pour que le compteur corresponde au rang réel.
LIEN ANALYSE / ALGORITHME : l'algorithme calcule numériquement un seuil ou une somme, mais ne PROUVE rien à lui seul — il faut justifier mathématiquement l'existence du seuil (par exemple « qn→+∞q^n \to +\inftyqn→+∞ donc le seuil est franchi ») ou la valeur de la somme (formule de la somme géométrique). Python donne la valeur, l'analyse la justifie.
Seuil : plus petit n tel que un≥S⟶while u < S: u = g(u); n = n + 1\text{Seuil : plus petit } n \text{ tel que } u_n \ge S \quad\longrightarrow\quad \texttt{while u < S: u = g(u); n = n + 1}Seuil : plus petit n tel que un​≥S⟶while u < S: u = g(u); n = n + 1

Algorithme de recherche de seuil (while)

On itère la suite tant que le seuil SSS n'est pas atteint ; le compteur `n` donne le rang du premier dépassement.

SN=∑k=0Nuk⟶s = 0; for k in range(N+1): s = s + u(k)S_N = \sum_{k=0}^{N} u_k \quad\longrightarrow\quad \texttt{s = 0; for k in range(N+1): s = s + u(k)}SN​=k=0∑N​uk​⟶s = 0; for k in range(N+1): s = s + u(k)

Somme par accumulateur

L'accumulateur cumule les N+1N+1N+1 termes de rang 000 à NNN : la borne `range(N+1)` garantit le bon compte.

Recherche de seuil : u₀ = 100, uₙ₊₁ = 1,08 uₙ ; premier rang où uₙ > 200

Fig. 4La suite géométrique de raison 1,08 croît jusqu'à franchir le seuil 200 : la boucle `while` s'arrête au premier rang dépassant la barre, ici n = 10 (u₁₀ ≈215,9).
Exemple corrigé

Recherche de seuil par boucle while

Une espèce végétale invasive couvre une surface S0=12S_0 = 12S0​=12 hectares et s'étend de 20%20\%20% par an : Sn+1=1,2 SnS_{n+1} = 1{,}2\,S_nSn+1​=1,2Sn​. On souhaite connaître le nombre d'années au bout duquel la surface dépasse 505050 hectares. 1. Écrire une fonction Python `seuil()` qui renvoie ce nombre d'années. 2. Déterminer sa valeur par une trace, et justifier que ce seuil existe.

  1. 01Écrire la fonction

    On part de la surface initiale et on multiplie par 1,21{,}21,2 tant qu'on n'a pas dépassé 505050, en comptant les années. ``` def seuil(): S = 12 n = 0 while S <= 50: S = 1.2 * S n = n + 1 return n ```

  2. 02Tracer les valeurs successives

    On suit SSS jusqu'au premier dépassement de 505050.

    S:12→14,4→17,3→20,7→24,9→29,9→35,8→43,0→51,6S: 12 \to 14{,}4 \to 17{,}3 \to 20{,}7 \to 24{,}9 \to 29{,}9 \to 35{,}8 \to 43{,}0 \to 51{,}6S:12→14,4→17,3→20,7→24,9→29,9→35,8→43,0→51,6
  3. 03Conclure et justifier

    Le seuil 505050 est franchi au 8e8^{\text{e}}8e tour (S8≈51,6>50S_8 \approx 51{,}6 > 50S8​≈51,6>50), donc `seuil()` renvoie 888. L'existence du seuil est garantie car (Sn)(S_n)(Sn​) est géométrique de raison 1,2>11{,}2 > 11,2>1, donc Sn=12×1,2 n→+∞S_n = 12 \times 1{,}2^{\,n} \to +\inftySn​=12×1,2n→+∞ : toute valeur, en particulier 505050, finit par être dépassée.

    Sn=12×1,2 n→n→+∞+∞S_n = 12 \times 1{,}2^{\,n} \xrightarrow[n\to+\infty]{} +\inftySn​=12×1,2nn→+∞​+∞

Résultat : `seuil()` renvoie 888 : il faut 888 ans pour dépasser 505050 hectares. Le franchissement est certain car 1,2>11{,}2 > 11,2>1 entraîne Sn→+∞S_n \to +\inftySn​→+∞.

Objectif Bac

  • Objectif Bac : écrire une fonction `seuil(S)` qui renvoie le plus petit rang nnn tel que un≥Su_n \ge Sun​≥S à l'aide d'une boucle `while`, et interpréter ce rang dans le contexte (nombre d'années, de doses, etc.).
  • Objectif Bac : relier la sortie de l'algorithme à un résultat d'analyse — justifier que le seuil est atteint (comportement de qnq^nqn, croissance non majorée) et que la somme programmée coïncide avec la formule mathématique.

Erreurs fréquentes

  • Incrémenter le compteur au mauvais endroit ou décaler le test : selon que l'on incrémente avant ou après la mise à jour de `u`, le rang renvoyé peut être décalé de 111. Il faut tracer un ou deux tours pour vérifier que `n` correspond bien au rang du premier dépassement.
  • Mettre une condition d'arrêt qui ne devient jamais fausse (boucle infinie) : par exemple `while u < S` avec une suite DÉCROISSANTE qui n'atteint jamais SSS, ou un oubli de la mise à jour de `u` dans la boucle.

Révision active

Un capital de 150015001500 € placé à 4%4\%4% par an suit C0=1500C_0 = 1500C0​=1500, Cn+1=1,04 CnC_{n+1} = 1{,}04\,C_nCn+1​=1,04Cn​. Écrire une fonction `annees()` qui renvoie le nombre d'années nécessaires pour que le capital dépasse 200020002000 €, puis justifier mathématiquement que ce seuil est forcément atteint.

Rappel actif

Rappelle-toi les points clés — puis révèle.

Sources : Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019) (Ministère de l'Éducation nationale — Éduscol)

§ 04

Encadrer une solution et approcher une aire : balayage, dichotomie, méthode des rectangles#

●●●ApprofondissementLPBO-2019-spe-maths-terminale-§Algorithmique-et-programmation

Dichotomie : encadrement successif d'une racine

Tableau de 6 colonnes et 4 lignes, cellule mise en évidence : 0,125Tableau de 6 colonnes et 4 lignes, Données: n · aₙ · bₙ · mₙ · signe f(mₙ) · bₙ − aₙ; 1 · 1 · 2 · 1,5 · + · 1; 2 · 1 · 1,5 · 1,25 · − · 0,5; 3 · 1,25 · 1,5 · 1,375 · − · 0,25; 4 · 1,375 · 1,5 · 1,4375 · + · 0,125, cellule mise en évidence : 0,125NAₙBₙMₙSIGNE F(Mₙ)Bₙ − Aₙ1121,5+1211,51,25−0,531,251,51,375−0,2541,3751,51,4375+0,125
Fig. 5À chaque étape, on calcule le milieu mmm et on garde la moitié où fff change de signe : l'encadrement de la racine α\alphaα est divisé par deux à chaque tour.

Points clés

BALAYAGE : pour encadrer une solution de f(x)=0f(x) = 0f(x)=0 sur [a ;b][a\,;b][a;b] (où fff est continue et monotone, avec f(a)f(a)f(a) et f(b)f(b)f(b) de signes contraires), on parcourt l'intervalle par petits pas ppp depuis aaa et on s'arrête dès que fff change de signe ; on obtient alors un encadrement de la racine d'amplitude ppp. C'est simple mais lent : pour une précision p=10−kp = 10^{-k}p=10−k, il faut beaucoup de pas.
DICHOTOMIE : méthode plus efficace, qui DIVISE l'intervalle en DEUX à chaque étape. On calcule le milieu m=a+b2m = \frac{a+b}{2}m=2a+b​ ; si f(a)f(a)f(a) et f(m)f(m)f(m) sont de signes contraires, la racine est dans [a ;m][a\,;m][a;m] (on pose b=mb = mb=m), sinon elle est dans [m ;b][m\,;b][m;b] (on pose a=ma = ma=m). À chaque tour, l'amplitude de l'encadrement est DIVISÉE PAR DEUX ; on répète jusqu'à atteindre la précision voulue b−a≤εb - a \le \varepsilonb−a≤ε.
Théorème sous-jacent (admis au lycée) : si fff est continue sur [a ;b][a\,;b][a;b] et change de signe (f(a)×f(b)<0f(a) \times f(b) < 0f(a)×f(b)<0), alors l'équation f(x)=0f(x) = 0f(x)=0 admet (au moins) une solution dans [a ;b][a\,;b][a;b] ; si de plus fff est strictement monotone, cette solution est unique. La dichotomie en construit un encadrement aussi fin qu'on veut.
MÉTHODE DES RECTANGLES : pour approcher ∫abf(x) dx\int_a^b f(x)\,dx∫ab​f(x)dx (aire sous la courbe pour f≥0f \ge 0f≥0), on découpe [a ;b][a\,;b][a;b] en nnn sous-intervalles de même largeur h=b−anh = \frac{b-a}{n}h=nb−a​. L'aire est approchée par la somme des aires de nnn rectangles, chacun de largeur hhh et de hauteur f(xk)f(x_k)f(xk​) où xk=a+k hx_k = a + k\,hxk​=a+kh : ∫abf≈h∑k=0n−1f(a+k h)\int_a^b f \approx h \sum_{k=0}^{n-1} f(a + k\,h)∫ab​f≈h∑k=0n−1​f(a+kh). Plus nnn est grand, plus l'approximation est précise.
En Python : la dichotomie s'écrit avec une boucle `while b - a > eps` qui met à jour `a` ou `b` selon le signe de `f(m)` ; la méthode des rectangles avec une boucle `for k in range(n)` qui accumule `h f(a + kh)`. Dans les deux cas, l'algorithme fournit une valeur approchée que l'analyse (continuité, signe, valeur de l'intégrale exacte) vient encadrer ou justifier.
∫abf(x) dx  ≈  h∑k=0n−1f(a+k h),h=b−an\int_a^b f(x)\,dx \;\approx\; h\sum_{k=0}^{n-1} f(a + k\,h), \qquad h = \frac{b-a}{n}∫ab​f(x)dx≈hk=0∑n−1​f(a+kh),h=nb−a​

Méthode des rectangles (à gauche)

On somme les aires de nnn rectangles de largeur hhh et de hauteur f(xk)f(x_k)f(xk​) : c'est une somme de Riemann qui tend vers l'intégrale quand n→+∞n \to +\inftyn→+∞.

m=a+b2,f(a) f(m)<0⇒b←m,sinon a←m(amplitude ÷2 par tour)m = \frac{a+b}{2}, \quad f(a)\,f(m) < 0 \Rightarrow b \leftarrow m, \quad \text{sinon } a \leftarrow m \quad (\text{amplitude } \div 2 \text{ par tour})m=2a+b​,f(a)f(m)<0⇒b←m,sinon a←m(amplitude ÷2 par tour)

Dichotomie

À chaque étape, le milieu remplace la borne du même signe : l'intervalle contenant la racine est divisé par deux, donc l'encadrement converge très vite.

Méthode des rectangles sous la courbe

Diagramme en colonnes: f(xₖ) selon x, 5 valeurs (maximum 4.6)Diagramme en colonnes: f(xₖ) selon x, Données: hauteur f(xₖ) · x₀: 1.1; hauteur f(xₖ) · x₁: 1.7; hauteur f(xₖ) · x₂: 2.5; hauteur f(xₖ) · x₃: 3.5; hauteur f(xₖ) · x₄: 4.601234x₀x₁x₂x₃x₄f(xₖ)x
Fig. 6On découpe [a ;b][a\,;b][a;b] en nnn tranches de largeur hhh ; chaque rectangle a pour hauteur f(xk)f(x_k)f(xk​). La somme de leurs aires approche ∫abf\int_a^b f∫ab​f — d'autant mieux que nnn est grand.

Méthode des rectangles : approximation de ∫₀¹ x² dx = 1/3 ≈ 0,333 selon n

Fig. 7L'approximation par rectangles (à gauche) de ∫₀¹ x² dx se rapproche de la valeur exacte 1/3 quand le nombre de subdivisions n augmente : sous-estimation qui converge par le bas.
Exemple corrigé

Méthode des rectangles pour approcher une intégrale

On veut approcher I=∫01x2 dxI = \displaystyle\int_0^1 x^2\,dxI=∫01​x2dx par la méthode des rectangles à gauche. 1. Écrire une fonction Python `rectangles(n)` qui renvoie l'approximation de III avec nnn rectangles. 2. Donner l'approximation obtenue pour n=4n = 4n=4. 3. Comparer à la valeur exacte et expliquer le sens de l'écart.

  1. 01Écrire la fonction

    La largeur d'un rectangle est h=1−0nh = \frac{1 - 0}{n}h=n1−0​ ; on accumule h×f(xk)h \times f(x_k)h×f(xk​) avec f(x)=x2f(x) = x^2f(x)=x2 et xk=k hx_k = k\,hxk​=kh pour kkk de 000 à n−1n-1n−1. ``` def rectangles(n): a, b = 0, 1 h = (b - a) / n s = 0 for k in range(n): x = a + k * h s = s + h x*2 return s ```

  2. 02Calculer pour n = 4

    Avec n=4n = 4n=4, h=0,25h = 0{,}25h=0,25 et les abscisses xk=0, 0,25, 0,5, 0,75x_k = 0,\ 0{,}25,\ 0{,}5,\ 0{,}75xk​=0, 0,25, 0,5, 0,75. On somme les aires h×xk2h \times x_k^2h×xk2​.

    0,25 (02+0,252+0,52+0,752)=0,25×0,875=0,218750{,}25\,(0^2 + 0{,}25^2 + 0{,}5^2 + 0{,}75^2) = 0{,}25\times 0{,}875 = 0{,}218750,25(02+0,252+0,52+0,752)=0,25×0,875=0,21875
  3. 03Comparer à la valeur exacte

    La valeur exacte de l'intégrale est 13≈0,333\frac{1}{3} \approx 0{,}33331​≈0,333. L'approximation 0,218750{,}218750,21875 est INFÉRIEURE : avec des rectangles à gauche et fff croissante, chaque rectangle est entièrement sous la courbe, d'où une SOUS-ESTIMATION qui se réduit quand nnn grandit.

    ∫01x2 dx=[x33]01=13≈0,333\int_0^1 x^2\,dx = \left[\frac{x^3}{3}\right]_0^1 = \frac{1}{3} \approx 0{,}333∫01​x2dx=[3x3​]01​=31​≈0,333

Résultat : `rectangles(4)` renvoie 0,218750{,}218750,21875, valeur approchée par défaut de 13≈0,333\frac{1}{3} \approx 0{,}33331​≈0,333 ; l'écart vient des rectangles à gauche sous une fonction croissante (sous-estimation), et il diminue lorsque nnn augmente.

Objectif Bac

  • Objectif Bac : programmer une dichotomie qui renvoie un encadrement d'amplitude ≤ε\le \varepsilon≤ε de la solution de f(x)=0f(x) = 0f(x)=0, et justifier l'existence-unicité de la solution (continuité + changement de signe + stricte monotonie).
  • Objectif Bac : écrire la méthode des rectangles pour approcher ∫abf\int_a^b f∫ab​f, faire varier nnn pour améliorer la précision, et interpréter le résultat comme une aire (sous-estimation ou sur-estimation selon le sens de variation de fff).

Erreurs fréquentes

  • Mal tester le changement de signe : il faut comparer le signe de `f(a) * f(m)` (produit négatif = signes contraires), pas comparer f(m)f(m)f(m) à une valeur. Une erreur de signe envoie la dichotomie dans la mauvaise moitié et fausse l'encadrement.
  • Pour les rectangles, se tromper de bornes ou de hauteur : la somme va de k=0k = 0k=0 à n−1n-1n−1 (rectangles à GAUCHE : hauteur f(a+k h)f(a + k\,h)f(a+kh)) ; oublier le facteur de largeur hhh, ou faire n+1n+1n+1 rectangles, donne un résultat faux.

Révision active

Soit f(x)=x3+x−1f(x) = x^3 + x - 1f(x)=x3+x−1. Vérifier que fff est strictement croissante et que l'équation f(x)=0f(x) = 0f(x)=0 a une unique solution dans [0 ;1][0\,;1][0;1], puis écrire une fonction `dichotomie(eps)` qui renvoie un encadrement de cette solution d'amplitude inférieure à `eps`.

Rappel actif

Rappelle-toi les points clés — puis révèle.

Sources : Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019) (Ministère de l'Éducation nationale — Éduscol)

§ 05

Simulation aléatoire et estimation : module random, fréquences, loi binomiale, lecture et correction d'un programme#

●●●ApprofondissementLPBO-2019-spe-maths-terminale-§Algorithmique-et-programmation

Trace d'exécution tabulée d'une boucle de simulation

Tableau de 3 colonnes et 4 lignes, cellule mise en évidence : 3Tableau de 3 colonnes et 4 lignes, Données: tour i · tirage · s (succès); 1 · succès · 1; 2 · échec · 1; 3 · succès · 2; 4 · succès · 3, cellule mise en évidence : 3TOUR ITIRAGES (SUCCÈS)1succès12échec13succès24succès3
Fig. 8Faire la trace d'une boucle, c'est suivre la valeur de chaque variable tour par tour ; ici un compteur de succès `s` croît selon les tirages, et la fréquence `s/N` estime la probabilité.

Points clés

GÉNÉRATION DE NOMBRES ALÉATOIRES : le module `random` fournit `random()` qui renvoie un réel pseudo-aléatoire dans [0 ;1[[0\,;1[[0;1[ (loi uniforme), et `randint(a, b)` qui renvoie un entier aléatoire entre aaa et bbb INCLUS (par exemple `randint(1, 6)` simule un dé). Pour simuler un événement de probabilité ppp, on teste `random() < p` (vrai avec probabilité ppp).
ESTIMER UNE PROBABILITÉ PAR FRÉQUENCE : on répète NNN fois l'expérience, on compte le nombre de succès, et la FRÉQUENCE observée succeˋsN\frac{\text{succès}}{N}Nsucceˋs​ estime la probabilité ppp. La loi des grands nombres garantit que cette fréquence se rapproche de ppp quand NNN devient grand : plus on répète, plus l'estimation est fiable.
SIMULER UNE LOI BINOMIALE : une variable X∼B(n,p)X \sim \mathcal{B}(n, p)X∼B(n,p) compte le nombre de succès en nnn épreuves de Bernoulli indépendantes de paramètre ppp. On la simule par une fonction qui répète nnn tirages `random() < p` et compte les succès. En répétant cette simulation un grand nombre de fois, l'HISTOGRAMME des valeurs obtenues approche la distribution théorique de XXX (centrée autour de npnpnp).
ESTIMER UNE AIRE / PROBABILITÉ PAR MONTE-CARLO : on peut estimer une aire (ou une probabilité géométrique) en tirant des points aléatoires et en comptant la proportion qui tombe dans une région ; cette fréquence approche l'aire cherchée. La MOYENNE EMPIRIQUE d'un échantillon (moyenne des valeurs simulées) estime de même l'espérance théorique.
LIRE, TRACER ET CORRIGER un programme : faire la TRACE D'EXÉCUTION consiste à dresser un tableau des valeurs successives des variables, tour par tour, pour comprendre ou vérifier un programme. Pour CORRIGER une erreur, on repère le symptôme (résultat faux, boucle infinie, sortie décalée), on localise l'instruction fautive (borne de `range` erronée, test mal placé, compteur non incrémenté, `==`/`=` confondus) et on COMMENTE la correction apportée.
P(succeˋs)=p  ⟶  random() < p,p^=nombre de succeˋsN→N→+∞pP(\text{succès}) = p \;\longrightarrow\; \texttt{random() < p}, \qquad \widehat{p} = \frac{\text{nombre de succès}}{N} \xrightarrow[N\to+\infty]{} pP(succeˋs)=p⟶random() < p,p​=Nnombre de succeˋs​N→+∞​p

Estimation d'une probabilité par fréquence

Le test `random() < p` réussit avec probabilité ppp ; la fréquence des succès sur NNN répétitions estime ppp et s'en rapproche (loi des grands nombres).

X∼B(n,p):X=#{succeˋs parmi n tirages},E(X)=npX \sim \mathcal{B}(n, p) : \quad X = \#\{\text{succès parmi } n \text{ tirages}\}, \qquad E(X) = npX∼B(n,p):X=#{succeˋs parmi n tirages},E(X)=np

Loi binomiale simulée

On simule XXX en comptant les succès de nnn épreuves de Bernoulli ; la moyenne empirique des simulations approche l'espérance npnpnp.

Histogramme d'une simulation de X ∼ B(10 ; 0,5) (1 000 répétitions)

Fig. 9En répétant la simulation de X (nombre de piles sur 10 lancers), l'histogramme des fréquences se concentre autour de E(X) = np = 5 et approche la loi binomiale théorique.
Exemple corrigé

Simuler une probabilité par fréquence et corriger un programme

On veut estimer la probabilité d'obtenir « au moins un 666 » en lançant un dé équilibré 444 fois. Un élève propose le programme suivant, qui renvoie un résultat manifestement trop faible. ``` from random import randint def estime(N): succes = 0 for i in range(N): six = False for j in range(4): if randint(1, 5) == 6: six = True if six: succes = succes + 1 return succes / N ``` 1. Repérer l'erreur. 2. Corriger le programme et commenter. 3. Donner la probabilité théorique pour valider l'ordre de grandeur attendu.

  1. 01Repérer l'erreur

    Le tirage `randint(1, 5)` ne produit JAMAIS la valeur 666 (les entiers tirés vont de 111 à 555 inclus). La condition `== 6` est donc toujours fausse, `six` reste `False`, et la fonction renvoie toujours 000 : c'est pourquoi le résultat est trop faible (nul).

  2. 02Corriger et commenter

    On simule un vrai dé à six faces avec `randint(1, 6)` (les deux bornes sont incluses) : ``` from random import randint def estime(N): succes = 0 for i in range(N): six = False for j in range(4): if randint(1, 6) == 6: # dé à 6 faces : borne haute = 6 six = True if six: succes = succes + 1 return succes / N ``` La correction porte sur la borne supérieure du `randint`, qui doit valoir 666 pour qu'un 666 puisse sortir.

  3. 03Valider par le calcul théorique

    La probabilité de n'obtenir AUCUN 666 sur 444 lancers est (56)4\left(\frac{5}{6}\right)^4(65​)4 ; donc « au moins un 666 » a pour probabilité son complément.

    P(au moins un 6)=1−(56)4=1−6251296≈0,518P(\text{au moins un } 6) = 1 - \left(\frac{5}{6}\right)^4 = 1 - \frac{625}{1296} \approx 0{,}518P(au moins un 6)=1−(65​)4=1−1296625​≈0,518

Résultat : L'erreur était `randint(1, 5)` au lieu de `randint(1, 6)` (le 666 ne pouvait jamais sortir). Après correction, la fréquence simulée pour NNN grand approche la valeur théorique 1−(5/6)4≈0,5181 - (5/6)^4 \approx 0{,}5181−(5/6)4≈0,518.

Objectif Bac

  • Objectif Bac : écrire une fonction qui simule une expérience aléatoire (lancer, épreuve de Bernoulli, loi binomiale) avec `random()` ou `randint`, répéter NNN fois et renvoyer la FRÉQUENCE d'un événement comme estimation de sa probabilité.
  • Objectif Bac : interpréter une estimation par simulation (fréquence ≈\approx≈ probabilité, moyenne empirique ≈\approx≈ espérance), savoir que la précision croît avec NNN (loi des grands nombres), et repérer/corriger une erreur dans un programme de simulation fourni.

Erreurs fréquentes

  • Mal traduire la probabilité ppp : pour simuler un succès de probabilité ppp, on teste `random() < p`, et NON `random() < 1 - p` qui simule l'échec (probabilité 1−p1 - p1−p). À noter : comme `random()` renvoie un réel sur [0 ;1[[0\,;1[[0;1[, l'égalité exacte est de probabilité nulle, donc `random() <= p` a la même probabilité ppp que `random() < p` — la vraie distinction utile est `< p` (succès) contre `< 1 - p` (échec). Oublier que `randint(1, 6)` inclut les DEUX bornes est une autre erreur fréquente.
  • Confondre estimation et valeur exacte : une fréquence simulée APPROCHE la probabilité, elle ne la prouve pas et varie d'une exécution à l'autre ; annoncer « la probabilité vaut exactement 0,480{,}480,48 » à partir d'une seule simulation est faux.

Révision active

Écrire une fonction `frequence(N)` qui simule NNN lancers de deux dés à six faces (avec `randint`) et renvoie la fréquence de l'événement « la somme des deux dés vaut 777 ». Faire tourner pour N=10 000N = 10\,000N=10000 et comparer à la probabilité théorique 636=16≈0,167\frac{6}{36} = \frac{1}{6} \approx 0{,}167366​=61​≈0,167.

Rappel actif

Rappelle-toi les points clés — puis révèle.

Sources : Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019) (Ministère de l'Éducation nationale — Éduscol)

Sommaire

Section -- / 05

    • 01Bases du langage Python : variables, affectations, conditions, boucles for et while○
    • 02Fonctions et listes : définition, paramètres, valeur de retour, parcours, listes en compréhension◐
    • 03Algorithmes du programme : recherche de seuil, sommes et calcul de termes de suites◐
    • 04Encadrer une solution et approcher une aire : balayage, dichotomie, méthode des rectangles●
    • 05Simulation aléatoire et estimation : module random, fréquences, loi binomiale, lecture et correction d'un programme●

0/5 Lues

Des fiches à l'entraînement

Algorithmique et programmation

Consolide ce thème avec des questions de la banque de questions.

~25
min
4
Compétences
S'entraîner

Références et sources

Sources

Ministère de l'Éducation nationale — Éduscol

  • Programme de spécialité mathématiques — classe terminale (BO spécial n° 8 du 25 juillet 2019)

Chapitre précédent

Sommes de variables aléatoires

EuraStudy·Fiches T·12·MMXXVI

Dernier chapitre de cette matière — retour à la vue d’ensemble de la matière.