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
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")
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")
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")
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()