ExercicePremière, chapitre 3 — Géométrie cartésienne · Systèmes d'équations
Exercice 29 Python
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*y1. 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 et , 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é à 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 , donc Le déterminant étant nul, les vecteurs et 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) == 0On 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 et , 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 : 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 :
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 peut produire une valeur minuscule mais non nulle, comme . 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