Nombres espacés⚓︎
Pour construire la représentation graphique d'une fonction définie sur un intervalle, 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 5 points régulièrement espacés, on prend \(2.0, 2.5, 3.0, 3.5, 4.0\).
- Pour une fonction définie sur \([5.0, 6.5[\), avec 6 points régulièrement espacés, on prend \(5.0, 5.25, 5.5, 5.75, 6.0, 6.25\).
Dans notre exercice, on se limite aux intervalles de type \([a\,;\,b]\) (\(b\) est inclus) ou \([a\,;\,b[\) (\(b\) est exclu) pour lesquels on souhaite proposer \(n\) nombres régulièrement espacés, où \(n\) est un nombre entier au moins égal à 2.
- Si l'intervalle est de type \([a\,;\,b]\), on part de \(a\) et on avance par pas de \(\dfrac{b-a}{n-1}\).
- Si l'intervalle est de type \([a\,;\,b[\), on part de \(a\) et on avance par pas de \(\dfrac{b-a}{n}\).
Écrire une fonction telle que linspace(a, b, n, ferme)
renvoie une liste de \(n\) nombres flottants régulièrement espacés en partant de a
, où a
et b
sont des flottants, n
est un entier au moins égal à 2, et ferme
est un booléen.
- Si le booléen
ferme
est égal àTrue
, on choisira un pas adapté à l'intervalle fermé \([a\,;\,b]\) (\(b\) est inclus). - Si le booléen
ferme
est égal àFalse
, on choisira un pas adapté à l'intervalle non fermé \([a\,;\,b[\) (\(b\) est exclu).
On garantit que \(a\) et \(b\) sont compris entre \(-10^9\) et \(10^9\), et que la différence \(b-a\) est supérieure à \(10^{-9}\). On garantit que \(n\) est inférieur à \(1000\).
Exemples
>>> linspace(2.0, 4.0, 5, True)
[2.0, 2.5, 3.0, 3.5, 4.0]
>>> linspace(5.0, 9.5, 6, False)
[5.0, 5.75, 6.5, 7.25, 8.0, 8.75]
def linspace(a, b, n, ferme):bksl-nl ...bksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nlbksl-nl# tests, à ne pas modifierbksl-nlbksl-nldef sontpy-undproches(resultat, attendu):bksl-nl if len(resultat) != len(attendu):bksl-nl return Falsebksl-nl for a, b in zip(resultat, attendu):bksl-nl if abs(a - b) > 10py-strpy-str-6:bksl-nl return Falsebksl-nl return Truebksl-nlbksl-nlresultat = linspace(2.0, 4.0, 5, True)bksl-nlattendu = [2.0, 2.5, 3.0, 3.5, 4.0]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(2.0, 4.0, 5, True)"bksl-nlbksl-nlresultat = linspace(5.0, 9.5, 6, False)bksl-nlattendu = [5.0, 5.75, 6.5, 7.25, 8.0, 8.75]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(5.0, 9.5, 6, False)"bksl-nlbksl-nlbksl-nldef linspace(a, b, n, ferme):bksl-nl if ferme:bksl-nl pas = (b - a) / (n - 1)bksl-nl else:bksl-nl pas = (b - a) / nbksl-nl antecedants = [a]bksl-nl x = abksl-nl for i in range(n - 1):bksl-nl x += pasbksl-nl antecedants.append(x)bksl-nl return antecedantsbksl-nlbksl-nlbksl-nl# tests, à ne pas modifierbksl-nlbksl-nldef sontpy-undproches(resultat, attendu):bksl-nl if len(resultat) != len(attendu):bksl-nl return Falsebksl-nl for a, b in zip(resultat, attendu):bksl-nl if abs(a - b) > 10py-strpy-str-6:bksl-nl return Falsebksl-nl return Truebksl-nlbksl-nlresultat = linspace(2.0, 4.0, 5, True)bksl-nlattendu = [2.0, 2.5, 3.0, 3.5, 4.0]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(2.0, 4.0, 5, True)"bksl-nlbksl-nlresultat = linspace(5.0, 9.5, 6, False)bksl-nlattendu = [5.0, 5.75, 6.5, 7.25, 8.0, 8.75]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(5.0, 9.5, 6, False)"bksl-nlbksl-nlbksl-nl
A
Z
linspace
et numpy
La fonction linspace
existe dans le module numpy
.
Il est souhaitable de se passer d'un tel gros module quand c'est possible. Cet exercice montre comment construire la fonction linspace
qui est utile pour des représentations graphiques.