début - en vrai je crois que j'ai fini
This commit is contained in:
parent
39798b8f8a
commit
22b6844cf4
41
1/ok.py
Normal file
41
1/ok.py
Normal 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
224
2/TP20janvier_Voisin.py
Normal 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
20
2/consigne.txt
Normal 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)
|
Reference in New Issue
Block a user