à jour
This commit is contained in:
parent
2e3a2f89ad
commit
65f1eb78d9
@ -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
|
||||
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:])
|
||||
|
Reference in New Issue
Block a user