Mines Informatique Commune MP PC PSI 2020Sujet, corrigé et rapport du jury
Images de vagues et de structures
- Bases de données relationnelles et SQL
- Manipulation de listes en Python
- Complexité algorithmique
- Tri fusion
- Représentation des nombres en mémoire
- Méthode d'Euler
Téléchargements
Présentation du sujet
Simulation d'une scène de cinéma : maillages de facettes, vagues et flottaison d'une gondoleAfficher ou masquer la section
Présentation du sujet
Le sujet porte sur la modélisation d'une scène de cinéma en images de synthèse (un bateau créant un sillage et une gondole qui oscille) à l'aide de maillages de facettes triangulaires. Il combine des requêtes SQL sur une base de données, la manipulation de vecteurs et de facettes en Python, puis le calcul de la poussée d'Archimède et l'intégration du mouvement de la gondole par la méthode d'Euler.
- 1Partie I : création d'un objet dans la scèneRequêtes SQL sur une base de données de maillages, puis manipulation de vecteurs, facettes et listes de sommets en Python.
- 2Partie II : génération de vaguesEstimation de l'occupation mémoire, écriture des hauteurs de vagues dans un fichier, puis représentation en matrice creuse.
- 3Partie III : mouvement de flottaisonCalcul de la poussée d'Archimède sur les facettes immergées, tri des facettes par aire par tri-fusion, puis intégration du mouvement par la méthode d'Euler.
Ce qu'a observé le jury
6 erreurs relevéesRemplissage d'une liste vide par indexation · Confusion entre norme d'une différence et différence des normes · Complexité affirmée sans justificationAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLes copies sont très contrastées et l'épreuve a bien joué son rôle de classement : un nombre non négligeable de copies montre une bonne, voire excellente, maîtrise du langage, mais le jury relève aussi des lacunes récurrentes sur la manipulation des listes, des chaînes de caractères et sur la justification des complexités.
Les erreurs les plus sanctionnées
- 1Remplissage d'une liste vide par indexationQ8
Un certain nombre de candidats initialisent une liste vide puis tentent de la remplir en écrivant directement dans un indice qui n'existe pas encore.
« un certain nombre de candidats tombent dans le piège classique d'initialiser une nouvelle liste vide »
- 2Confusion entre norme d'une différence et différence des normesQ11
Bien qu'il ne s'agisse pas d'une épreuve de mathématiques, le jury a été surpris par la fréquence de cette confusion.
« nous avons été surpris par le nombre de candidats confondant la norme d'une différence avec la différence des normes »
- 3Complexité affirmée sans justificationQ14
Le jury attend une description explicite du meilleur et du pire cas avant de conclure, et non une affirmation du type boucle for donc complexité linéaire.
« Que de réponses affirmées sans aucune justification »
- 4Chaînes de caractères non mutables mal comprisesQ16
Certains candidats tentent de modifier un caractère par indexation ou d'utiliser append sur une chaîne, ce qui n'est pas possible en Python.
« La gestion des chaînes de caractères n'est pas maitrisée »
- 5Algorithme de fusion mal comprisQ24
Des candidats codent des boucles imbriquées au lieu du principe de parcours simultané de deux listes triées propre au tri-fusion.
« témoignent d'une mauvaise compréhension de l'algorithme de fusion de deux listes »
- 6Copies présentées comme un brouillon
Le jury signale des copies contenant de nombreuses ratures sales sur toute la copie, jugées irrespectueuses du travail du correcteur.
« Certaines copies sont trop proches d'un brouillon, avec beaucoup de ratures réalisées sans soin »
Ce qui a été bien réussi
- Un nombre non négligeable de copies montre une bonne maîtrise du langage et une compréhension relativement bonne, parfois excellente, des problématiques abordées.
- 95% des candidats savent reconnaître le calcul de la norme d'un vecteur (question 7).
- La question 3 est assez bien réussie.
- La question 22 est assez bien réussie.
- Le principe de tri puis extraction de la question 26 a plutôt été maîtrisé.
Conseils du jury
- Ne pas transposer les réflexes du module numpy aux listes Python : une opération comme a*L avec L une liste n'a pas de sens.
- Préférer L.append(a) à la syntaxe L=L+[a], beaucoup moins efficace pour ajouter un élément.
- Ne pas omettre les parenthèses des appels de fonction, par exemple dans for i in range(m).
- Toujours justifier une analyse de complexité en distinguant explicitement le meilleur et le pire des cas.
- Préférer une version itérative du tri-fusion à une version récursive, jugée très peu efficace.
- Soigner la présentation de la copie et éviter les ratures répétées.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉCOLE DES PONTS PARISTECH, ISAE-SUPAERO, ENSTA PARIS, TÉLÉCOM PARIS, MINES PARISTECH, MINES SAINT-ÉTIENNE, MINES NANCY, IMT ATLANTIQUE, ENSAE PARIS, CHIMIE PARISTECH.
CONCOURS 2020
ÉPREUVE D'INFORMATIQUE COMMUNE
Durée de l'épreuve : 1 heure 30 minutes
INFORMATIQUE COMMUNE
L'énoncé de cette épreuve comporte 12 pages de texte.
Images de vagues et de structures
Préambule
Notations mathématiques et physiques
code Python
1 V = [2., 3., 1.5]
Modèle de facettes
- Maillage : ensemble des facettes qui constituent la géométrie d'un objet. Un maillage sera représenté par une liste de facettes.
- Facette : polygone élémentaire qui constitue une partie de la surface d'un objet. Ici, toutes les facettes seront des triangles. Une facette sera représentée par une liste ordonnée de 3 sommets.
- Sommet : point délimitant une facette. Il peut être commun à une ou plusieurs facettes. Tout point sera représenté par son vecteur position de coordonnées
(x, y, z) .


