début - en vrai je crois que j'ai fini

This commit is contained in:
DylanVsn 2020-01-29 13:36:03 +01:00
parent 39798b8f8a
commit 22b6844cf4
3 changed files with 285 additions and 0 deletions

41
1/ok.py Normal file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env python3
"""
1) créer 2 vecteurs et calculer le produit scalaire entre les 2 vecteurs
comparer avec dot
2) calculer l'angle entre 2 vecteurs
3) afficher les vecteurs
Pour l'affichage → utilisation de matplotlib
exemple
plt.plot([0, 1, 2], [4, 8, 16], "r+")
plt.show()
"""
import numpy as np
def truc1():
a = np.random.random(2)
b = np.random.random(2)
print(a, b, a.shape)
print(f"{(a*b).sum()=} \n{np.dot(a, b)=}")
# truc1()
import matplotlib.pyplot as plt
def truc2():
a = np.array([0, 1]) #np.random.random(2)
b = np.array([1, 1]) #np.random.random(2)
alpha = np.math.degrees(np.math.acos(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))))
print(f"{a=} {b=} {alpha=}")
n = 500
x = a.dot(b) / (np.linalg.norm(a) * np.linalg.norm(b))
new_a = np.math.pi / 2 - sum(np.math.factorial(2*n) / (2**n * np.math.factorial(n))**2 * (x**(2*n+1)) / (2*n+1) for _ in range(n))
print(np.math.degrees(new_a))
# print(np.linalg.norm(a) == (a**2).sum() ** .5)
plt.plot(a/np.linalg.norm(a), b/np.linalg.norm(b), "r+")
plt.show()
truc2()

224
2/TP20janvier_Voisin.py Normal file
View File

