Partage
  • Partager sur Facebook
  • Partager sur Twitter

Intégration d'un tableau de valeurs

    10 novembre 2017 à 10:15:55

    Bonjour à tous,
    Merci d'avance à ceux qui tenterons de m'aider
    Je travaille actuellement sur un TP d'un lycée technologique de Dijon pour acquérir un meilleur niveau sur python
    Tout se déroule vraiment bien jusqu'aux questions 9-10
    L'objectif ici est d'intégrer, par la méthode des trapèzes, une accélération (dont les valeurs sont contenues dans un fichier excel) pour obtenir la vitesse, puis la position.
    Le code fournit en annexe est le suivant :
    # -*- coding: utf-8 -*-
    """
    Created on Thu May  7 21:31:04 2015
    @author: David PREVOST
    """
    # Importations de modules
    import matplotlib.pyplot as plt
    # Fonctions pour l'intégration numérique (méthode des trapèzes)
    # Fonction trapeze
    def trapeze(xi,xj,yi,yj):
    #--> A COMPLETER
    # Fonction integre_signal
    def integre_signal(t,f,CI=0):
    #--> A COMPLETER
    #------------------------------------------------------------------------------
    # NE PAS MODIFIER CI-DESSOUS
    # Décommenter l'ensemble pour exécuter
    #(sélectionner l'ensemble, cliquer droit, puis décommenter)
    #------------------------------------------------------------------------------
    #
    ##Vitesse 1 sans filtrage
    #
    #fi=open("Vit1.csv")
    #
    #t1=[]; acc1=[]
    #for li in fi:
    #    if li[0] not in "abcdefghijklmnopqrstuvwxyz":
    #        li_sep=[]        
    #        li_sep=li.split(";")
    #        t1.append(float(li_sep[0]))
    #        acc1.append(float(li_sep[1][:-1]))
    #
    #vit1=integre_signal(t1,acc1)
    #
    #plt.figure(10)
    #plt.plot(t1,vit1,"k")
    #
    #x1=integre_signal(t1,vit1)
    #
    #plt.figure(20)
    #plt.plot(t1,x1,"k")
    #
    #
    ##Vitesse 2 sans filtrage
    #
    #fi=open("Vit2.csv")
    #
    #t2=[]; acc2=[]
    #for li in fi:
    #    if li[0] not in "abcdefghijklmnopqrstuvwxyz":
    #        li_sep=[]        
    #        li_sep=li.split(";")
    #        t2.append(float(li_sep[0]))
    #        acc2.append(float(li_sep[1][:-1]))
    #
    #vit2=integre_signal(t2,acc2)
    #
    #plt.figure(10)
    #plt.plot(t2,vit2,"g")
    #
    #x2=integre_signal(t2,vit2)
    #
    #plt.figure(20)
    #plt.plot(t2,x2,"g")
    #
    #
    ##Vitesse 3 sans filtrage
    #
    #fi=open("Vit3.csv")
    #
    #t3=[]; acc3=[]
    #for li in fi:
    #    if li[0] not in "abcdefghijklmnopqrstuvwxyz":
    #        li_sep=[]        
    #        li_sep=li.split(";")
    #        t3.append(float(li_sep[0]))
    #        acc3.append(float(li_sep[1][:-1]))
    #
    #vit3=integre_signal(t3,acc3)
    #
    #plt.figure(10)
    #plt.plot(t3,vit3,"r")
    #
    #x3=integre_signal(t3,vit3)
    #
    #plt.figure(20)
    #plt.plot(t3,x3,"r")
    #
    #plt.figure(10)
    #plt.xlabel('t (s)')
    #plt.ylabel('V (m/s)')
    #plt.figure(20)
    #plt.xlabel('t (s)')
    #plt.ylabel('X (m)')
    #plt.show()
    Pour la fonction trapèze j'ai utiliser la formule de l'aire d'un trapèze:
    def trapeze(xi,xj,yi,yj) :
        return ((np.sqrt((yj-yi)**2+(xj-xi)**2)+(xj-xi))*yi/2) 
    Puis pour la fonction integration j'ai procédé comme ceci :
    def integre_signal(t,f) :
       for i in range(1,len(t1)-1):
             u=trapeze(t[i],t[i+1],f[i],f[i+1])
             vit.append(u) 
     #vit une liste que j'ai crée
    Je n'obtiens rien de très probant, je m'y prends sans doute de la mauvaise manière.
    Après plusieurs heures sur ce TP, j'ai peur de ne plus être très clair et ai sans doute besoin de votre aide.
    PS : Je suis étudiant-ingénieur à Rennes, je fais cela sur mon temps libre, n'allez surtout pas pensez que je vous demande de faire mon travail..
    En vous remerciant grandement,

    -
    Edité par GregoireBouton 10 novembre 2017 à 10:19:00

    • Partager sur Facebook
    • Partager sur Twitter
      10 novembre 2017 à 14:20:55

      def integre_signal(t,f) :
         for i in range(1,len(t1)-1):
               u=trapeze(t[i],t[i+1],f[i],f[i+1])
               vit.append(u)
       #vit une liste que j'ai crée

      Qui est t1 ?

      T'en fais quoi de la variable vit ? Tu la retournes, où tu la laisses comme ça et c'est la fin de la fonction ?

      • Partager sur Facebook
      • Partager sur Twitter
        11 novembre 2017 à 11:07:33

        Bonjour,

        Ici t1 est une liste array crée depuis le fichier "vit1.csv" (ce n'est ni plus ni moins que la première colonne du fichier excel)
        Ainsi j'espérai faire pour i valant de 1 à n-1.
        Pour la liste vit, je ne pense pas avoir besoin de la retourner puis que je voulais l'utiliser par la suite pour faire :

        plt.plot(t1,vit)
        plt.show()

        Puisque vit serait une liste de vitesses.

        J'ai tenté d'aborder le sujet différemment, non pas par la méthode des trapèzes mais plus simplement par la fonction quad de scipy

        import matplotlib.pyplot as plt
        import scipy as sp
        import numpy as np
        import scipy.integrate as it
        
        
        fi=open("Vit1.csv")
        
        t1=[]; acc1=[]
        for li in fi:
            if li[0] not in "abcdefghijklmnopqrstuvwxyz":
                li_sep=[]        
                li_sep=li.split(";")
                t1.append(float(li_sep[0]))
                acc1.append(float(li_sep[1][:-1]))
        
        # Fonction transformant le tableau en fonction
        def a(acc1) :
            return acc1
        
        
        print(np.size(t1))
        print(np.size(t2))
        print(np.size(a))
        print (a)
        
        vit1=it.quad(a,t1[0],t1[len(t1)-1])
        print(vit1)
        plt.figure(10)
        plt.plot(t1,vit1,"k")

        En transformant ainsi le tableau de valeurs en une fonction que j'appelle dans quad(f,a,b), cependant je rencontre un probleme de dimensions puisque vit1 ne contient que 2 valeurs la où il devrait en contenir autant que t1

          (Code erreur)

        have shapes {} and {}".format(x.shape, y.shape))
        ValueError: x and y must have same first dimension, but have shapes (1800,) and (2,)




        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2017 à 10:54:43

          Est-ce que tu peux coller tout ton code erreur ? Typiquement y a pas de numéro de lignes, du coup là comme ça je n'ai aucune idée d'où ça vient
          • Partager sur Facebook
          • Partager sur Twitter
            13 novembre 2017 à 18:11:17

            Oui bien sur excuse moi !

            Pour ce code ci : 

            import matplotlib.pyplot as plt
            import scipy as sp
            import numpy as np
            import scipy.integrate as it
            
            
            fi=open("Vit1.csv")
            
            t1=[]; acc1=[]
            for li in fi:
                if li[0] not in "abcdefghijklmnopqrstuvwxyz":
                    li_sep=[]        
                    li_sep=li.split(";")
                    t1.append(float(li_sep[0]))
                    acc1.append(float(li_sep[1][:-1]))
            
            # Fonction transformant le tableau en fonction
            def a(acc1) :
                return acc1
            
            #Pour connaitre nombre d'éléments
            print(np.size(t1))
            print(np.size(a))
            
            #intégration par quad
            vit1=it.quad(a,t1[0],t1[len(t1)-1])
            print(vit1)
            #affichage courbe
            plt.figure(10)
            plt.plot(t1,vit1,"k")
            #x1=integre_signal(t1,vit1)
            #plt.figure(20)
            #plt.plot(t1,x1)
            
            plt.show()

            Pour le quel j'obtiens le code erreur : 

            1800
            1
            (12.486113858641996, 1.38623710939556e-13)
            Traceback (most recent call last):
              File "C:\Users\Grego\Desktop\TIPE\Integrationv2.py", line 38, in <module>
                plt.plot(t1,vit1,"k")
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\pyplot.py", line 3318, in plot
                ret = ax.plot(*args, **kwargs)
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\__init__.py", line 1892, in inner
                return func(ax, *args, **kwargs)
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_axes.py", line 1406, in plot
                for line in self._get_lines(*args, **kwargs):
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 407, in _grab_next_args
                for seg in self._plot_args(remaining, kwargs):
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 385, in _plot_args
                x, y = self._xy_from_xy(x, y)
              File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 244, in _xy_from_xy
                "have shapes {} and {}".format(x.shape, y.shape))
            ValueError: x and y must have same first dimension, but have shapes (1800,) and (2,)

            Merci encore pour l'aide ! :)

            Greg


            • Partager sur Facebook
            • Partager sur Twitter
              13 novembre 2017 à 19:21:43

              En fait l'erreur est toute simple à comprendre. La fonction plot fonctionne comme ceci. Tu lui donnes une liste en x [x0, x1, .., xn], et une liste en y [y0, y1, .., yn], et ça va te plotter les points [(x0, y0), (x1, y1), .., (xn, yn)]

              Sauf qu'ici, ton y (c'est à dire vit1) n'a que 2 valeurs y0 et y1, tandis que ton x (càd t1) en a 1800 : t0, t1, .., t1999

              Tu n'as précisé que deux ordonnées sur les 1800 ! Il faut aussi préciser les 1798 autres si tu veux pouvoir plotter les points.

              En espérant que ça te mette sur la piste.. :)

              -
              Edité par potterman28wxcv 13 novembre 2017 à 19:22:30

              • Partager sur Facebook
              • Partager sur Twitter
                14 novembre 2017 à 10:55:29

                Je pense avoir compris ! 
                Ici j'ai demandé à calculer une seule intégrale (de 0 à 1800) alors qu'il me faut la vitesse en tout point, c'est bien ca ?
                J'ai donc tenté d'utiliser une incrémentation :

                vit1=[]
                u=0
                i=1
                #intégration par quad
                while u<1798 and i<1799 :
                    v=it.quad(a,t1[u],t1[i])
                    vit1.append(v)
                    u=u+1
                    i=i+1
                    
                print(vit1)
                #affichage courbe
                plt.figure(10)
                plt.plot(t1,vit1,"k")

                Cette fois il me renvoi bien le bon nombre de valeurs !

                Cependant deux problèmes se posent désormais :

                Traceback (most recent call last):
                  File "C:\Users\Grego\Desktop\TIPE\Integrationv2.py", line 45, in <module>
                    x, y = self._xy_from_xy(x, y)
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 244, in _xy_from_xy
                    "have shapes {} and {}".format(x.shape, y.shape))
                ValueError: x and y must have same first dimension, but have shapes (1800,) and (1798, 2)
                    for seg in self._plot_args(remaining, kwargs):
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 385, in _plot_args
                    ret = ax.plot(*args, **kwargs)
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\__init__.py", line 1892, in inner
                    return func(ax, *args, **kwargs)
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_axes.py", line 1406, in plot
                    for line in self._get_lines(*args, **kwargs):
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\axes\_base.py", line 407, in _grab_next_args
                    plt.plot(t1,vit1,"k")
                  File "C:\Users\Grego\Downloads\WinPython-64bit-3.6.0.1Qt5\python-3.6.0.amd64\lib\site-packages\matplotlib\pyplot.py", line 3318, in plot
                


                Code erreur que je ne comprends pas du tout..

                Le second problème est ce qu'il me renvoi quand je fais un print(vit1) :

                (3.8586420000000005e-06, 4.283953192185664e-20), 
                (1.1575926000000002e-05, 1.2851859576556993e-19), 
                (1.92848765e-05, 2.1410513917352605e-19), 
                (2.7007715999999993e-05, 2.9984588145737225e-19),
                 (3.472500000000002e-05, 3.855249453010858e-19)

                (Ici je ne fais apparaitre que 5 valeurs, en réalité il y en a 1800)
                C'est en fait des couples ! Comment interpréter cela ?

                Merci ! 
                Greg



                • Partager sur Facebook
                • Partager sur Twitter

                Intégration d'un tableau de valeurs

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown