From 65f1eb78d9b6249772fc03737ff7fcb96ca34eba Mon Sep 17 00:00:00 2001 From: DylanVsn <43576618+DylanVsn@users.noreply.github.com> Date: Sun, 2 Feb 2020 21:42:13 +0100 Subject: [PATCH] =?UTF-8?q?=C3=A0=20jour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...vier_Voisin.py => TP20janvier_Palacios.py} | 0 3/TP3_voisin.py | 82 +++++++++---------- 2 files changed, 39 insertions(+), 43 deletions(-) rename 2/{TP20janvier_Voisin.py => TP20janvier_Palacios.py} (100%) diff --git a/2/TP20janvier_Voisin.py b/2/TP20janvier_Palacios.py similarity index 100% rename from 2/TP20janvier_Voisin.py rename to 2/TP20janvier_Palacios.py diff --git a/3/TP3_voisin.py b/3/TP3_voisin.py index 7f3b58b..879c694 100755 --- a/3/TP3_voisin.py +++ b/3/TP3_voisin.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import sys, os import matplotlib.pyplot as plt -from random import random, choice import numpy as np from time import sleep import argparse @@ -11,27 +10,48 @@ from math import * # pour utliser les fonctions mathématiques dans l'option -f MNI TP3 - 27 janvier 2020 Dylan Voisin - M1 Informatique Luminy Franck Palacios - M1 Informatique Luminy + Cyril Colin - M1 Informatique Luminy Notes: - u1 et u2 ne semblent pas orthogonaux, ceci est dû à la non utilisation d'une échelle 1:1 pour l'affichage des points - u1 et u2 ne sont pas proportionnels par rapport à lambda mais à la - distance entre le barycentre et le point le plus éloigné selon la - composante x ou y + distance entre le barycentre et la limite de la fenêtre - u1 est orienté «vers la droite» et u2 «vers le haut» dans ce programme + - u1 et u2 apparaîssent comment des traits plutôt que des flèches car + matplotlib gère mal l'affichage de vecteurs, et plt.arrow peut dans + certains cas donner des têtes de flèche assez étranges selon le rapport + y:x du nuage de point + - le code n'a pas besoin d'être touché pour changer le comportement lors + du lancement, exemples: + + * afficher un nuage de point selon cos(x) entre 0 et 1 (pas de 0.1 par + défaut et inchangeable sauf dans le code): + > python3 TP3_voisin.py -f "cos(x)" -m 1 -s + + * idem mais avec un bruit de 0.5 (-g applique le bruit -n BRUIT dès la génération) + > python3 TP3_voisin.py -f "cos(x)" -m 1 -g -n 0.5 -s + + * afficher 10 boucles (avec bruit, défaut=10) avec la fonction sqrt(x) + > python3 TP3_voisin.py -f "sqrt(x)" -m 10 -n 2 -l 10 + le délai entre chaque itération se fait avec le paramètre -d SECONDES (ex -d 2.5) + + * afficher les points contenus dans le fichier exemple.txt (format plus bas) + > python3 TP3_voisin.py -i exemple.txt -s + + * les boucles, génération de bruit à l'initialisation sont également possible pour + la lecture d'un fichier + + * on peut afficher l'aide via + > python3 TP3_voisin.py -h + + Format du fichier d'entrée: + x0 y0 + x1 y1 + … + xn yn """ - -def acquérir_depuis_fichier(filename): - # l_pts = [] - # with open(filename) as f: - # for line in f: - # split = line.split() - # if len(split) == 2: - # l_pts.append(list(map(float, split))) - # return np.array(l_pts) - return np.loadtxt(filename) - def calc_barycentre(l_pts): x = sum(l_pts[:,0]) / len(l_pts) y = sum(l_pts[:,1]) / len(l_pts) @@ -130,13 +150,11 @@ def get_info_affichage(l_pts): pb = min(l_pts, key = lambda x: x[1]) pg = min(l_pts, key = lambda x: x[0]) dist = min(max(l_pts[:,0]) - bary[0], max(l_pts[:,1]) - bary[1]) - # dist = max(map(lambda x: np.linalg.norm(x-bary), l_pts)) dist_x = max(l_pts[:,0]) - min(l_pts[:,0]) dist_y = max(l_pts[:,1]) - min(l_pts[:,1]) x_range = min(l_pts[:,0]) - 0.1 * dist_x, max(l_pts[:,0]) + 0.1 * dist_x y_range = min(l_pts[:,1]) - 0.1 * dist_y, max(l_pts[:,1]) + 0.1 * dist_y u1, u2 = get_u1_u2_affichage(u1, u2, bary, dist_x, dist_y, pb, pg) - # print(u1, u2) return u1, u2, x_range, y_range @@ -148,7 +166,6 @@ def visualiser_nuage(l_pts): plt.scatter(l_pts[:,0], l_pts[:,1]) ax.arrow(*bary, *u1, ec="red", fc="white") ax.arrow(*bary, *u2, ec="orange", fc="white") - # ax.set_aspect('equal') plt.show() def animation_nuage(l_pts, loops=10, time_sleep=2, delta_bruit=3): @@ -220,41 +237,20 @@ def main(argv): print("File", args.input, "not found.", file=sys.stderr) sys.exit(1) else: - l_pts = acquérir_depuis_fichier(args.input) + l_pts = np.loadtxt(args.input) else: - l_pts = [] n = args.max_dot_xval f = lambda x: eval(args.function) # fonction génératrice de la ditribution - if args.generate_with_noise: + l_pts = np.array([[i, f(i)] for i in np.arange(0, n, 0.1)]) + if args.generate_with_noise: delta_bruit = args.noise # bruit généré, 0 si on en veut aucun - else: - delta_bruit = 0 - for i in np.arange(0, n, 0.1): - y = f(i) + choice((-1, 1)) * random() * delta_bruit/2 - l_pts.append([i, y]) - l_pts = np.array(l_pts) + bruit = np.random.random(len(l_pts)) * 2 * delta_bruit - delta_bruit + l_pts[:,1] += bruit # application du bruit if args.show: visualiser_nuage(l_pts) elif args.loop: animation_nuage(l_pts, args.loop, args.delay, args.noise) - if __name__ == "__main__": - # if len(sys.argv) == 2: - # l_pts = acquérir_depuis_fichier(sys.argv[1]) - # else: - # l_pts = [] - # n = 500 # nombre de points - # f = lambda x: x/2 + 3 # fonction génératrice de la ditribution - # delta_bruit = 10 # bruit généré, 0 si on en veut aucun - # for i in range(n): - # y = f(i) + choice((-1, 1)) * random() * delta_bruit/2 - # l_pts.append([i, y]) - # l_pts = np.array(l_pts) - # # np.savetxt("pts.txt", l_pts, "%f") - # u1, u2 = diagonaliser_matrice22(calc_matrice_corrélation(l_pts))[:2] - # # print(f"{u1/np.linalg.norm(u1)=}\n{u2/np.linalg.norm(u2)=}") - # visualiser_nuage(l_pts) - # animation_nuage(l_pts, 20, delta_bruit=100) main(sys.argv[1:])