Projet Informatique 2025 :
Simulateur pour exercices de Physique.
Présentation

Remerciements

Je tiens à remercier chaleureusement Melle Lucie Moulin et M. Raphaël Faltin pour leur aide précieuse lors de la conception de ce projet.

Description générale du projet

Voici une présentation générale du projet que vous aurez à réaliser ce semestre. Il ne s'agit ici que d'une présentation générale pour vous donner le cadre. De nombreuses explications complémentaires vous seront fournies au fur et à mesure du semestre et les détails mathématiques ont été regroupés dans un document PDF, complément mathématique du projet.

Buts

Le but du projet de cette année est de simuler le comportement d'un système composé de plusieurs objets physiques de différente nature tels que vous avez pu en modéliser dans les exercices de votre cours de « Physique avancée » le semestre passé. Un des buts est justement de simuler numériquement certains de ces exercices.

L'intérêt est double :

Positionnement du problème

Le problème de la simulation d'un tel système est double :

  1. tout d'abord, calculer toutes les interactions entre toutes les composantes en interaction (objets, forces, contraintes) ;
  2. ensuite (et principalement) calculer le mouvement de chacun des objets.

Il y a pour cela fondamentalement deux types d'approches (qui peuvent être complémentaires) : simuler toutes les interactions physiques, ou bien intégrer numériquement les équations globales du mouvement (lesquelles auront été au préalable calculées sur le papier).
Un des intérêts du projet de cette année est d'utiliser une combinaison de ces deux approches.

Le système que l'on souhaite simuler sera donc constitué de divers objets (points matériels, essentiellement) que nous aurons pris soin de modéliser du point de vue mathématique, puis de programmer.

Il y a de nombreuses façons de modéliser informatiquement un problème aussi général (voir les remarques sur les choix de conception). Pour simplifier, nous considérerons qu'il y a 3 types d'objets sur lesquels nous ferons diverses hypothèses simplificatrices, et que nous ferons évoluer au cours du développement du projet :

  1. les objets mobiles, soumis à des forces extérieures et dont on connaît l'équation du mouvement (exemple : un point matériel dans un champ gravitationel) ;
  2. des champs de forces immatériels (exemples : gravité, champs électromagnétique, vent, ...) qui ajoutent des forces aux objets mobiles ;
  3. des contraintes qui modifient les forces subies par les objets; p.ex. rester sur un plan, être maintenu par une tige (pendule pesant ou pendule sphérique), ...

Plus concrètement, un objet mobile sera caractérisé par un certain nombre de degrés de liberté, différentes forces, et une équation d'évolution donnée par ses contraintes. Il pourra aussi avoir des paramètres internes spécifiques suivant les besoins (typiquement sa masse, sa charge, ...).

Par exemple dans le cas simple d'un pendule pesant :

[Figure : pendule pesant]

l'objet est caractérisé par le paramètre θ, angle d'écart par rapport à la position d'équilibre, et l'équation :

m L2 θ'' + b θ' + m g L sin(θ) = 0,

qui décrit son mouvement au cours du temps, où x' représente (de façon générique) la dérivée temporelle de x : x'=dx/dt.
Les paramètres internes spécifiques au système étant ici la longueur L du pendule, la masse m et éventuellement (optionnel) le coefficient de frottements fluides b.

Tous les détails sont fournis dans le complément mathématico-physique du projet (format PDF), mais fondamentalement, du point de vue mathématique, un objet mobile sera donc caractérisé par un vecteur d'état En dimensions), sa dérivée temporelle E' et une fonction f(t, E, E') (de RxRnxRn dans Rn) telle que le système ait pour équation d'évolution :

E'' = f(t,E, E').

Par exemple dans le cas précédent, E=θ (de dimension 1) et f(t, E, E') = -g/L sin(E) -b/(m L2) E'.

Un autre exemple serait un objet libre (sans rotation propre) dans l'espace à 3 dimensions. Dans ce cas, E n'est autre que sa position et E' sa vitesse.

D'un point de vue graphique, les objets auront par ailleurs une fonction spécifique permettant de les représenter à partir de leurs paramètres (vecteur d'état et paramètres internes) ; par exemple dans le cas du pendule, ce sera une fonction dessinant une barre de longueur L inclinée de E par rapport à la verticale.

Du point de vue modélisation, l'équation d'évolution et la fonction spécifique permettant de représenter un objet sont regroupées dans la notion de contrainte (s'appliquant à l'objet).

Principes généraux pour la conception

Pour résumer les objets auront (au moins) 2 fonctions, qui nous guideront pour notre conception :

  1. une fonction pour les faire évoluer (disons evolution() ou mise_a_jour() ou update() si vous préférez coder en anglais) ;
  2. et une pour les représenter/dessiner (dessine_sur()), qui sera adaptée soit au mode texte, soit au mode graphique.

D'un point de vue physique cela correspond d'un coté à l'évolution de l'objet dans l'espace des phases (c.-à-d. dans ses paramètres propres) et de l'autre à son évoluation dans le monde 3D de visualisation.

Remarques au sujet de la conception

Nous avons proposé ci-dessus un cadre général pour une conception du projet qui nous semble réalisable dans le cadre de ce cours. Elle n'est

Simuler ce « petit monde »

Le but du projet est de simuler l'évolution temporelle d'un système tel que décrit ci-dessus. D'un point de vue programmation informatique, il faudra bien sûr pour cela concevoir les classes/objets nécessaires et les organiser de façon pertinente (héritage, encapsulation, cf cours à venir).

D'un point de vue mathématique (analyse numérique), nous allons chercher à calculer numériquement (et non pas analytiquement) une solution approchée au problème précédent (intégration numérique des équations du mouvement).

Connaissant les équations qui régissent le problème, et connaissant toutes les données (positions et vitesses) à un certain temps t, on cherche à calculer itérativement une solution approchée au temps t+dt, où dt est ce que l'on appelle le « pas de temps » ou « pas d'intégration » (qui peut être fixe ou variable selon les méthodes. Ici, il sera fixe). Plus il est petit, plus la solution s'approche de la solution réelle, mais plus elle est longue à calculer.

Nous reviendrons plus en détail sur ces méthodes d'intégration le moment voulu (semaine 6), mais l'idée générale de base de la simulation est la suivante :

Spécification (minimale)

Pour viser le 6, la simulation devra au minimum contenir la simulation de trois exercices (qui seront précisés au fur et à mesure du semestre):

avec au moins deux intégrateurs différents (au choix; pas en même temps) (semaine 11).

Il est impératif que le projet compile et s'exécute correctement sur les VMs de l'Ecole (VM IC-CO-IN-SC), seules machines officielles de ce cours.

Un barème précis vous est fourni sur la page d'administration du projet.

Bien sûr, plusieurs pistes d'extension seraient possibles (mais hors projet) :

...mais ne passez pas trop de temps sur ce projet, en particulier au détriment des autres branches !!

Administration

Rendu

Le projet est à réaliser impérativement en groupe de deux personnes sans aucune exception. Les groupes sont à constituer d'ici au 13 mars 2025.

Concernant le rendu, nous ne vous demandons pas de rapport (document) sur le projet ; par contre, nous vous demandons de commenter abondamment et intelligemment les codes sources que vous nous rendrez (les commentaires remplaceront le rapport) et de fournir quatre fichiers complémentaires :

En plus des commentaires usuels sur le code lui-même (qui seront pris en compte dans la notation du projet), vous avez tout loisir de porter un regard critique sur la modélisation du problème proposée, d'identifier les faiblesses et insuffisances de ce modèle, et naturellement de proposer des solutions pour pallier ces faiblesses.

Tous ces fichiers (JOURNAL, REPONSE, CONCEPTION et README) peuvent être écrits dans n'importe quel format ouvert : texte simple (par exemple dans geany, gedit, emacs, ...), PDF, OpenDocument, ..., mais en aucun cas dans un format propriétaire fermé ! (Les .doc sont un format propriétaire fermé, donc exclus !)

La date limite de remise du projet est le dimanche 1er juin à 23:59. (Cette date est absolument impérative. Aucune extension de délai ne sera accordée !)

Organisation du travail

Ce projet constitue une part importante de l'évaluation du cours (la moitié) et est spécifié de façon assez large pour permettre un travail créatif. Le « danger » est donc grand de se laisser submerger par ce projet ; ce qu'il faut éviter à tout prix ! Voici donc plusieurs conseils et remarques afin d'organiser au mieux votre travail, dans une harmonie maximale avec toutes les autres contraintes de votre semestre.

Pour bien apprendre la programmation, il faut pratiquer. Cela ne se fait pas du jour au lendemain et demande en effet une certaine quantité de travail et une certaine régularité. Néanmoins, vous n'êtes pas en Section d'Informatique et cette quantité de travail doit rester raisonnable (entre 5 et 7 heures grand maximum par semaine tout compris (cours, exercices, travail personnel ; soit entre 2 et 4 heures grand maximum de travail « à la maison »)).
[ A noter qu'il s'agit là d'une branche de semestre pour laquelle vous ne travaillez plus du tout après le dernier cours (c.-à-d. pas de période de révisions). La période sur laquelle vous devez fournir le travail pour cette branche étant plus courte, il est évident qu'à charge totale égale, la charge par semaine devient plus grande. ]
Réussir à tout prix la branche « Programmation Orientée Objet », au détriment des autres branches, ne me semble pas une bonne solution. Comme a dit un de vos prédécesseurs : «Ça ne sert à rien de faire 6.0 au projet si c'est pour quitter l'EPFL ensuite !»
Apprenez à vous organiser, à correctement gérer votre temps et vos priorités.

Si donc certains passent effectivement trop de temps sur ce projet, et, pire !, au détriment d'autres branches, c'est essentiellement pour les raisons suivantes :
[ Mais je ne voudrais cependant pas par mes remarques donner une image trop négative de ce projet et tiens donc à signaler ici qu'il y a chaque année un grand nombre d'étudiants qui arrivent très bien à gérer ce projet et considèrent que c'est une charge lourde certes, mais justifiée, non excessive et enrichissante. ]

  1. une mauvaise répartition du travail entre binômes et dans le temps ;
  2. une mauvaise évaluation du travail à effectivement fournir dans ce projet ;
  3. une mauvaise gestion des contraintes et priorités.

Pour 1) : le projet est un travail que je vous demande d'effectuer en binôme (ne faites donc pas le travail à double) et de commencer dès le début du semestre.

Pour 2) : le projet est en effet conçu dès le départ pour laisser une large place à la création et au développement personnel. Il est de plus prévu pour une population extrêmement hétérogène. Plusieurs ont donc tendance à trop en faire : trop par rapport aux attentes minimales du cours (niveau 2) et trop par rapport à leur propre niveau en programmation. Je constate chaque année chez certains une implication dans le projet disproportionnée par rapport à leur niveau effectif. Utilisez le barème et le niveau indiqué des exercices pour travailler à votre niveau (ou légèrement au dessus). En clair : faites ce que vous pouvez en un temps imparti, au lieu d'essayer de faire le maximum en un temps infini ! Fixez-vous un objectif raisonnable, atteignable pour votre niveau.

Le point 3) [gestion des contraintes et choix des priorités], est une conséquence du point précédent : ne sachant se limiter raisonnablement dans le projet, certains s'investissent trop dans cette branche de semestre au détriment d'autres branches plus fondamentales pour leur Section. Cela relève plus largement de l'organisation globale de leurs études et de la bonne gestion des contraintes que la charge de travail globale, à laquelle ils n'étaient pas habitués au Gymnase, leur impose.