Partie I. Création d'un objet dans la scène
I.a Chargement d'un modèle 3D à partir d'une base de données
- relation maillages_bateau : ensemble des maillages. Un maillage possède un identifiant (entier) et un nom (chaîne de caractères) :
maillages_bateau(id,nom)
- relation faces : ensemble des facettes du modèle. Chaque facette est définie par un numéro unique, l'identifiant du maillage auquel elle appartient ainsi que les identifiants des sommets qui la composent. Tous sont des entiers.
faces (numero,maillage,s1,s2,s3)
- relation sommets : liste des sommets du modèle. Chaque sommet est défini par un identifiant (entier) et ses coordonnées dans l'espace par rapport au repère principal de la scène (flottant) :
sommets (id,x,y,z)
|
|
nom |
| 1 | coque |
| 2 | bouée |
| 3 | échelle |
| 4 | moteur |
|
|
|
| numero | maillage | s1 | s2 | s3 |
| 1 | 3 | 1 | 2 | 3 |
| 2 | 3 | 2 | 4 | 3 |
| 3 | 2 | 3 | 12 | 5 |
|
|
|
|
|
|
|
|
|
|
|
| 1 | 0.0 | 0.0 | 0.0 |
| 2 | 1.0 | 0.0 | 0.0 |
| 3 | 0.0 | 1.0 | 0.0 |
|
|
|
|
|
Requête SQL
SELECT (MAX(x)-MIN(x))
FROM sommets AS s JOIN faces AS f JOIN maillages_bateau AS m
ON (s.id=f.s1 OR s.id=f.s2 OR s.id=f.s3) AND f.maillage=m.id
WHERE m.nom="coque"
I.b Travail sur les facettes
maillage_tetra = [ [[0.,0.,0.], [0.,0.,1.], [0.,1.,0.]],
[[0.,0.,0.], [0.,1.,0.], [1.,0.,0.]],
[[0.,0.,0.], [1.,0.,0.], [0.,0.,1.]],
[[1.,0.,0.], [0.,1.,0.], [0.,0.,1.]] ]
- 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.
- Q5 - À quel élément, sur la figure 2(a), correspond maillage_tetra[1] ?
NAME
DESCRIPTION
FUNCTIONS
Renvoie le vecteur correspondant à l'opération vectorielle V1+V2.
aire(F)
Renvoie l'aire d'une facette.
Argument :
F - une facette (liste de trois vecteurs)
prod_scalaire(V1, V2)
Renvoie le produit scalaire de V1 avec V2.
prod_vectoriel(V1, V2)
Renvoie le vecteur correspondant au produit vectoriel de V1 avec V2.
soustraction(V1, V2)
Renvoie le vecteur correspondant à l'opération vectorielle V1-V2.
barycentre(F)
Renvoie le vecteur position du barycentre d'une facette.
Argument :
F - une facette (liste de trois vecteurs)
FILE
code Python
from ??? import ?? as ?
vect_1 = [1., 2., 3.]
vect_2 = [2., 3., 4.]
scal12 = ps(vect_1, vect_2) #Calcul du produit scalaire de vect_1 avec vect_2
code Python
def mystere1(V):
2 return (V[0]**2 + V[1]**2 + V[2]**2)**0.5
- Q7-Que fait la fonction mystere1?
- Q8 - Créer la fonction multiplie_scalaire, prenant comme argument un flottant a et un vecteur V et renvoyant un nouveau vecteur correspondant
_a aV⃗ .
La fonction barycentre (incomplète) est définie ci-dessous.
code Python
def barycentre(F):
G = [0,0,0]
for i in range(3): #Pour chaque point de F
.... # Ligne à compléter
.... # Ligne à compléter
return G
- Q9 - Compléter les lignes 4 et 5 permettant de calculer le 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
I.c Liste des sommets
- Q11 - Compte tenu de la représentation limitée des nombres réels en machine, deux sommets
S_1 etS_2 supposés être au même endroit peuvent avoir des coordonnées légèrement différentes. Proposer une fonction sont_proches, prenant comme arguments deux sommets S 1 et S 2 (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.
Soient les fonctions suivantes :
code Python
def mystere2(S1, L):
for S2 in L:
if sont_proches(S1, S2, 1e-7):
return True
return False
def mystere3(maillage):
res = []
for facette in maillage:
for sommet in facette :
if not mystere2(sommet, res):
res.append(sommet)
return res
- Q13 - Donner (sans justification) ce que renvoie mystere3(maillage_tetra), dans le cas où maillage_tetra est la variable définie précédemment.
◻ Q14 - Pour une liste L de longueurn , discuter la complexité de la fonction mystere2. En déduire la complexité de mystere3, pour un maillage contenantm facettes triangulaires. On distinguera le meilleur et le pire des cas.
Partie II. Génération de vagues
Le calcul numérique permettant d'évaluer la forme de ces vagues étant coûteux, il est réalisé par un programme extérieur. Ce dernier génère l'état du plan d'eau à chaque image de la scène ( 25 par seconde).
Pour chacune de ces images, on représente le plan d'eau par une grille régulière carrée, de taille
La hauteur (sur
Le programme extérieur calcule ainsi mat_h pour chaque nouvelle image. L'ensemble de toutes les valeurs de mat_h est stocké dans une liste nommée liste_vagues.

- Q15 - Quel est l'espace occupé en mémoire vive par l'ensemble des données (en Mo).
On propose d'utiliser le format de fichier nommé «Coordinate Format» qui consiste à stocker :
- une liste I, comportant les numéros de ligne de chaque élément non-nul,
- une liste J , comportant les numéros de colonne de chaque élément non-nul,
- une liste N , comportant la valeur de chaque élément non-nul.
- 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.
- 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).
Partie III. Mouvement de flottaison

III.a Estimation de la poussée d'Archimède
On s'intéresse ici au maillage qui constitue la coque extérieure de la gondole. Certaines facettes sont émergées (i.e. leur barycentre est en dehors de l'eau), d'autres sont immergées (i.e leur barycentre est sous l'eau).
À chaque pas de temps, on suppose connue la fonction hauteur(
On modélise la force appliquée par l'eau sur une facette
-
S_i : l'aire de la facette, -
n_i^(→−) : le vecteur normal sortant de la coque, -
p(G_i) : la pression hydrostatique de l'eau sur la facette en son barycentreG_i .
-
ρ : masse volumique de l'eau (ρ ≈ 1000 ) -
g : accélération de la pesanteur (ici :g ≈ 9, 81 ) - 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.
III.b Tri des facettes
Ainsi, une étude montre que la moitié des facettes représente à elle seule
code Python
def fusion(L1, L2):
# À compléter (sur une ou plusieurs lignes)
def trier_facettes(L):
# À compléter (sur une ou plusieurs lignes)
grandesFacettes = # À compléter
III.c Mouvement vertical de la gondole
-
m : masse de la gondole -
F_(eau → gondole) est la résultante des forces appliquées par l'eau sur la gondole (renvoyée par la fonction resultante, vue précédemment).
La position initiale de la gondole estz_(G0) = 0 . Sa vitesse verticale initiale estv_0 = 0 .
On souhaite estimer le mouvement par la méthode d'Euler. Pour ce faire, on utilise la fonction nouvelle_hauteur avant d'afficher chaque nouvelle image. Cette fonction a pour but de recalculer la hauteur (et la vitesse) de la gondole pour un nouveau pas de temps. Elle prend trois arguments : - posG contiendra le vecteur position actuel du centre de gravité de la gondole au moment de l'appel (liste de trois flottants);
- vitG contiendra le vecteur vitesse actuel de ce même point au moment de l'appel (liste de trois flottants);
- mailG contiendra la liste des grandes facettes de la gondole (privée des petites, au sens de la question précédente), au moment de l'appel.
code Python
def nouvelle_hauteur(posG, vitG, mailG):
dt=1.0/25.0 # Pas de temps correspondant à une image du film.
facettes_immergees = lister_FI(mailG)
posG = posG + ...... # à compléter
vitG = vitG + ........ # à compléter
return posG, vitG
- Q27 - Compléter les lignes 4 et 5 du code précédent conformément à la méthode d'Euler.
- Les sujets sont la propriété du GIP CCMP. Ils sont publiés les termes de la licence
Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 France.
Tout autre usage est soumis à une autorisation préalable du Concours commun Mines Ponts.
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune MP PC PSI Mines 2020 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte l'épreuve d'informatique commune MP PC PSI Mines 2020 ?
Le sujet porte sur les requêtes SQL, la manipulation de listes et de vecteurs en Python, la complexité algorithmique, le tri-fusion, la représentation en matrice creuse et la méthode d'Euler.
Quelles erreurs le jury a-t-il le plus relevées sur ce sujet d'informatique commune 2020 ?
Le jury signale des pièges sur la manipulation des listes (initialisation vide puis remplissage par indexation), une confusion entre norme d'une différence et différence des normes, des complexités affirmées sans justification et une mauvaise maîtrise des chaînes de caractères.
Ce sujet d'informatique commune Mines MP PC PSI 2020 est-il difficile ?
Le rapport ne donne pas de verdict global tranché : il indique seulement que les copies sont très contrastées et que l'épreuve a bien joué son rôle de classement.
Le sujet d'informatique commune Mines 2020 utilise-t-il des bases de données SQL ?
Oui, la première partie demande d'écrire des requêtes SQL pour interroger une base de données de maillages avant de manipuler les facettes en Python.
Pas de description pour le moment
