Corrigé CCMP 2020
Partie SQLâïž
Q1. Proposez une requĂȘte SQL permettant de compter le nombre de maillages que contient le modĂšle du bateau.
Q2. Proposez une requĂȘte SQL permettant de rĂ©cupĂ©rer la liste des numĂ©ros des facettes (numero) du maillage nommĂ© « gouvernail ».
| SQL | |
|---|---|
Q3. Expliquez ce que renvoie la requĂȘte SQL suivante :
| SQL | |
|---|---|
Cette requĂȘte calcule l'Ă©cart maximal (Ă©tendue) entre les abscisses \(x\) des sommets qui composent les facettes appartenant au maillage nommĂ© « coque ».
Q4 â Ă partir de la variable maillage_tetra, Ă©crire une expression Python permettant de rĂ©cupĂ©rer la coordonnĂ©e y du premier sommet de la premiĂšre facette.
Pour récupérer la coordonnée \(y\) du premier sommet de la premiÚre facette :
| Python | |
|---|---|
maillage_tetra[0]), puis au premier sommet de cette facette ([0]), et enfin à la coordonnée \(y\) de ce sommet ([1]).
Q5 â Ă quel Ă©lĂ©ment, sur la figure 2(a), correspond maillage_tetra[1] ?
maillage_tetra[1] correspond à la facette définie par les trois sommets suivants :
| Text Only | |
|---|---|
1 2 3 | |
Cette facette représente le triangle formé par les sommets A, B et D sur la figure 2(a). C'est à dire la face \(S_4\)
Q6 â On souhaite utiliser les fonctions de ce module depuis un autre fichier Python. ComplĂ©tez le code ci-dessous afin quâil fournisse le rĂ©sultat attendu :
Pour importer la fonction prod_scalaire, le nom du module qui la précise est nécéssaire. as permet l'abréviation (renommage).
voici la syntaxe:
from operations_vectorielles import prod_scalaire as ps
Q7 â Que fait la fonction mystere1 ?
La fonction mystere1 calcule le produit scalaire V.V.
Elle renvoie donc la norme de V.
Q8 â CrĂ©er la fonction multiplie_scalaire, prenant comme argument un flottant a et un vecteur V et renvoyant un nouveau vecteur correspondant Ă a \(\vec{V}\) .
Il faut multiplier chacune des coordonnées par le scalaire.
Q9 â ComplĂ©ter les lignes 4 et 5 permettant de calculer le barycentre.
Voici la fonction complétée
| Python | |
|---|---|
Il est aussi possible d'utiliser les fonctions du module operations_vectorielles pour trouver les coordonnées du barycentre.
Q10 â Pour une facette F=(A,B,C) dâaire non-nulle, proposer une fonction normale, prenant comme argument une facette F et renvoyant le vecteur unitaire normal
| Python | |
|---|---|
Q11 â Compte tenu de la reprĂ©sentation limitĂ©e des nombres rĂ©els en machine, deux sommets S1 et S2 supposĂ©s ĂȘtre au mĂȘme endroit peuvent avoir des coordonnĂ©es lĂ©gĂšrement diâ”Ă©rentes. Proposer une fonction sont_proches, prenant comme arguments deux sommets S1 et S2 (reprĂ©sentĂ©s par leur vecteur position) et un flottant positif eps, et qui renvoie True si S1 et S2 sont proches (i.e. si leur distance au sens de la norme Euclidienne est infĂ©rieure Ă eps) et False sinon.
En utiliasant la fonction mystere1 :
Q12 â Sous quelle condition la fonction mystere2 renvoie-t-elle True ?
La fonction mystere2 teste la distance du sommet S1 Ă tous les sommets de la liste L.
Elle retourne TruedĂšs que l'un des sommets est proche (Ă \(10^{-7}\) prĂšs) de S1.
Elle retourne False sinon.
Q13 â Donner (sans justification) ce que renvoie mystere3(maillage_tetra), dans le cas oĂč maillage_tetra est la variable dĂ©finie prĂ©cĂ©demment.
Elle retourne : [[0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.0, 1.0, 0.0], [1.0, 0.0, 0.0]]
Q14 â Pour une liste L de longueur n, discuter la complexitĂ© de la fonction mystere2. En dĂ©duire la complexitĂ© de mystere3, pour un maillage contenant m facettes triangulaires. On distinguera le meilleur et le pire des cas.
- La complexité est proportionnelle au nombre de passages dans la boucle.
- Chaque itération de la boucle s'effectue en \(\mathcal{O}(1)\) (complexité constante pour la fonction
sont_proches). Le reste du traitement est négligeable.
Meilleur cas :
- Si
S1est proche du premier élément deL, il n'y a qu'un seul passage dans la boucle. - Complexité : \(\mathcal{O}(1)\).
Pire cas :
- Si
S1n'est proche d'aucun élément deLou seulement du dernier élément deL, on parcourt la liste entiÚre. - Complexité : \(\mathcal{O}(n)\).
Complexité de mystere3 (pour un maillage contenant m facettes triangulaires)
Meilleur cas :
- Tous les sommets sont identiques.
- Le test de la ligne 12 s'effectue toujours en \(\mathcal{O}(1)\). Ce test est répété \(3m\) fois (3 sommets par facette).
- La ligne 13 n'est exécutée qu'une seule fois lors du premier passage dans les boucles.
- Complexité : \(\mathcal{O}(m)\).
Pire cas :
- Aucun sommet n'est proche d'un autre.
- La liste
rescroĂźt Ă chaque itĂ©ration, et la complexitĂ© de chaque itĂ©ration dĂ©pend demystere2(pire cas : \(\mathcal{O}(n)\) oĂč \(n\) est la longueur deres). - Il y a \(3m\) itĂ©rations au total.
- Complexité : \(\mathcal{O}(m^2)\).
Calcul du pire cas :âïž
Complexité = \(sum_{k=1}^{3m} k\) = \({3m(3m + 1)}/{2}\) \(\mathcal{O}(m^2)\)
Quel est lâespace occupĂ© en mĂ©moire vive par lâensemble des donnĂ©es (en Mo).
Formule de calculâïž
MĂ©moire = (350 Ă 200 Ă 200 Ă 64) / (8 Ă 1024ÂČ) â 107 Mo
Q16 â Ăcrire une fonction mat2str qui prend en argument une liste de listes (reprĂ©sentant un mat_h) et renvoie les donnĂ©es quâelle contient sous forme dâune chaıÌne de caractĂšres qui respecte le format suivant :
Q17 â En sâappuyant sur mat2str, proposer un code Python qui permet de sauvegarder le contenu de liste_vagues dans un fichier nommĂ© fichier_vagues.txt (dans le rĂ©pertoire courant), en sĂ©parant la reprĂ©sentation de chaque mat_h par deux sauts de lignes consĂ©cutifs.
| Python | |
|---|---|
Q18 â AprĂšs avoir dĂ©fini judicieusement les types des Ă©lĂ©ments contenus dans I, J puis N, estimer la taille (en octets) que prendra une matrice ayant p Ă©lĂ©ments non-nuls, au format « Coordinate Format », dans le fichier.
- Les éléments de
IetJsont des entiers, ceux deNsont des flottants. - HypothÚse : les entiers entre 0 et 199 sont codés en moyenne sur 2,45 caractÚres : (10 x 1 + 90 x 2 + 100 x 3) / 200
Calcul du nombre de caractĂšres :âïž
- Pour I et J : 3.45p (avec les séparateurs et retours à la ligne).
- Pour N : 16p.
- total : 22.90p
Taille en octets (ASCII) :âïž
22.90p
Q19 â En dĂ©duire Ă partir de combien dâĂ©lĂ©ments non-nuls il devient moins avantageux dâenregistrer une matrice creuse quâune matrice complĂšte classique.
La matrice classique occupe 320000 octets ( \(200^2\) x 8 octets) La matrice creuse occupe 22.90p
Ainsi dÚs que p est supérieur à 13973, la matrice creuse n'est plus avantageuse.
Cela corrspond Ă environ 35 % de la matrice (200 x 200).
Q20 â Proposer un code permettant de construire, pour un tableau mat_h donnĂ©, les listes Python I,J et N. On considĂ©rera nulles les hauteurs infĂ©rieures Ă \(10^{-3}\) (en valeur absolue).
| Python | |
|---|---|
Q21 â Proposer une fonction lister_FI prenant comme argument un maillage M et renvoyant la liste des facettes immergĂ©es (i.e dont le centre de gravitĂ© est sous la surface dĂ©finie par hauteur). On pourra utiliser les fonctions de la partie I.
| Python | |
|---|---|
Q22 â Proposer une fonction force_facette prenant en argument une facette F, et renvoyant le vecteur force appliquĂ© par lâeau sur cette facette. On pourra utiliser les fonctions dĂ©finies prĂ©cĂ©demment.
| Python | |
|---|---|
Q23 â DĂ©finir la fonction resultante prenant comme argument une liste L de facettes (supposĂ©es immergĂ©es), renvoyant la somme des forces sur lâaxe ! \(\vec{z}\) de lâeau, appliquĂ©e sur lâensemble des surfaces.
| Python | |
|---|---|
Q24 â ComplĂ©ter la fonction fusion, prenant comme argument deux listes de facettes L1 et L2 (supposĂ©e chacune triĂ©e par aire dĂ©croissante) et renvoyant une nouvelle liste composĂ©e des facettes de L1 et L2 triĂ©es par aire dĂ©croissante.
| Python | |
|---|---|
Q25 â ComplĂ©ter la fonction rĂ©cursive trier_facettes, prenant comme argument une liste de facettes L, et renvoyant une nouvelle liste de facettes triĂ©es dans lâordre des aires dĂ©croissantes, par la mĂ©thode du tri-fusion.
La fonction trier_facettes est une implĂ©mentation rĂ©cursive de lâalgorithme de tri fusion (âmĂ©langeâ). Voici le code avec des explications :
| Python | |
|---|---|
Cet algorithme divise la liste en deux parties jusqu'Ă ce quâelles contiennent un seul Ă©lĂ©ment, puis les fusionne en respectant lâordre croissant. La fonction fusion est supposĂ©e ĂȘtre prĂ©dĂ©finie.
Q26 â Aâ”ecter Ă une nouvelle variable grandesFacettes la liste des facettes de maillageG, privĂ©e de la moitiĂ© des facettes les plus petites (en cas de nombre impair dâĂ©lĂ©ments, on inclura la facette mĂ©diane).
Pour obtenir les grandes facettes à partir du maillage maillageG, on suppose que les facettes sont triées par ordre décroissant selon leur taille. Le code suivant permet d'extraire les plus grandes facettes :
| Python | |
|---|---|
Ce code divise par deux la liste triée des facettes (en prenant la moitié supérieure).
Q27 â ComplĂ©ter les lignes 4 et 5 du code prĂ©cĂ©dent conformĂ©ment Ă la mĂ©thode dâEuler.
Les équations suivantes mettent à jour la position et la vitesse d'un objet soumis à des forces extérieures :
- Mise Ă jour de la position en fonction de la vitesse :
Python - Mise à jour de la vitesse en fonction des forces appliquées :
Python
Dans ces expressions :
| Text Only | |
|---|---|
1 2 3 4 5 6 7 | |