Donc, pour résumé à ce stade, je dirais : faites attention à bien vous organiser et à ne pas vous laisser noyer par le projet. C'est dans ce sens que je vous donne les conseils d'organisation suivants.

Ce projet est prévu pour être réalisé partiellement pendant les séries d'exercices et partiellement sous forme de travail personnel indépendant : comme la programmation complète du projet n'est évidement pas envisageable sur un laps de temps réduit aux séances d'exercices, vous ne pourrez réaliser lors de ces séances que des portions de l'ensemble du projet, le reste devant être fait « à la maison ». Profitez par contre des séances d'exercices pour poser des questions aux assistants.

Par ailleurs, je vous conseille de vous assurer avoir bien compris les concepts présentés en cours avant de vous lancer dans la réalisation de la nouvelle partie correspondante du projet, par exemple en faisant au préalable quelques exercices proposés dans les séries ou dans le livre (nombre et difficulté en fonctions de votre niveau). Une fois les concepts bien compris, la réalisation du projet constitue bien sûr aussi un entraînement et une révision pour la série notée ou l'examen écrit.

La réalisation informatique du projet comporte plusieurs aspects :

N'abordez pas tous ces aspects de front, ni à la fois : organisez votre travail et votre projet et fixez vous des objectifs raisonnablement atteignables.

