Aller au contenu

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\)\(\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
🐍 Console Python
>>> 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)
[]
###
# testsbksl-nlbksl-nlbksl-nlassert arange(2.0, 2.0, 0.1) == []bksl-nlbksl-nlbksl-nlEPS = 10py-strpy-str-6bksl-nlbksl-nlbksl-nldef sontpy-undproches(x, y):bksl-nl return abs(x - y) < EPSbksl-nlbksl-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(bksl-nl x, ybksl-nl ), 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(bksl-nl x, ybksl-nl ), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(5.0, 6.5, 0.25)"bksl-nlbksl-nlbksl-nl# autres testsbksl-nlbksl-nlbksl-nldef propy-undarange(debut, fin, pas):bksl-nl resultat = []bksl-nl x = debutbksl-nl while x < fin - EPS:bksl-nl resultat.append(x)bksl-nl x += pasbksl-nl return resultatbksl-nlbksl-nlbksl-nlfor n in range(1, 30):bksl-nl debut, fin, pas = 4.0 + 5 py-str n, 1.0 + 8 py-str n, 1 / nbksl-nl resultat = arange(debut, fin, pas)bksl-nl attendu = propy-undarange(debut, fin, pas)bksl-nl assert len(resultat) == len(attendu), "Erreur sur la longueur renvoyée"bksl-nl for x, y in zip(resultat, attendu):bksl-nl assert sontpy-undproches(bksl-nl x, ybksl-nl ), f"Erreur avec {x} qui n'est pas proche de {y} dans arange({debut}, {fin}, {pas})"bksl-nlbksl-nl 5/5

EPS = 10 py-strpy-str (-6)bksl-nlbksl-nlbksl-nldef arange(a, b, pas):bksl-nl ...bksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert arange(2.0, 2.0, 0.1) == []bksl-nlbksl-nlbksl-nldef sontpy-undproches(x, y):bksl-nl return abs(x - y) < EPSbksl-nlbksl-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(bksl-nl x, ybksl-nl ), 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(bksl-nl x, ybksl-nl ), f"Erreur avec {x} qui n'est pas proche de {y} dans arange(5.0, 6.5, 0.25)"bksl-nlbksl-nlassert (bksl-nl arange(2.0, 2.0, 0.1) == []bksl-nl), "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-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.