ATLAS Ouvrir dans l'atlas →

ExercicePremière, chapitre 3 — Géométrie cartésienne · Systèmes d'équations

Exercice 29 Python

AlgorithmiqueCalcul

On souhaite automatiser les tests de colinéarité et le calcul du point d'intersection de deux droites. On dispose de la fonction suivante :

def determinant(x, y, xp, yp):
    return x*yp - xp*y

1. Que renvoie l'appel determinant(3, -2, -6, 4) ? Interpréter ce résultat.

2. Écrire une fonction sont_colineaires(x, y, xp, yp) qui renvoie True si les deux vecteurs sont colinéaires, et False sinon. On réutilisera la fonction determinant.

3. Écrire une fonction alignes(xA, yA, xB, yB, xC, yC) qui renvoie True si les trois points sont alignés. Quelles coordonnées de vecteurs faut-il calculer au préalable ?

4. Tester cette fonction sur les quatre triplets de points de l'exercice 16.

5. Recopier et compléter la fonction suivante, qui renvoie les coordonnées du point d'intersection des droites d'équations ax+by+c=0ax+by+c=0 et a′x+b′y+c′=0a'x+b'y+c'=0, ou None si ce point n'existe pas :

def intersection(a, b, c, ap, bp, cp):
    d = determinant(a, b, ap, bp)
    if ... :
        return None
    x = (b*cp - bp*c) / d
    y = (ap*c - a*cp) / d
    return (x, y)

6. Tester cette fonction sur les trois cas de l'exercice 24.

7. Le test d'égalité à 00 est délicat lorsque les coefficients sont des nombres décimaux. Expliquer pourquoi, et proposer une amélioration du test.

Corrigé

1. L'appel calcule 3×4−(−6)×(−2)=12−123\times 4-(-6)\times(-2)=12-12, donc determinant(3, -2, -6, 4) renvoie 0\boxed{\texttt{determinant(3, -2, -6, 4)} \text{ renvoie } 0} Le déterminant étant nul, les vecteurs (3−2)\begin{pmatrix}3\\-2\end{pmatrix} et (−64)\begin{pmatrix}-6\\4\end{pmatrix} sont colinéaires — c'est le cas a) de l'exercice 14.

2.

def sont_colineaires(x, y, xp, yp):
    return determinant(x, y, xp, yp) == 0

On n'écrit pas if ... : return True else: return False : le test == 0 produit déjà directement un booléen.

3. Il faut d'abord calculer les coordonnées de AB→\overrightarrow{AB} et AC→\overrightarrow{AC}, c'est-à-dire les différences des coordonnées, puis tester leur colinéarité :

def alignes(xA, yA, xB, yB, xC, yC):
    return sont_colineaires(xB - xA, yB - yA, xC - xA, yC - yA)

4. On obtient successivement : FalseTrueFalseTrue\texttt{False} \qquad \texttt{True} \qquad \texttt{False} \qquad \texttt{True} ce qui correspond bien aux réponses de l'exercice 16 : seuls les triplets b) et d) sont alignés.

5. La condition manquante teste la nullité du déterminant, c'est-à-dire le parallélisme :

def intersection(a, b, c, ap, bp, cp):
    d = determinant(a, b, ap, bp)
    if d == 0:
        return None
    x = (b*cp - bp*c) / d
    y = (ap*c - a*cp) / d
    return (x, y)

6. Pour les cas 1 et 2 de l'exercice 24, la fonction renvoie None. Pour le cas 3 : intersection(28, 95, -6286, 45, -1, -3648)⟶(82.0, 42.0)\texttt{intersection(28, 95, -6286, 45, -1, -3648)} \longrightarrow \texttt{(82.0, 42.0)}

On retrouve bien le point (82 ;42).\boxed{\text{On retrouve bien le point } (82\,;42).} Limite du programme : il ne distingue pas les droites strictement parallèles des droites confondues, alors que le premier cas n'a aucune solution et le second une infinité. Il faudrait pour cela tester en plus si un point de la première droite vérifie la seconde équation.

7. Les nombres décimaux sont stockés de façon approchée en machine : un calcul qui devrait donner exactement 00 peut produire une valeur minuscule mais non nulle, comme 1,1×10−161{,}1\times 10^{-16}. Le test d == 0 serait alors faux, et le programme conclurait à tort que les droites sont sécantes. On remplace donc l'égalité stricte par un test de proximité :

if abs(d) < 1e-10:
    return None

Dans l'édifice

Thèmes

vecteurs, coordonnées, colinéarité, alignement, équations de droite, intersection de droites, Python

Notions

espace vectoriel, famille libre

Ouvrir dans l'atlas interactif →