Ce projet est prévu pour être réalisé par binômes. Nous vous conseillons de rapidement vous répartir les tâches au sein du binôme (voir ici pour le travail en groupe). Il est évident pour moi que vous ne devez pas chacun faire tous les exercices liés au projet. Je considère qu'une personne doit faire seulement environ la moitié de ces exercices. Essayez donc de rapidement vous organiser, concevoir correctement la répartition des tâches et utiliser la conception modulaire et la compilation séparée (Makefile) afin de diminuer votre charge de travail individuelle.

Pour cela, je vous conseille de :

  1. répartir le travail au sein du binôme (définir qui fait quelles classes) ;

  2. faire les interfaces (méthodes publiques) de toutes les classes, même si la plupart restent vides ou ne contiennent au départ qu'un simple affichage ;

  3. commencer à implémenter, à votre rythme, chacune des classes ;

    procéder classe par classe, en pensant bien à faire un fichier de test complémentaire testant les points (qui vous semblent) critiques de la classe ;

  4. noter clairement dans votre JOURNAL ce que vous avez fait, où vous en êtes et ce qu'il vous reste à faire.

Un des buts du projet est justement de vous apprendre à développer du code en parallèle et de façon complémentaire. Par contre, jetez quand même un coup d'œil à la partie développée par votre partenaire et discutez-en ensemble. Vous apprendrez sûrement beaucoup de ce genre de pratique.

Enfin, pour vous faciliter la vie durant le projet :

Je terminerai par une note au sujet de la tricherie :
L'échange d'idée entre groupes ou avec des tiers est autorisée (et même recommandée). Par contre, l'échange de code est strictement interdit (cela inclut la diffusion de code sur le forum) ! Le plagiat de code de quelque façon que de soit et quelle qu'en soit la source sera considéré comme de la tricherie (en plus, c'est illégal et passible de poursuites pénales).

En cas de tricherie, vous recevrez la note « NA », soit pour le projet, soit même pour l'entièreté du cours. Vous serez de plus dénoncés et punis suivant l'ordonnance sur la discipline.
(je me permets également de vous rappeler le code d'honneur et le code de déontologie dont vous avez pris connaissance au début de vos études).

Dans tous les cas, il est fortement conseillé de pouvoir expliquer toutes les lignes de code de son projet.

Décomposition en sous-tâches / séries associées

Voir ici l'échéancier détaillé, semaine par semaine.

Bibliographie


Dernière mise à jour le 7 février 2025
Last modified: Fri Feb 7, 2025