Implémentation de certaines notions de géométrie, spécifiquement au programme de Géométrie 2 (L3 Mathématiques, AMU). Permet notamment d'obtenir des détails sur les aspects géométriques de certaines coniques en fonction des équations les définissant.
Utilise les modules numpy
et sympy
.
Utilise aussi le module algch_chris_mzz
que j'ai écrit pour calculer certains espaces propres.
Ce module ne fonctionne pas très bien pour trouver les vecteurs propres des matrices associées aux parties quadratiques, mais semble fonctionner suffisamment bien pour trouver l'axe focal dans le cas où la conique est une parabole.
J'ai inclus des exemples de chaque type de conique que j'ai étudié en cours de géométrie, pour pouvoir vérifier chaque partie de mon code.
DISCLAIMER
Ce rep a pour unique but de m'aider à appliquer nos méthodes de résolutions vues en cours ; en écrivant et en relisant un programme qui peut résoudre des exercices, c'est parfois plus facile de comprendre ce qu'il faut faire à chaque étape de la résolution, mais en restant dans le cas général pour ne pas avoir la solution à un seul problème, ce qui est à mon sens le principal défaut de faire une liste d'exercices pour réviser.
Le programme principal, qui contient les classes, est le fichier conique.py
, qui contient la classe Conique
, qui peut prendre les coefficients en argument, ou générer des coefficients aléatoires (pour tout de même pouvoir créer des exercices pour travailler dessus à la main).
Une initialisation de conique attendue est légèrement différente d'une initialisation standard :
import conique
coeffs = {"x2":1, "xy":2, "y2":1, "x":3, "y":-2, "c":1}
f = conique.Conique(coeffs).compute()
f = conique.Conique(coeffs)
crée un objet de type conique.Conique
.
Le constructeur de Conique
calcule certaines propriétés en fonction des coefficients donnés (ou générés), ce qui lui permet de déterminer de quelle type de conique il s'agit :
-
est_propre = (det(Q) != 0)
, où$Q$ est la matrice homogénéisée de$f$ (représentant le cône de révolution dans$\mathbb{R}^3$ ). Si$Q$ est dégénérée,$f$ est impropre, donc on n'étudie pas ce cas. -
a_centre = (det(q) != 0)
, où$q$ est la matrice associée à la partie quadratique de$f$ ; si la conique étudiée n'est pas à centre, c'est une parabole. -
est_definie = ((q[0,0] > 0 and det(q) > 0) or (q[0,0] < 0 and det(q) < 0))
. Si$q$ est définie, alors$f$ décrit une ellipse ; sinon,$f$ décrit une hyperbole.- Si le déterminant de
$q$ est positif, alors ses valeurs propres sont de même signe et$q$ est définie (positive) si et seulement si son mineur principal de dimension minimale est à déterminant positif. - Réciproquement, si le déterminant de
$q$ est négatif, alors ses valeurs propres sont de signes contraires et$q$ est définie (négative) si et seulement si son mineur principal de dimension minimale est à déterminant négatif.
- Si le déterminant de
compute()
renvoie un objet d'une des classes Parabole
, Hyperbole
ou Ellipse
, qui héritent toutes de Conique
, en fonction de ces propriétés. La classification permet notamment de distinguer le comportement de certaines méthodes comme find_center()
, définie de la manière suivante :
def find_centre(self):
if type(self) == Parabole:
self.centre = "n'a pas de centre"
print(self.centre)
else:
df = self.gradient()
self.centre = np.linalg.solve(df,np.array([-self.coeffs["x"],-self.coeffs["y"]]))
En effet, les paraboles n'ont pas de centre et le calcul nécessaire pour le trouver dans les deux autres cas n'aurait aucun sens dans le contexte d'un exercice sur une parabole.
Le plus simple des trois cas,
Le cas où
Le plus dur des trois cas :
v = q.make_vector_from_solution(q.get_eigenvectors(sp.Float(0)),[sp.Symbol("x1"),sp.Symbol("x2")])
On peut chercher un vecteur de