Encadrement de \(\sqrt2\) par balayage en Python

En classe de Seconde, le programme stipule que l’on doit savoir obtenir un encadrement de \(\sqrt2\) 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.

encadrement de √2 par balayage en python

Le principe mathématique

On sait que si \(0 < a < r < b\) alors \(0 < a^2 < r^2 < b^2\).

On cherche deux nombres a et b tels que:$$a < \sqrt2 < b$$ donc tels que:$$a^2 < (\sqrt2)^2 < b^2.$$

De plus, on sait que $$1 < 2 < 3$$donc l’idée est de partir de \(a=\sqrt1=1\) et de lui ajouter un pas très petit, par exemple \(10^{-n}\) où n est un entier naturel, jusqu’à obtenir:$$a^2 < 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 a11,11,21,31,4
Valeurs de b1,11,21,31,41,5
Valeurs de a²11,211,441,691,96
Valeurs de b²1,211,441,691,962,25
Est-ce que a² < 2 < b² ?nonnonnonnonoui

On s’arrête donc lorsque a = 1,4 et b = 1,5, ce qui signifie que:$$1,4 < \sqrt2 < 1,5.$$

Obtenir un encadrement par balayage en Python : le programme

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('{} < racine(2) < {}'.format(p,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^{-10}\), 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 !).

N’oubliez pas que si vous rencontrez des difficultés en mathématiques, je peux vous aider par webcam !

[Retourner aux ressources Python]