Nombres espacés (2)⚓︎
Pour construire la représentation graphique d'une fonction définie sur un intervalle de type \([a ; b[\) (\(a\) est inclus, \(b\) est exclu), on calcule les images de plusieurs antécédents régulièrement espacés, ce qui permet de placer des points à relier. Encore faut-il disposer des antécédents. Comment les choisir ?
Exemples
- Pour une fonction définie sur \([2.0, 4.0[\), avec des points régulièrement espacés par pas de \(0.5\), on prend \(2.0, 2.5, 3.0, 3.5\).
- Pour une fonction définie sur \([5.0, 6.5[\), avec des points régulièrement espacés par pas de \(0.25\), on prend \(5.0, 5.25, 5.5, 5.75, 6.0, 6.25\).
En paramètre, on utilisera a
, b
et pas
: des flottants ; pas
est strictement positif.
Pour cet exercice, on souhaite surtout qu'aucun nombre de la liste ne soit trop proche de \(b\). On veillera donc à ce que tout nombre soit inférieur à \(b - \varepsilon\) où \(\varepsilon\) sera la constante EPS = 10**(-6)
Écrire une fonction telle que arange(a, b, pas)
renvoie une liste de flottants qui vérifie :
- les nombres sont tous strictement inférieurs à
b - EPS
; - le premier, s'il existe, est
a
; - les nombres sont rangés dans l'ordre croissant ;
- l'écart entre deux nombres consécutifs est
pas
.
Erreur relative
On rappelle qu'on ne fait pas de tests d'égalité entre flottants.
La validation de cet exercice autorise des nombres avec une erreur relative de \(10^{-6}\). En contrepartie, aucun nombre supérieur à b - EPS
ne sera accepté dans la réponse.
Concrètement, si vous deviez faire le test \(x < b\) alors vous devrez écrire x < b - EPS
.
Exemples
>>> arange(2.0, 4.0, 0.5)
[2.0, 2.5, 3.0, 3.5]
>>> arange(5.0, 6.5, 0.25)
[5.0, 5.25, 5.5, 5.75, 6.0, 6.25]
>>> arange(2.0, 2.0, 0.1)
[]
EPS = 10py-strpy-str(-6)bksl-nlbksl-nldef arange(a, b, pas):bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert arange(2.0, 2.0, 0.1) == []bksl-nlbksl-nldef sontpy-undproches(x, y):bksl-nl return abs(x - y) < EPSbksl-nlbksl-nlresultat = arange(2.0, 4.0, 0.5)bksl-nlattendu = [2.0, 2.5, 3.0, 3.5]bksl-nlassert len(resultat) == len(attendu), "Erreur sur la longueur renvoyée"bksl-nlfor x, y in zip(resultat, attendu):bksl-nl assert sontpy-undproches(x, y), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(2.0, 4.0, 0.5)"bksl-nlbksl-nlresultat = arange(5.0, 6.5, 0.25)bksl-nlattendu = [5.0, 5.25, 5.5, 5.75, 6.0, 6.25]bksl-nlassert len(resultat) == len(attendu), "Erreur sur la longueur renvoyée"bksl-nlfor x, y in zip(resultat, attendu):bksl-nl assert sontpy-undproches(x, y), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(5.0, 6.5, 0.25)"bksl-nlbksl-nlassert arange(2.0, 2.0, 0.1) == [], "Générer un nombre entre 2 inclus et 2 exclus renvoie un tableau vide."bksl-nlbksl-nldef arange(a, b, pas):bksl-nl resultat = []bksl-nl x = abksl-nl while x < b - 10py-strpy-str-6:bksl-nl resultat.append(x)bksl-nl x += pasbksl-nl return resultatbksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlEPS = 10py-strpy-str-6bksl-nldef sontpy-undproches(x, y):bksl-nl return abs(x - y) < EPSbksl-nlbksl-nlresultat = arange(2.0, 4.0, 0.5)bksl-nlattendu = [2.0, 2.5, 3.0, 3.5]bksl-nlassert len(resultat) == len(attendu), "Erreur sur la longueur renvoyée"bksl-nlfor x, y in zip(resultat, attendu):bksl-nl assert sontpy-undproches(x, y), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(2.0, 4.0, 0.5)"bksl-nlbksl-nlresultat = arange(5.0, 6.5, 0.25)bksl-nlattendu = [5.0, 5.25, 5.5, 5.75, 6.0, 6.25]bksl-nlassert len(resultat) == len(attendu), "Erreur sur la longueur renvoyée"bksl-nlfor x, y in zip(resultat, attendu):bksl-nl assert sontpy-undproches(x, y), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(5.0, 6.5, 0.25)"bksl-nlbksl-nl
A
Z
arange
et numpy
La fonction arange
n'a aucun rapport avec le mot français « arrange ».
La fonction arange
existe dans le module numpy
; c'est un vague équivalent de range
avec des flottants. Il est souhaitable de se passer d'un tel gros module quand c'est possible. Cet exercice montre comment construire la fonction arange
qui est utile pour des représentations graphiques.