Aller au contenu

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

🐍 Console Python
>>> 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]
###
# 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# autres testsbksl-nlbksl-nlresultat = linspace(-10, 10, 7, True)bksl-nlattendu = [-30/3, -20/3, -10/3, 0, 10/3, 20/3, 30/3]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(-10, 10, 7, True)"bksl-nlbksl-nlbksl-nlresultat = linspace(-0.1, 0.1, 3, False)bksl-nlattendu = [-1/10, -1/30, 1/30]bksl-nlassert sontpy-undproches(resultat, attendu) , "Erreur avec linspace(-0.1, 0.1, 3, False)"bksl-nlbksl-nl 5/5

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.