@ -0,0 +1,224 @@
#!/usr/bin/env python
"""
TP n°2 MNI
20 janvier 2020
Franck Palacios
Dylan Voisin
"""
import matplotlib.pyplot as plt
import numpy as np
def norme(u):
return sum(i**2 for i in u) ** 0.5
def produit_scalaire(u, v):
return sum(i*j for i, j in zip(u, v))
def produit_vectoriel(u, v):
return [0, 0, u[0]*v[1] - v[0]*u[1]]
def cos_vect(u, v):
return produit_scalaire(u, v) / (norme(u) * norme(v))
def sin_vect(u, v):
return norme(produit_vectoriel(u, v)) / (norme(u) * norme(v))
def signe_angle(u, v):
"""renvoie le signe de l'angle orienté (u, v)"""
return -1 if u[0]*v[1] - v[0]*u[1] < 0 else 1
def points_vers_vecteur(p1, p2):
"""renvoie le vecteur formé par p1 et p2"""
return [p2[0] - p1[0], p2[1] - p1[1]]
def polygone_convexe(P):
"""Renvoie True si le polygone P est convexe, False sinon
le premier et le dernier sont différents !"""
signe = 0
for i in range(len(P)):
u = points_vers_vecteur(P[i], P[(i+1)%len(P)])
v = points_vers_vecteur(P[(i+1)%len(P)], P[(i+2)%len(P)])
if signe == 0:
signe = signe_angle(u, v)
if signe != signe_angle(u, v):
return False
return True
def affiche_polygone(P):
"""affiche un polygone P via pyplot et met en titre l'état de convexité"""
convexité = "convexe" if polygone_convexe(P) else "non convexe"
P = np.array(list(P) + [P[0]])
x = P[:,0]
y = P[:,1]
plt.title("Polygone " + convexité)
plt.plot(x, y)
plt.show()
def intersection_segments(pa, pb, pc, pd):
"""retourne vrai si AB et CD se croisent"""
# erreur car pas conservation sens vecteur
ab = points_vers_vecteur(pa, pb)
ac = points_vers_vecteur(pa, pc)
ad = points_vers_vecteur(pa, pd)
cd = points_vers_vecteur(pc, pd)
cb = points_vers_vecteur(pc, pb)
ca = points_vers_vecteur(pc, pa)
intersect = None
if signe_angle(ab, ac) == signe_angle(ab, ad):
intersect = False
else:
if signe_angle(cd, ca) == signe_angle(cd, cb):
# pas intersection
intersect = False
else:
intersect = True
return intersect
def affiche_segments(pa, pb, pc, pd):
"""affiche un segment avec pyplot et met en titre l'état de l'intersection"""
intersection = "se croisent" if intersection_segments(pa, pb, pc, pd) else "ne se croisent pas"
x_ab = [pa[0], pb[0]]
y_ab = [pa[1], pb[1]]
x_cd = [pc[0], pd[0]]
y_cd = [pc[1], pd[1]]
plt.title("Les segments " + intersection)
plt.plot(x_ab, y_ab)
plt.plot(x_cd, y_cd)
plt.show()
def sous_matrice(m, i, j=0):
"""renvoie la sous-matrice issue de m sans la ligne i et colonne j"""
sm = []
for k in range(len(m)):
if k != i:
sm.append([])
for l in range(len(m[i])):
if l != j:
sm[-1].append(m[k][l])
return sm
def det(m):
"""renvoie le déterminant de m"""
if len(m) == 1:
return m[0][0] # ici on a [[a]], a scalaire
if len(m) == 2:
return m[0][0] * m[1][1] - m[0][1] * m[1][0]
else:
signe = 0
det_ = 0
for i in range(len(m)):
det_ += (-1) ** signe * m[i][0] * det(sous_matrice(m, i))
signe ^= 1 # changement de signe
return det_
def inversion_matrice(m):
"""renvoie l'inverse de la matrice m"""
inv_m = [[0 for i in range(len(m))] for j in range(len(m))]
for i in range(len(m)):
for j in range(len(m[0])):
sm = sous_matrice(m, i, j)
d = det(sm)
inv_m[j][i] = (-1) ** ((i+j)%2) * d
return inv_m
def affiche_matrice(m):
"""affiche la matrice m de façon «jolie»"""
max_ = max(len(str(m[i][j])) for i in range(len(m)) for j in range(len(m)))
space = max_ + 2
for i in range(len(m)):
for j in range(len(m)):
if j != len(m) - 1:
print("{:{}}".format(m[i][j], space), end = '')
else:
print("{:{}}".format(m[i][j], space))
def main():
u = (2, 3)
v = (-2, 7)
print("u=", u)
print("v=", v)
print("produit scalaire:", produit_scalaire(u, v))
print("produit vectoriel:", produit_vectoriel(u, v))
print("cos²(u, v) + sin²(u, v)=", cos_vect(u, v)**2 + sin_vect(u, v)**2)
carré = (
(0, 0),
(1, 0),
(1, 1),
(0, 1)
)
affiche_polygone(carré)
non_convexe = (
(0, 0),
(0.5, 0.5),
(1, 0),
(1, 1),
(0, 1)
)
affiche_polygone(non_convexe)
a = (0, 2)
b = (3, 3)
c = (2, 2)
d = (4, 0)
affiche_segments(a, b, c, d)
affiche_segments(c, d, a, b)
a = (0, 0)
b = (1, 1)
c = (0, 1)
d = (1, 0)
affiche_segments(a, b, c, d)
m22 = (
(1, 2),
(3, 4)
)
m33 = (
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
)
print("m22:")
affiche_matrice(m22)
print("det(m22)=", det(m22))
print("m33:")
affiche_matrice(m33)
print("son déterminant:", det(m33))
print("mineur de m33 sans la ligne 1 et col 1:")
affiche_matrice(sous_matrice(m33, 1, 1))
print("son déterminant:", det(sous_matrice(m33, 1, 1)))
A = (
(5, 7),
(2, 3)
)
print("A:")
affiche_matrice(A)
print("A^{-1}:")
affiche_matrice(inversion_matrice(A))
M3 = (
(1, 2, 3),
(0, 1, 4),
(5, 6, 0)
)
# source M3: https://fr.wikihow.com/calculer-l%27inverse-d%27une-matrice-3x3
# M3⁻¹
# -24 18 5
# 20 -15 -4
# -5 4 1
print("M3:")
affiche_matrice(M3)
print("M3^{-1}")
affiche_matrice(inversion_matrice(M3))
if __name__ == "__main__":
main()

20
2/consigne.txt Normal file
View File

@ -0,0 +1,20 @@
1) Trouvez le sinus et le cosinus d'un angle avec le produit scalaire et produit
vectoriel (entre 2 vecteurs u et v)
2) vérifier que le cos(alpha)²+sin(alpha)² = 1
3)
4 points (pour commencer) ~> n points
→ vérifier si le polygone formé par ces points est convexe ou non
-> visualisation
en plus:
AB et CD, 2 segments, savoir si ils se coupent ou pas et avec visualisation
encore
en ++: inverser matrice 2×2| matrice 3×3
renommer TP20janvier_Nom1.py
---------
eau chaude + Luo Huan Guo (fruit)
un morceau (environ 1/4)