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

Calcul scientifique Python Discussion :

Affichage trajectoire et vecteur vitesse


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Affichage trajectoire et vecteur vitesse
    Bonjour,
    j'ai rédigé le script suivant afin de représenter une trajectoire et le vecteur vitesse à partir d'un fichier csv qui comporte sur chaque ligne
    trois valeurs : le temps, l'abscisse et l'ordonnée mais rien n'apparaît sur les figures, pourriez-vous me dire où est mon erreur pour que je la corrige. Merci :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    import os
     
     
    fichier = open('chute_libre.csv','r')
    lignes = fichier.readlines()
     
    ##########Extraction des données#########
    #chaque ligne contient au moins 3 données. Le temps, l'abscisse et l'ordonnée de chaque point.
    #on créer pour chacun une liste, qui contiendra chacune de ces valeurs
    listeTemps = []
    listeX = []
    listeY=[]
     
    #Pour chaque ligne on extrait les 3 données, puis on ajoute dans la liste
     
    ################# PARTIE 1 A COMPLÉTER############################
    for ligne in lignes[1:] :
        try :  # nécessaire pour certaines lignes avec des caractères
            t, x, y = ligne.split('\t') # '\t' correspond au caractère "tabulation"
            listeTemps.append(float(t.replace(',', '.').rstrip('\t\n')))
            listeX.append(float(x.replace(',', '.').rstrip('\t\n')))
            listeY.append(float(y.strip().replace(',', '.').rstrip('\t\n')))
        except : pass
    print("listeTemps : ",listeTemps)
    print("listeX : ", listeX)
    print("listeY : ", listeY)
     
    ##################################################################
     
     
    ###########tracé des courbes souhaitées###########
    #on trace les ordonnées en fonction du temps :
    import matplotlib.pyplot as plt
    import math
     
    ##on veut ici tracer X=f(t) et Y=f(t) sur le même graphique
    ################# PARTIE 2 A COMPLÉTER############################
    plt.figure(1)
    plt.plot(listeTemps, listeY,  label = "ordonnées")
    plt.plot(listeTemps, listeX,  label = "abscisses")
    plt.legend()
    plt.show()
     
    ##################################################################
     
    ##on souhaite maintenant calculer les vitesses instantanées à partir
    ## des coordonnées des points.
    vitessesX = [] # on crée la liste des vitesses en X
    vitessesY = [] # on crée la liste des vitesses en Y
    vitesses = [] #cette liste contiendra la valeur du vecteur vitesse
     
    echelleVitesses=1.5 #a changer pour augmenter la longueur des fleches si besoin
     
    ################# PARTIE 3 A COMPLÉTER############################
    # calculer la vitesse  en X instantanée en 1 point et l'ajouter à la liste vitessesX.
    # calculer la vitesse  en Y instantanée en 1 point et l'ajouter à la liste vitessesY.
    # calculer la longueur du vecteur vitesse et l'ajouter à la liste vitesses.
    for i in range(1, len(listeX)-1) :
        vitessesX.append(echelleVitesses * (listeX[i + 1] - listeX[i - 1]) / (listeTemps[i + 1] - listeTemps[i - 1]))
        vitessesY.append(echelleVitesses * (listeY[i + 1] - listeY[i - 1]) / (listeTemps[i + 1] - listeTemps[i - 1]))
        vitesses.append(math.sqrt(vitessesY[i - 1] ** 2 + vitessesX[i - 1] ** 2))  # on calcule la norme si besoin
        None
     
    ##################################################################
    print("Vitesses :", vitesses)
     
    #On affiche les vecteurs vitesses aux points.
    plt.quiver(listeX[1:-1],  listeY[1:-1], vitessesX,  vitessesY)
    plt.show()
     
    #montrer graphiquement que la vitesse verticale est proportionnelle au temps
    # et que la vitesse horizontale est constante
    ################# PARTIE 4 A COMPLÉTER############################
    plt.figure(2)
    plt.plot(vitesses, listeY[1:-1],  label = "ordonnées")
    plt.legend()
    plt.show()

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    14 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 14 484
    Points : 24 504
    Points
    24 504
    Par défaut
    Salut,

    Si vous postez du code en demandant de regarder ce qu'il se passe...
    Il faut qu'on puisse reproduire quelque chose en le recopiant.
    Et comme on ne dispose pas du fichier CSV...
    Vous pourriez stocker les 10 premières valeurs dans les variables listeXXX, histoire de...
    (ou joindre le fichier CSV mais çà fait encore plus de boulot pour ceux qui voudraient vous aider).

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

  3. #3
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2013
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 109
    Points : 1 500
    Points
    1 500
    Par défaut
    C'est quoi le None ligne 63 ?
    Pas d'aide par mp.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,
    J'ai retiré none ligne 63.
    Le problème c'est que les listes ListeTemps[],ListeX, ListeY restent vident et donc les figures sont vides aussi.
    Le contenu du fichier csv est le suivant (chaque ligne comporte 3 valeurs correspondant à t,x et y. Le séparateur est le ;
    0 0 0,01
    0,04 0 -0,02
    0,08 0 -0,05
    0,12 0 -0,1
    0,16 0 -0,14
    0,2 0 -0,19
    0,24 0 -0,25
    0,28 0 -0,31
    0,32 0 -0,37
    0,36 0 -0,45
    0,4 0 -0,52
    0,44 0 -0,59
    0,48 0 -0,66
    0,52 -0,01 -0,73
    0,56 -0,01 -0,81
    0,6 -0,01 -0,88
    0,64 -0,01 -0,97
    0,68 -0,01 -1,05
    0,72 -0,01 -1,13
    0,76 -0,01 -1,21
    0,8 -0,02 -1,28
    0,84 -0,02 -1,37
    0,88 -0,03 -1,44

  5. #5
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2013
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 109
    Points : 1 500
    Points
    1 500
    Par défaut
    Essaie cela :
    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
    #! /usr/bin/env python3
    #-*- coding: utf-8 -*-
     
    import matplotlib.pyplot as plt
    import csv
     
    file = "chute_libre.csv"
     
    #######################################################
    ################# sans frottement #####################
    temps=[]
    ordo=[]
    # lecture du fichier file
    with open(file,newline='') as fich:
        f = csv.reader(fich,delimiter="\t")
        for ligne in f:
            # première colonne (colonne 0)
            temps.append(ligne[0])
            # deuxième colonne (colonne 2)
            ordo.append(ligne[2])
    # si besoin, on remplace les virgules par des points et on transtype 
    # en réel en enlevant la première ligne
    #new_temps = [float(el.replace(',','.')) for el in temps[1:]]
    new_temps = [float(el) for el in temps]
    new_ordo = [float(el) for el in ordo]
     
    # graphe z = f(t) en rouge (r) relié (-)
    plt.title('Chute sans frottement')
    plt.plot (new_temps,new_ordo,'r-',label="z = f(t)")
    plt.legend()
    plt.savefig("chute1.eps",dpi=200)
    plt.show()
     
    m = 10
    vit = []
    e_c = []
    e_p = []
    e_m = []
    for j in range(len(new_temps)-1):
        vit.append((new_ordo[j+1]-new_ordo[j])/(new_temps[j+1]-new_temps[j]))
    for i in range(len(vit)):
        e_c.append(0.5*m*(vit[i])**2)
        e_p.append(m*9.81*new_ordo[i])
        e_m.append(0.5*m*vit[i]**2+m*9.81*new_ordo[i])
     
    # graphes (e_c en rouge (r), e_p en noir (black (k)), e_m en bleu (b) reliés (-)) 
    plt.title('Energies')
    plt.plot (new_temps[:-1],e_c,'r-',label="énergie cinétique")
    plt.plot (new_temps[:-1],e_p,'k-',label="énergie potentielle")
    plt.plot (new_temps[:-1],e_m,'b-',label="énergie mécanique")
    plt.legend()
    plt.show()
    Pas d'aide par mp.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse !
    J'ai testé le programme y compris en vérifiant le fichier csv et j'ai le message d'erreur suivant :
    ordo.append(ligne[2])
    IndexError: list index out of range
    On semble ajouter le 3° élément de chaque ligne du fichier pourtant.

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    mars 2013
    Messages
    808
    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 : 808
    Points : 1 604
    Points
    1 604
    Par défaut
    Oui c'est ca, cela veut donc dire que ta liste contient moins de 3 éléments...
    Il faut que tu fasses un
    pour comprendre ce qui se passe et pouvoir remonter à la source du problème, qui n'est pas sur cette ligne que python te pointe, mais qui est avant.

    Pour comprendre si vous écrivez
    Python va vous soulez une erreur sur la 3eme ligne. Parce que vous faites une division par zéro. Mais la source de l'erreur n'est pas là. Elle est avant : il ne fallait pas mettre x à 0 sur la première ligne.

    Dans votre cas c'est pareil, il vous faut remonter à la source du problème.

  8. #8
    Membre expérimenté
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    avril 2005
    Messages
    1 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : avril 2005
    Messages : 1 411
    Points : 1 576
    Points
    1 576
    Par défaut
    Ton code me parait bien long pour pas pas grand chose...
    Perso, je ferais comme ça :
    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
     
    import csv
    import matplotlib.pyplot as plt
    source = open( 'chute_libre.csv', 'r') 
     
     
    t,x,y = [],[],[] 
     
    reader = csv.reader(source,delimiter=';')
     
     
    liste_txy = list( zip(*reader) )  #renvoie une liste de tuples: (t,x,y)
    t= [ float( liste_txy[0][i].replace(',','.') ) for i in range( len(liste_txy[0])-1) ]
    x= [ float( liste_txy[1][i].replace(',','.') ) for i in range( len(liste_txy[1])-1) ]
    y= [ float( liste_txy[2][i].replace(',','.') ) for i in range( len(liste_txy[2])-1) ]
     
     
    def vecteur(i):
        vx = ( x[i+1] - x[i-1] ) /  ( t[i+1]-t[i-1] )
        vy = ( y[i+1] - y[i-1] ) /  ( t[i+1]-t[i-1] )
        return (vx,vy)
     
    plt.box(False)
    plt.grid(True)
    plt.title('vecteurs vitesse - chute parabolique)')
     
     
     
    for i in range(1,len(t)-1):
        plt.quiver( x[i] , y[i] , vecteur(i)[0] , vecteur(i)[1] , angles='xy', scale_units='xy', scale=15, width=0.003 , color='r')
     
     
    plt.xlabel('x (en m)')
    plt.ylabel('y (en m)')
    plt.plot ( x , y , 'k+--' )
     
    plt.show()
    Après en l'absence de ton fichier csv, j'en ai utilisé un fait à partir d'Excel (trois colonnes t,x et y avec que des valeurs numériques )

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    Archimède, ça marche nickel !
    Problème résolu !
    Bonne fin de journée.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : octobre 2017
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Juste une chose après quelques essais avec d'autres valeurs (d'autres mouvements).

    Il faut ajouter : plt.axis('equal') afin d'obtenir une trajectoire lisible.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb affichage des données vecteur
    Par manumanu35 dans le forum Ext JS / Sencha
    Réponses: 15
    Dernier message: 25/08/2010, 17h44
  2. [Débutant] Problème de corrélation entre deux vecteurs vitesses
    Par sydneya dans le forum Signal
    Réponses: 2
    Dernier message: 29/08/2007, 09h08
  3. Réponses: 8
    Dernier message: 23/07/2007, 20h44
  4. problème affichage élement de vecteur
    Par mariono dans le forum MATLAB
    Réponses: 9
    Dernier message: 10/07/2007, 17h39
  5. [Débutant] [JTable] affichage d'un vecteur
    Par neXistPa dans le forum Composants
    Réponses: 12
    Dernier message: 08/12/2005, 17h11

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