En classe de Seconde, le programme stipule que l’on doit savoir obtenir un encadrement de √2 par balayage à l’aide de Python.
Nous allons voir sur cette page l’idée qu’il y a derrière cette opération et le script Python.

Le principe mathématique
On sait que si 0<a<r<b alors 0<a2<r2<b2.
On cherche deux nombres a et b tels que:a<√2<b donc tels que:a2<(√2)2<b2.
De plus, on sait que 1<2<3donc l’idée est de partir de a=√1=1 et de lui ajouter un pas très petit, par exemple 10−n où n est un entier naturel, jusqu’à obtenir:a2<2<(a+10−n)2.
Un exemple pas à pas
Posons a = 1 et b = a + 0,1. On calcule ensuite a² et b² et on regarde si a² < 2 < b². On a a² = 1 et b² = 1,1² = 1,21 donc 2 n’est pas compris entre a² et b².
Dans ce cas, on pose a = b = 1,1 puis b = a + 0,1 = 1,2 et on calcule : a² = 1,21 et b² = 1,44. « 2 » n’est pas compris entre a² et b² donc on continue.
On pose a = b = 1,2 et b = a + 1 = 1,3… On résume cela dans un tableau:
Valeurs de a | 1 | 1,1 | 1,2 | 1,3 | 1,4 |
Valeurs de b | 1,1 | 1,2 | 1,3 | 1,4 | 1,5 |
Valeurs de a² | 1 | 1,21 | 1,44 | 1,69 | 1,96 |
Valeurs de b² | 1,21 | 1,44 | 1,69 | 1,96 | 2,25 |
Est-ce que a² < 2 < b² ? | non | non | non | non | oui |
On s’arrête donc lorsque a = 1,4 et b = 1,5, ce qui signifie que:1,4<√2<1,5.
Obtenir un encadrement par balayage en Python : deux programmes
def approximation(n): a = 1 while ((a+10**(-n))**2 < 2): a = a + 10**(-n) return round(a,n) , round(a+10**(-n),n) p , q = approximation(5) print(f'{p} < racine(2) < {q}')
Expliquons ce programme.
J’ai défini une fonction approximation admettant un nombre en argument : n. Ce nombre va désigner l’amplitude de l’encadrement souhaité, c’est-à-dire la différence entre les deux bornes de l’encadrement.
Dans cette fonction, j’ai affecté à la variable a la valeur 1 car on commence à 1 (comme dans l’exemple précédent). Je vais ajouté aux différentes valeurs de a le nombre 10−n, que l’on écrit en python : 10**(-n). Dans l’exemple précédent, j’ajoutais 0,1 qui correspond à 10−1.
Tant que (a + 10−n) ² est plus petit que 2, cela signifie que je n’ai pas encore obtenu mon encadrement, donc je continue à ajouter 10−n à a.
La boucle while s’arrête quand (a + 10−n)² > 2. Dans ce cas, la fonction approximation retourne deux nombres arrondis (round) : a et (a + 10−n)² qui sont les deux bornes de l’encadrement.
Ensuite (ligne 8), j’affecte les deux valeurs retournées par la fonction aux variables p et q, pour ensuite les afficher à la ligne 9. En lançant le programme, on obtient:
1.41421 < racine(2) < 1.41422
Si je veux un encadrement à 10−7, il suffira de taper:
>>> approximation(7) 1.4142135 < racine(2) < 1.4142136
Mais attention : à partir de n = 7, ça commence à être très long… Ce programme (comme tout programme de balayage) n’est pas du tout optimal pour les grandes valeurs de n (essayez avec n = 10… vous pourrez vous préparer un bon chocolat chaud en attendant tellement c’est long !).
Autre solution
def balayage(p): # encadrement de racine carrée de 2 d'amplitude 10^(-p) a, b = 1, 2 x = 2**0.5 # racine carrée de 2 e = 0 # exposant de 10 while e > -p: e = e - 1 # balayage de [a;b] while x > a: a = a + 10**e b = a a = b - 10**e return round(a,abs(e)) , round(b,abs(e))
>>> balayage(10) (1.4142135623, 1.4142135624)
Ce programme est plus intuitif que le premier… et en plus, il est plus performant!
N’oubliez pas que si vous rencontrez des difficultés en mathématiques, je peux vous aider par webcam !
[Retourner aux ressources Python]