예제 #1
0
def lst_square(fname):
    """
    Effectue une régression linéaire d'un ensemble de points en coordonnées planimétriques
    afin de calculer un plan moyen à l'ensemble des hauteurs observées
    La liste des points sont directement issus d'un fichier csv, les matrices modèles et d'observations
    sont automatiquement calculées
    
    Arguments:
        - fname: nom du fichier csv utilisé pour extraire les données
    """
    donnees = utl.read_csv(fname)  #récupération des données du fichier
    utl.redux(*donnees[:4])

    B = np.array(
        donnees[3]).T  #la matrice d'observation contient les hauteurs terrains

    les_x = np.array(donnees[1])
    les_y = np.array(donnees[2])
    les_uns = np.ones(np.shape(les_y))

    A = np.array([les_x, les_y, les_uns
                  ]).T  #la matrice modèle contient les coordonnées Est et Nord

    X = lina.lstsq(
        A, B)[0]  #moindre carré magiques par invocation du module Python

    res_norm, residus = residus_norm(
        A, B, X)  #calcul des résidus et résidus normalisés

    std, e = calc_stats(
        residus)  #calcul de l'écart type et de la différence maximale

    return X, res_norm, std, e
예제 #2
0
 def launch_lstsq(self):
     if(self.file_for_lstsq != ""):
         result = mc.lst_square(self.file_for_lstsq)
         data = utl.read_csv(self.file_for_lstsq)
         utl.redux(*data[:4])
         mc.draw(data,result[0],result[1])
         self.std_label.setText("Écart-type:  " + str(result[2]*100)[:6] + " cm")
         self.diff_label.setText("Différence:  " + str(result[3]*100)[:6] + " cm")
         print("done")
예제 #3
0
 def launch_3d(self):
     if(self.file_for_3d != ""):
         data = utl.read_csv(self.file_for_3d)
         if(self.redux_3d.isChecked()): utl.redux(data[0],data[1],data[2],data[3])
         fig = plt.figure()
         ax = fig.add_subplot(111, projection='3d')
         ax.set_xlabel('Est')
         ax.set_ylabel('Nord')
         ax.set_zlabel('Hauteur')
         ax.plot(data[1],data[2],data[3])
         print("done")
예제 #4
0
 def launch_compare(self):
     if(len(self.filenames) > 0):
         result = []
         for file in self.filenames:
             temp = utl.read_csv(file)
             if(self.redux_option.isChecked()): utl.redux(temp[0],temp[1],temp[2],temp[3])
             result.append(temp)
             
         base = result[0]
         measures = []
         if(len(result) > 1):
             measures = result[1:]
         self.compare(base,*measures)
         print("done")
예제 #5
0
def fourier(fname, attr, rot=False):
    """
    Effectue l'analyse de Fourier d'un fichier de points, selon l'attributs considéré
    
    Argument:
        - fname: nom du fichier csv
        - attr: indice de l'attribut à analyser dans les colonnes du fichier csv
            (0: Est, 1: Nord, 2: hauteur, etc.)
    """

    donnees = utl.read_csv(fname)
    utl.redux(*donnees[:4])

    if (rot):  #effectue la rotation du nuage de points vers un plan moyen

        #        R_e = [[1.,0,0],
        #               [0,np.cos(alpha),-np.sin(alpha)],
        #               [0,np.sin(alpha),np.cos(alpha)]]
        #
        #        R_n = [[np.cos(beta),0,np.sin(beta)],
        #               [0,1.,0],
        #               [-np.sin(beta),0,np.cos(beta)]]

        alpha = -np.arctan((donnees[3][-1] - donnees[3][0]) /
                           (donnees[1][-1] - donnees[1][0]))  #H/E
        for i in range(len(donnees[0])):
            x = donnees[1][i] - donnees[1][0]
            y = donnees[2][i] - donnees[2][0]
            z = donnees[3][i] - donnees[3][0]
            #            temp = [[donnees[1][i]],[y],[z]]
            #            result = np.dot(np.dot(R_n,R_e),temp)
            #            result = np.dot(R_e,temp)
            donnees[1][
                i] = donnees[1][0] + np.cos(alpha) * x - np.sin(alpha) * z
            donnees[2][i] = donnees[2][0] + y
            donnees[3][
                i] = donnees[3][0] + np.sin(alpha) * x + np.cos(alpha) * z

        alpha = -np.arctan((donnees[3][-1] - donnees[3][0]) /
                           (donnees[2][-1] - donnees[2][0]))  #H/N
        for i in range(1, len(donnees[0])):
            x = donnees[1][i] - donnees[1][0]
            y = donnees[2][i] - donnees[2][0]
            z = donnees[3][i] - donnees[3][0]
            donnees[1][i] = donnees[1][0] + x
            donnees[2][
                i] = donnees[2][0] + np.cos(alpha) * y - np.sin(alpha) * z
            donnees[3][i] = np.sin(alpha) * y + np.cos(alpha) * z

        donnees[3][0] = 0

    liste_hauteurs = donnees[attr + 1]  #récupère la colonne voulue
    #    m = np.mean(liste_hauteurs)
    #    for i in range(len(liste_hauteurs)): liste_hauteurs[i] -= m         #recentre les valeurs autour de 0

    liste_temps = donnees[0]

    fourier = fft.fft(liste_hauteurs) / np.size(liste_hauteurs)
    axe_f = np.arange(0., len(liste_hauteurs)) * 20 / len(liste_hauteurs)

    plt.figure()  #initialise le graphique
    plt.subplot(121)
    plt.plot(liste_temps, liste_hauteurs,
             '-')  #affiche l'attribut en fonction du temps
    plt.xlabel('axe temporel')
    plt.subplot(122)
    plt.plot(axe_f, np.abs(fourier), 'x-')  #affiche l'analyse de Fourier
    plt.xlabel('axe frequentiel')
    plt.xlim(xmax=10)
    plt.show()


#    fname.close()