Écrire coordonnees polaires(x, y) renvoyant le couple
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Enregistrements et p-uplets nommés
Énoncé
Écrire coordonnees_polaires(x, y) renvoyant le couple . Quelle précondition faut-il pour que soit défini ?
Corrigé
import math
def coordonnees_polaires(x, y):
"""Couple (r, theta) des coordonnees polaires du point (x, y).
Precondition : (x, y) est different de (0, 0).
Postcondition : r >= 0, et x == r*cos(theta), y == r*sin(theta).
theta appartient a l'intervalle ]-pi, pi].
"""
assert not (x == 0 and y == 0), "l'origine n'a pas d'angle polaire"
r = math.sqrt(x * x + y * y)
theta = math.atan2(y, x)
return r, theta
La précondition demandée. Il faut . À l'origine, et tout angle convient : n'est pas défini. Ce n'est pas une difficulté technique mais une propriété du problème — le point n'a pas de direction. Remarquable : math.atan2(0, 0) ne lève aucune erreur, il rend . La bibliothèque a choisi une convention ; notre fonction, elle, refuse de mentir.
Pourquoi atan2(y, x) et non atan(y / x). Deux raisons, l'une fatale, l'autre sournoise : atan(y / x) divise par zéro lorsque , et surtout il ne distingue pas de , dont le quotient est le même. atan2 reçoit les deux coordonnées séparément et rend le bon angle dans les quatre quadrants. L'ordre des arguments est l'ordonnée d'abord — une des questions de la méthode « lire une documentation » du chapitre 3.
Vérification.
r, th = coordonnees_polaires(1, 1)
assert abs(r - math.sqrt(2)) < 1e-12 and abs(th - math.pi / 4) < 1e-12
r, th = coordonnees_polaires(-1, 0)
assert abs(r - 1) < 1e-12 and abs(th - math.pi) < 1e-12
for _ in range(2000): # le point se reconstruit-il ?
x, y = random.uniform(-10, 10), random.uniform(-10, 10)
r, th = coordonnees_polaires(x, y)
assert abs(r * math.cos(th) - x) < 1e-9 and abs(r * math.sin(th) - y) < 1e-9
Les points se reconstruisent à près, et l'origine est bien refusée. Les comparaisons se font avec une tolérance, jamais par == — chapitre 2.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.