IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème pour faire mes courbes


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut Problème pour faire mes courbes
    Bonjour, je me lance depuis peu dans la programmation. J'ai opté pour python.
    Là je suis parti du projet de dessiner les courbes de l'IMC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/python3.1
    # -*-coding:Utf-8 -* 
     
    #étape suivante connaître les fonctions à l'origine des courbes IMC
    # ce serait poids en kg sur taille exprimé en mètre
    # x la taille y le poids ? donc y/x**2, sachant que x est compris entre 1.50 et 2.10 et y entre 40 et 130
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    plt.clf()
     
    y = np.linspace(40,130,1)
    x = np.linspace((1,50),(2,10),1)
    imc = (y/x**2)
    while imc.all >=float(16.5) and imc.all <=float(18.5):
        plt.plot(x,y,imc)
        plt.show() # erreur ligne 38 indentation obligatoire
    #pas de courbe dessinée     
     
     
    #ne fonctionne pas avec array
    #j'essaie avec array
     
    y = np.array([40,130])
    x = np.array([(1,50),(2,10)])
    imc = (y/x**2)
    while imc.all >= float(16.5) and imc.all <= float(18.5):
        plt.plot(x,y,imc)
        plt.show() # erreur ligne 38 indentation obligatoire
    me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "courbe IMC.py", line 17, in <module>
        while imc.all >=float(16.5) and imc.all <=float(18.5):
    TypeError: unorderable types: builtin_function_or_method() >= float()
    Ce mini code serait inenvisageable avec des nombres réels ?

    Merci d'éclairer le débutant que je suis

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par calixtus06 Voir le message
    Ce mini code serait inenvisageable avec des nombres réels ?

    Merci d'éclairer le débutant que je suis
    L'erreur dit juste que vous comparez des patates avec des oranges et que çà Python ne sait pas faire.
    note: imc est un tableau, imc.all une méthode... difficile de les comparez à un float.
    L'autre erreur qui est masquée par celle-ci est l'instruction while imc.all >= float(16.5) and imc.all <= float(18.5):. Si la condition était bien écrite, rien dans le corps de la boucle ne modifie imc pour que la condition puisse être fausse et sortir de la boucle.

    Il vous fait prendre le temps d'apprendre à jouer avec les constructions de base: boucles, conditions, .... sur des objets simples avant de vous lancer à les utiliser avec des objets plus complexes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il vous fait prendre le temps d'apprendre à jouer avec les constructions de base: boucles, conditions, .... sur des objets simples avant de vous lancer à les utiliser avec des objets plus complexes.
    - W
    C'est ce que je pensais faire .Mais je ne vois pas où finit le simple et où commence le compliqué.

    J'essaie d'écrire plus simplement (?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/bin/python3.1
    # -*-coding:Utf-8 -* 
     
    # connaître les fonctions à l'origine des courbes IMC
    # ce serait poids en kg sur taille exprimé en mètre
    # x la taille y le poids  donc la formule est y/x**2, sachant que x est compris entre 1.50 et 2.10 et y entre 40 et 130
     
    import numpy as np
    import matplotlib.pyplot as plt
     
     
    x = np.linspace(1.5,2.10,10)
    imc = [(y/x**2) for y in range(40,140)]
    plt.plot (x,y,imc)
    plt.show()
    Comment définir y qui pour moi semblait être défini dans range ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ecrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imc = [(y/x**2) for y in range(40,140)]
    C'est comme écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    imc = []
    for y in range(40,140) :
        imc.append(y/x**2)
    donc y n'existe que dans la boucle for, et pas à l'extérieur.
    Si vous voulez qu'il existe à l'extérieur, définissez-le à l'extérieur :


    Ensuite vous voulez tracer une fonction imc(x,y), donc la représentation de ça c'est une surface dans un espace 3D. plot c'est pour du 2D, et tracer y=f(x).

    Regarde ceci :
    https://matplotlib.org/2.0.0/example...ce3d_demo.html

    Observe d'ailleurs dans ce lien comment est construit Z à partir de X et Y ...

  5. #5
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    Bonjour,

    comme précisé par wiztricks, tu grilles les étapes. Regarde l'aide de plt.plot avec la fonction help(), regarde la longueur de x, y et imc avec len() et les dimensions avec np.ndim().

  6. #6
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Citation Envoyé par Supernul Voir le message
    Bonjour,

    comme précisé par wiztricks, tu grilles les étapes. Regarde l'aide de plt.plot avec la fonction help(), regarde la longueur de x, y et imc avec len() et les dimensions avec np.ndim().
    Bonjour, peut être que je grille des étapes sans m'en rendre compte . Que proposez vous ? A force de tâtonner des langages sans objectif je ne sais plus quelle direction prendre. Du coup je me suis dit que dessiner des courbes serait relativement aisé. (?)

    Comment ouvres tu help () j'ai l'impression que tu m'indiques une manip depuis le terminal . Est ce possible depuis mon IDE ?
    Qu'entends tu par longueur de x ?

  7. #7
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Salut,
    Il suffit de tapper help(fonction) dans l'invite de commande python pour avoir de l'aide sur une fonction (ici c'est help(plt.plot))
    Pour accéder à cette invite de commande (terminal) on peut directement lancer le programme python.exe, mais normalement c'est aussi possible depuis l'IDE (qui devrait être composé de 2 parties normalement: une partie fichier, et une partie invite de commandes)
    Sinon, la longueur de x, c'est le nombre d'éléments (ici le nombre d'abcisses et donc de points à tracer) qu'il comporte, puisque c'est une liste (plot prend en argument deux listes de même taille: la liste des abcisses, et celle des ordonnées).
    ps: quel IDE utilises-tu ?

  8. #8
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut Un petit exemple:
    Pour tracer la courbe formée des points (0,1) (1,8) (2,3) (3,6) (4,9) (5,1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import numpy as np
    import matplotlib.pyplot as plt
    x=[0,1,2,3,4,5] #liste des abcisses
    y=[1,8,3,6,9,1] #liste des ordon
    plt.plot(x,y)
    plt.show()
    Pour tracer la courbe d'équation y=x**2 sur l'intervalle [-1,1]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import numpy as np
    import matplotlib.pyplot as plt
    x=np.linspace(-1,1,100) #liste de 50 abcisses équiréparties sur l'intervalle [-1,1]
    y=x**2 #liste des ordonnées (le module numpy s'occupe de faire pour nous le calcul du carré sur chacune des abcisses !)
    plt.plot(x,y)
    plt.show()
    Bon courage!

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par calixtus06 Voir le message
    peut être que je grille des étapes sans m'en rendre compte . Que proposez vous ?
    Vous voyez bien que vous avez des difficultés à comprendre les indications qu'on essaie de vous donner.
    Pourtant, si vous aviez potassé un peu les premiers chapitres de n'importe quel (bon) tuto. sur Python, vous n'auriez aucun soucis à avoir ce qu'est la console, une boucle, des conditions, des listes,...
    Ce boulot de prise en main est indispensable, histoire d'avoir un minimum de bases avant de partir à l'aventure comme utiliser numpy et matplotlib... et, même si çà va vous prendre du temps, personne ne pourra le faire à votre place...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    Bonjour,

    je plussoie la recommandation de mon VDD et j'ajoute la remarque suivante : au début, tu pourras avoir l'impression d'apprendre des choses bateaux mais derrière se cachent des notions fondamentales en informatique et en Python comme le type, la mutabilité, les méthodes ...
    Je recommande souvent le Swinnen (notamment les premiers chapitres) pour les bases, et les Scipy Lectures Notes (en anglais, mais facile à lire et à comprendre) si tu cherches à utiliser Python en sciences. Une fois les bases acquises, les documentations officielles sont les lieux de recherche privilégiés.
    Pour t'entrainer : https://www.practicepython.org/ (en anglais) mais ne te jette pas trop vite dessus. Les bases d'abord

  11. #11
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Merci pour vos éclairages et conseil. J'aurais effectivement besoin de trouver des exercices, problème pour évoluer. Que me conseillez vous ?

    Et juste pour un dernier essai . Qu'est ce qui cloche dans la formulation de ce petit code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/python3.1
    # -*-coding:Utf-8 -* 
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    t = np.linspace (1.50,2.10,10)
    imc1 = (17.5*(t**2))
    plt.plot (t,imc1)
     
    t = np.linspace (1.50,2.10,10)
    imc2= (20*(t**2))
    plt.plot (t,imc2)
     
    t = np.linspace (1.50,2.10,10)
    imc3= (30*(t**2))
    plt.plot (t,imc3)
     
    t = np.linspace (1.50,2.10,10)
    imc4= (40*(t**2))
    plt.plot (t,imc4)
    plt.show()
    Encore merci

  12. #12
    Membre expérimenté
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Par défaut
    Bonjour,

    quelle est l'erreur renvoyée par Python ? On a besoin de cette information pour t'aider. Sur ma machine, ton code fonctionne bien. Mon installation : Win7 avec Anaconda Python 3.5 et Spyder

  13. #13
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    Salut je n'ai pas de messages d'erreur, je voulais savoir si ma formulation était "propre". S'il n'y avait pas un façon plus simple de formuler ce mini programme.

    D'autre part mes courbes ne viennent pas coller l'axe des abscisses. Pourquoi ? et je voudrais colorer chaque partie entre deux courbes, que dois je faire ?

    Merci d'avance

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par calixtus06 Voir le message
    Salut je n'ai pas de messages d'erreur, je voulais savoir si ma formulation était "propre". S'il n'y avait pas un façon plus simple de formuler ce mini programme.
    Faire une boucle plutôt que de répéter vos instructions via des copier/coller serait déjà plus "propre"... mais comme vous débutez, çà n'a pas grande importance.

    Citation Envoyé par calixtus06 Voir le message
    D'autre part mes courbes ne viennent pas coller l'axe des abscisses. Pourquoi ?
    Parce qu'il n'y a pas de zéros dans le domaine de variation que vous avez vous même choisi.

    Citation Envoyé par calixtus06 Voir le message
    Je voudrais colorer chaque partie entre deux courbes, que dois je faire ?
    Apprendre à chercher sur Internet pour y trouver l'existence de .fill_between et des exemples d'utilisation.

    note: vous êtes dans un forum où on essaie de vous apprendre à être un meilleur programmeur Python: chercher sur Internet, ouvrir un tuto., lire la documentation, .... font partie des bases de ce que vous devez apprendre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Membre averti
    Homme Profil pro
    Professeur de guitare
    Inscrit en
    Mai 2017
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur de guitare

    Informations forums :
    Inscription : Mai 2017
    Messages : 61
    Par défaut
    merci de votre réponse, du coup j'en suis là et je ne pige pas pourquoi la courbe de l'utilisateur ne s'affiche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/python3.1
    # -*-coding:Utf-8 -* 
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    #dessiner les courbes
    t = np.linspace (1.50,2.10,10)        #10 étant le nombre de points de passage
    imc1 = (16*(t**2))                    # il faut démarrer l'opération depuis la valeur de l'IMC 
    plt.plot (t,imc1, label="anorexie")   #ne pas oublier plt.legend()
    plt.legend()
     
    t = np.linspace (1.50,2.10,10)
    imc2= (18.5*(t**2))
    plt.plot (t,imc2,label="maigreur")
    plt.legend()
     
    t = np.linspace (1.50,2.10,10)
    imc3= (30*(t**2))
    plt.plot (t,imc3, label="corpulence normale")
    plt.legend()
     
    t = np.linspace (1.50,2.10,10)
    imc4= (35*(t**2))
    plt.plot (t,imc4,label="surpoids")
    plt.legend()
     
     
    t = np.linspace (1.50,2.10,10)
    imc5= (40*(t**2))
    plt.plot (t,imc5,label="obésité modéré")
    plt.legend()
     
    t = np.linspace (1.50,2.10,10)
    imc6= (60*(t**2))
    plt.plot (t,imc6, label="obésité élevée")
    plt.legend()
     
     
    # cadre et légende
    plt.title("Courbes IMC")#fonctionne si avant plt.show()
    plt.xlabel('taille en mètres')
    plt.ylabel('poids en kg')
     
    plt.xlim(1.50, 2.10)
    plt.ylim(40, 200)
     
    #calcul de l'imc de l'utilisateur
    print ('entre ton poids : ',)
    p = float(input())
     
    print ('entre maintenant ta taille en mètre: ' ,)   #du type 1.59 et non 159
    t = float(input())
     
    imc = float(p/(t**2))      # l'IMC de la personne
    print('ton IMC est de ', imc )     #pas besoin de remettre l'opération 
     
    # dessiner la courbe d'IMC de l'utilisateur
    #récupérer la valeur de son imc :c'est fait ligne 56
     
    plt.plot (t,imc, "b:o", label="ta courbe", linewidth=4)
    plt.legend()
     
    plt.show()
    Merci d'avance

    Ps: je me pencherai sur la boucle pour éviter la répétition effectivement

  16. #16
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Tu mélanges les patates et les chous là ...

    Déjà ce que tu calcules pour l'utilisateur ca va être un point, et pas une courbe. Donc quelquechose comme ca semblerait plus adapté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.plot (t,imc, "x", label="ta courbe")
    Bon là tu verras toujours rien, mais si tu commentes :
    tu verras le point.
    Et pourquoi a-t-il cet valeur ? Car c'est un imc, donc autour de 25. Alors que les autres trucs que tu as calculé, que tu as nommé imc1 à imc6 ce ne sont pas des imcs ! Ce sont des poids en Kg (comme mentionné en légende sur ton axe y) correspondant aux imc de 16;18.5;30;35;40 et 60 ...

    Attention aux nommages des variables, tu tombes dans ton propre piège !

Discussions similaires

  1. problème pour faire des blocs
    Par tinkye_winkye dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 04/01/2005, 14h13
  2. [SQL] problème pour faire ma requete
    Par seb.briet dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/12/2004, 16h51
  3. [FLASH MX2004] Problème pour faire un bouton play
    Par melanie075 dans le forum Flash
    Réponses: 13
    Dernier message: 16/12/2004, 22h55
  4. Réponses: 9
    Dernier message: 24/05/2003, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo