Sujet : Re: erreur matplotlib
De : lulu042 (at) *nospam* fry.fr.invalid (Lulu)
Groupes : fr.comp.lang.pythonDate : 16. Mar 2022, 15:57:43
Autres entêtes
Organisation : koitess?
Message-ID : <slrnt33un7.jcq1.lulu042@valentino.Rock-n-Roll.org>
References : 1 2 3
User-Agent : slrn/1.0.3 (Linux)
Le 15-03-2022, Alain Ketterlin <
alain@universite-de-strasbourg.fr.invalid> a écrit :
Lulu <lulu042@fry.fr.invalid> writes:
Le 15-03-2022, Lulu <lulu042@fry.fr.invalid> a écrit :
Bonjour,
[...]
La ligne 37 de mon script cherche à tracer une constante : pour les
500 valeurs de t, x0 = 0.4 (et mon script fonctionne si je commente
cette ligne) :
plot(t , x0, linewidth = ze_line_width)
avec :
x0 = u0(t)
et :
def u0(t) : return 0.4
[...]
>
Je viens d'avoir l'idée de remplacer la fonction u0(t) par une
fonction qui dépend de t, mais avec une si faible variation que
j'obtiens bien un trait horizontal à 0.4 :
def u0(t) : return 0.4 + np.sin( 0.01 * np.pi * f1 * t /100)
>
Et ça marche !
>
Mais je cherche à comprendre mon erreur : pourquoi n'est-il pas aussi
simple qu'attendu de tracer une fonction constante ?
L'explication est dans le message d'erreur de ton précédent message :
8<-----------8<---------8<----------8<----------8<----------8<----------8<
Traceback (most recent call last):
[...]
ValueError: x and y must have same first dimension, but have shapes (500,) and (1,)
8<-----------8<---------8<----------8<----------8<----------8<----------8<
Ta fonction u0 (l'originale) ne crée pas un tableau, mais renvoie
simplement un flottant. Tes autres fonctions créent toutes des tableaux.
Par exemple :
13 def u1(t) : return np.sin( 2 * np.pi * f1 * t)
renvoie bien un tableau. Tu as l'impression de faire une bête
multiplication scalaire "2*..." mais en fait tu fais
(... un flottant ...) * t
et comme t est un tableau, cela crée un nouveau tableau, dont chaque
élément est la valeur de l'élement correspondant de t multiplé par
(...). Merci la surcharge des opérateurs.
Tes fonctions u0, u1 ... ne sont pas des fonctions qui calculent la
nouvelle valeur d'un élement de tableau, ce sont des fonctions qui
calculent de nouveaux tableaux.
Sauf ta fonction u0 originale, qui renvoie un flottant. Ta
modification "marche" pour la même raison : ta (nouvelle) fonction u0
crée maintenant un tableau, parce qu'un des opérandes de ta formule
est un tableau. Tu obtiendrais le même résultat en créant directement
un tableau rempli avec la constante, avec numpy.full().
Ça m'apprendra a récupérer des scripts à droite ou à gauche sans
analyser leur fonctionnement : je n'avais même pas conscience de
manipuler des tableaux !!
Merci encore pour ton aide et pour numpy.full().
-- Alain.