Les polynômes de degré 2

Polynômes de degré 2 #

Nous allons voir quelques algorithmes gravitant autour des polynômes de degré 2. Nous explorerons en parallèle les outils python qui nous seront utiles à cet effet.

Calculer le discriminant #

Un calcul direct #

Connaissant les coefficients ‘a’, ‘b’ et ‘c’ d’un polynôme $p(x)= ax^2 + bx + c$, il est extrêmement aisé de calculer son discriminant: il suffit d’écrire la formule bien connue et d’affecter le résultat à une variable, que l’on appellera par exemple delta:

>>> a = 1
>>> b = 5
>>> c = 6
>>> delta = b**2 - 4*a*c
>>> delta
1

Que constate-t-on:

  • Il est indispensable d’écrire explicitement les multiplications, on ne pourrait pas écrire b**2-4ac car le nombre 4 suivi directement de la variable ac déclencherait une erreur de syntaxe.
  • Les puissances s’écrivent en python à l’aide de l’opérateur ‘**’.

Utiliser une fonction #

En informatique, il est souvent plus judicieux d’utiliser une fonction lorsque l’on a un algorithme (un calcul comme $\Delta = b^2 - 4ac$ est un algorithme, même s’il est extrêmement simple). L’intérêt est de pouvoir à tout moment appeler la fonction pour en connaître le résultat.

La manière la plus simple de réaliser cela en python est:

def discriminant(a, b, c):
   return b**2 - 4*a*c

Cela suffit à définir une fonction en python. Le mot clé def est suivi du nom de la fonction, puis de la liste des paramètres.

Le corps de la fonction peut contenir autant de ligne que nécessaire. Une fois que l’on est parvenu à calculer le résultat recherché, on spécifie la valeur de retour de la fonction à l’aide du mot clé return, qui est en général (mais pas toujours) dans la dernière ligne de la fonction.

Comment utiliser cette fonction ? En utilisant la même notation qu’en mathématiques:

>>> delta = discriminant(1, 5, 6)
>>> delta
1

Ici, on appelle la fonction avec les valeurs de paramètres a == 1, b == 5 et c == 6, puis on affecte le résultat de la fonction à la variable delta, que l’on affiche ensuite.

Pour bien comprendre ce mécanisme, je vous invite à visiter le site python tutor sur lequel vous pourrez exécuter le programme précédent pas à pas, en examinant le contenu de la mémoire en temps réel.

Déterminer les racines d’un polynôme #

Un script direct #

Le théorème étudié en classe (nombre et calcul des racines en fonction du signe du discriminant) n’est ni plus ni moins qu’un algorithme décrivant précisément comment déterminer les racines d’un polynôme de degré 2.

On peut quasiment le suivre à la lettre pour l’implémenter en python:

from math import sqrt # Pour calculer des racines carrées (square root)

a = 1
b = 5
c = 6
# On réutilise évidemment la fonction discriminant:
delta = discriminant(a, b, c)

if delta < 0:
   print("Ce polynôme n'a aucune racine")
elif delta == 0:
   alpha = -b / (2*a)
   print("Ce polynôme a une racine double:", alpha)
else:
   # Ici on sait que delta > 0 nécessairement
   x1 = (-b - sqrt(delta)) / (2*a)
   x2 = (-b + sqrt(delta)) / (2*a)
   print("Ce polynôme a deux racines distinctes:", x1, "et", x2)

Utiliser une fonction #

Il est tout à fait envisageable d’écrire une fonction renvoyant les éventuelles racines d’un polynôme. Mais nous aurons une difficulté supplémentaire: le nombre de racines peut être 0, 1 ou 2. Peut-on renvoyer un nombre variable de résultats ?

C’est possible, à condition de renvoyer la liste des racines.

  • S’il n’y a pas de racines, on pourra renvoyer la liste vide []
  • S’il y a une racine double, on renverra une liste contenant un seul élément [alpha]
  • S’il y a deux racines, on renverra une liste à deux éléments [x1, x2]

Voici une implémentation possible:

def racines_polynôme_degré_2(a, b, c):
   delta = discriminant(a, b, c)

   if delta < 0:
      print("Ce polynôme n'a aucune racine")
   elif delta == 0:
      alpha = -b / (2*a)
      print("Ce polynôme a une racine double:", alpha)
   else:
      # Ici on sait que delta > 0 nécessairement
      x1 = (-b - sqrt(delta)) / (2*a)
      x2 = (-b + sqrt(delta)) / (2*a)
      print("Ce polynôme a deux racines distinctes:", x1, "et", x2)