Projet : étape 7 (semaine 10 du semestre)

Buts

Le sujet de cette semaine est le point culminant de notre projet: nous allons ici utiliser tous les concepts mis en place pour réaliser des simulations physiques plus complexes.
Ce sujet est assez long car il propose plein de pistes ; le but n'étant pas de tout faire, mais de choisir l'un ou l'autre exercice (de Physique) plus avancé (détails plus bas ; LIRE CE SUJET EN ENTIER AVANT DE COMMENCER !!!):


[3] Exercice P11 : simulation de situations physiques plus complexes

Pour pouvoir simuler des situations physiques plus complexes, nous avons besoin d'étendre notre « boite à outils » : plus de contraintes, plus de champs de forces, plus d'objets physiques...
Nous pouvons alors proposer de coder la situation décrite par plusieurs exercices de votre ancien cours de « Physique Avancée 1 ». Commencez peut être par rapidement regarder quel(s) exercice(s) vous souhaiteriez simuler, pour ensuite choisir quelles extensions (contraintes, champs de forces, point matériel « périodique ») vous sont nécessaire.
Il n'est en effet pas attendu que vous codiez tout ce qui est décrit ici, mais la sous-partie nécessaire pour coder l'exercice qui vous intéresse.

P11.1 - Plus de contraintes

P11.1.a - Contrainte sphérique

La contrainte sphérique est une contrainte obligeant un objet dont le vecteur d'état s'interprète comme deux angles (voir aussi plus loin), à évoluer sur une sphère de rayon fixé. Cela peut permettre de décrire un pendule sphérique (voir la section B.3, pages 13 et suivantes, du complément mathématique), ce qui inclut aussi tout objet roulant dans une sphère (comme une bille dans un bol ou les motos dans une « boule de la mort »).

Si la contrainte sphérique vous semble trop complexe pour commencer, vous pouvez suivre une démarche similaire, mais simplifiée (1 seul angle) pour décrire une contrainte sur un cercle dans un plan donné (que vous pouvez même arbitrairement fixer à x=0).

Une telle contrainte doit donc recevoir un rayon, qui sera fourni à la construction et plus modifié. (Et il ne doit pas voir de valeur par défaut.)

Utilisez les équations données dans la section B.3, pages 13 et suivantes, du complément mathématique pour implémenter cette contrainte. On considérera que la première composante du vecteur d'état de l'objet correspond à θ et la seconde à φ.
Attention à l'orientation de k dans cette annexe : il est dans le sens de g (et vaut donc (0, 0, -1)).

Il faudra aussi prêter attention au point singulier θ=0. Dans ce cas, imposez simplement φ_point_point à être nul.

Pour les fonctions position() et vitesse, implémentez simplement les transformations de coordonnées sphériques en coordonnées cartésiennes.

P11.1.b - Aller de l'avant

Cette contrainte permet de déplacer de façon rectiligne uniforme un objet suivant la première direction de l'espace physique (qui ne sera donc pas considéré comme un degré de liberté de l'objet).
Les degrés de liberté de l'objet sont alors considérés comme les coordonnées suivantes (détaillé ci-dessous).

Concrètement, cette contrainte est une contrainte libre du point de vue des forces (même méthode applique_force()), elle ne fait que calculer la position physique et la vitesse physique de l'objet.
Elle a besoin de deux paramètres: une vitesse (scalaire; à fournir nécessairement) et un temps (valeur par défaut : 0.0).

La position calculée par cette contrainte doit être de dimension la « dimension de l'espace physique » des objets physiques (revoir l'exercice P7 à ce sujet). La première composante de cette position sera simplement le produite de la vitesse de la contrainte par son temps. Les composantes suivantes seront ensuite simplement les valeurs du vecteur d'état de l'objet (on pourra soit lancer une exception si la dimension de l'espace d'état de l'objet n'est pas un de moins que sa dimension de l'espace physique, soit mettre les 0.0 qui conviennent; libre à vous de choisir).

On procédera de même pour la vitesse calculée par cette contrainte (sa première composante sera donc simplement la vitesse de la contrainte).

Il faudra aussi une méthode pour mettre à jour le temps (simple « méthode set »).

P11.2 - Plus de champs de forces

P11.2.a - Frottement fluide

Un frottement fluide est un champ de forces qui nécessite un paramètre, le coefficient de frottement -- disons λ -- et qui pour un objet donné retourne -λ fois la vitesse de cet objet.

P11.2.b - Champ électromagnétique constant

Un champ électromagnétique constant est défini par deux vecteurs : un champ électrique et un champ magnétique.
La force qu'il retourne est le produit de la charge de l'objet (à voir lequel) par la somme du champ électrique et du produit vectoriel de la vitesse de l'objet par le champ magnétique (F = q ( E + v ^ B )).

P11.2.c - Champ d'une particule chargée

Bien que non utilisé dans les exercices suggérés plus bas, il peut être intéressant de coder un champ électrique engendré par une charge, de façon très similaire à celle utilisée pour coder un champ gravitationnel newtonien.

P11.2.d - Suspension sur route sinusoïdale

Comment modéliser la force de rappel d'une suspension (un ressort, donc) d'une roue roulant sur une route sinusoïdale ? On pourrait penser à représenter le ressort d'un coté, et mettre une contrainte de route sur la position. Ce serait une possibilité. Je vous en propose une autre : c'est en fait bel et bien un champ de forces: une force différente pour chaque point de l'espace: force de rappel subie par la roue lorsqu'elle est en ce point de l'espace (faites un dessin) et, si nécessaire, nulle par convention si on est sous la route ou au dessus du point de compression maximale de la suspension, mais ce ne sera pas nécessaire de prendre ces aspects en compte.

Définissez un champ de force ayant trois paramètres : la constante de raideur k du ressort de la suspension, l'amplitude A et la période L des bosses (celles et ceux qui veulent faire plus général et carrément passer l'équation de la route comme paramètre peuvent, bien sûr, le faire).

La force retournée par ce champs sera alors k * ( A * sin(2π x / L) - y ) x est la premier composante de la position de l'objet et y la seconde.

P11.3 - Composition (de ChampForces ou de Contraintes)

Un schéma classique de conception est celui de la composition: chaque fois qu'un « objet » (au sens large) peut se composer avec un autre « objet » pour en donner un troisième. Par exemple, l'union de deux ensembles est un ensemble, la composition de deux (demi-)scènes visuelles serait une scène visuelle, etc., et pour nous, p.ex., la composition (addition) de deux champs de forces est un champ de forces. Cela permet ensuite d'en composer autant que l'on veut.

Implémentez la notion de ChampCompose qui est un champ de forces et contient un ensemble (de tailles quelconque) de champs de forces. Sa méthode force() est simplement la somme de celles de ses composantes.

Vous pouvez aussi, si vous le souhaitez, faire de même avec la notion de contraintes. Par contre, s'il n'est pas difficile d'imaginer la composition des applique_force() des contraintes (somme), il est nettement moins clair comment les positions et vitesses de celles-ci doivent se composer. Cela nous emmènerait trop loin dans ce projet que de le définir proprement. Vous pouvez donc ici faire le choix que vous voulez.
(Pour aller plus loin, on pourrait imaginer une méthode supplémentaire qui au lieu de passer du vecteur d'état à une position passerait d'une position physique à une autre position physique. On pourrait alors utiliser la méthode qui passe du vecteur d'état à une position physique pour le premier champ de forces, puis ensuite composer (appels successifs enchaînés) les secondes méthodes de tous les champs de forces suivants.)

P11.4 - Points matériels à vecteur d'état angulaire périodique

Un point matériel à vecteur d'état angulaire périodique est simplement un point matériel dont toutes les composantes du vecteur d'état représentent des angles. Pour éviter des dérives numériques (angles tendant vers l'infini), il est souhaitable de contrôler l'évolution de ces vecteurs d'état en appliquant systématiquement une remise des valeurs des composantes dans un intervalle raisonnable (p.ex. entre -2π et 2π; il n'est pas du tout nécessaire que cet intervalle soit minimal, c'est simplement une contrainte numérique pour éviter des valeurs trop grandes).

Définissez une classe pour représenter de tels points matériels.

Note : pour prendre le modulo en double, il existe la fonction fmod().

P11.5 - Points matériels chargés

Pour les exercices utilisant des champs électromagnétiques, il est nécessaire d'avoir la notion de charge électrique. N'étant pas moi-même assez Physicien pour trancher si tout objet physique a une charge (éventuellement nulle) ou si les objets avec charge sont des objets particuliers, je vous laisse réfléchir (et débattre ?) sur la meilleure façon de représenter les charges électriques dans votre projet.

P11.6 - Plus de simulations physiques

Comme dit dans le descriptif général du projet, et rappelé en préambule, il n'est pas du tout demandé de tout faire. Votre rendu final devra au minimum contenir la simulation de trois exercices :

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

Pour chaque nouvel exercice, développez le dans un fichier C++ séparé, de nom exerciceP11-SUFFIXE.cc où le SUFFIXE est assez clair, et indiquez dans votre fichier README plus précisément de quel exercice de Physique il s'agit (et en deux mots sur quoi porte cet exercice).
Vous pouvez, bien sûr, choisir d'autres exercices de Physique qui vous semblent pertinents.

P11.6.a - Pendule(s simple et) sphérique

Pour décrire un pendule sphérique (voir la section B.3, pages 13 et suivantes, du complément mathématique), vous aurez besoin :

Si le pendule sphérique vous semble trop complexe pour commencer, vous pouvez suivre une démarche similaire, mais simplifiée (1 seul angle) pour décrire un pendule simple.

Dans un fichier exerciceP11-spherique.cc, créez une simulation d'un pendule sphérique de masse 0.1, de rayon 2.2 m, ayant pour état initial θ=π/6, φ=0 et vecteur de vitesse angulaire initiale 0 en θ et 1 radian/s en φ.

Avec un intégrateur d'Euler-Cromer et un pas de temps de 0.01 s, vous devriez obtenir les résultats ci-dessous.

Notes :

t    theta              phi                 theta_point          phi_point         theta_point_point  phi_point_point
0    0.5235987755982988 0                    0                   1                 -1.796532752653235 0
0.01 0.5234191223230334 0.01                -0.01796532752653235 1                 -1.795928806725417 0.06225954837781691
0.02 0.5230598761670956 0.02000622595483778 -0.03592461559378653 1.000622595483778 -1.794182054368574 0.1246791180114517
0.03 0.5225212118057209 0.03002491982147671 -0.05386643613747226 1.001869386663893 -1.791291603567109 0.1874137280771019
0.04 0.5218034182839895 0.04006235506092335 -0.07177935217314335 1.003743523944664 -1.787255224504176 0.2506198458189081
0.05 0.5209068992398076 0.05012485228495188 -0.0896519044181851  1.006249722402853 -1.782069336370837 0.3144560671811695
0.06 0.5198321732619887 0.06021879511569853 -0.1074725977818935  1.009394283074665 -1.775728985841229 0.3790838104808466
0.07 0.5185798743855856 0.07035064632749326 -0.1252298876403058  1.013185121179473 -1.768227816973674 0.4446680267160177
0.08 0.5171507527274852 0.08052696434195959 -0.1429121658100425  1.017631801446633 -1.759558032212391 0.5113779301551423
0.09 0.5155456752661636 0.09075442014944143 -0.1605077461321664  1.022745580748185 -1.749710344076112 0.5793877528927653
0.1  0.5137656267704342 0.1010398147322126  -0.1780048495729275  1.028539458277112 -1.738673917027829 0.648877527085006

Et pour les positions :

t    x                 y                   z
0    1.1               0                   1.90526
0.01 1.09960271436322  0.01099639369253228 1.905453476181142
0.02 1.098753174859534 0.02198483750007605 1.905848401016248
0.03 1.097451467178457 0.03296079757895475 1.906440102130359
0.04 1.095697732307536 0.04391973104898011 1.907227709698218
0.05 1.093492167958638 0.05485708391365524 1.908210045817182
0.06 1.09083503049503  0.06576828901962385 1.909385625902829
0.07 1.087726637352062 0.07664876407141404 1.910752660435437
0.08 1.084167369942385 0.08749390971725542 1.912309057060234
0.09 1.080157677034912 0.09829910772143004 1.914052423044811
0.1  1.075698078594878 0.1090597192382522  1.915980068097516

P11.6.b - Mouvement dans un champ magnétique avec frottement (exercice PA1 4.3 ?)

On s'intéresse ici au mouvement d'une particule massique chargée dans un champ magnétique constant et dans un fluide (ayant donc une force de frottement fluide), tel que décrit par l'exercice 3 de la série 4 de votre cours de Physique Avancée I au semestre passé (si mes sources sont bonnes).

Pour décrire une telle situation, vous aurez besoin :

Note : l'exercice en question néglige les effets de la gravité ; vous n'avez donc pas besoin ici du champ gravitationnel constant.

Dans un fichier exerciceP11-magnetique.cc, créez :

Avec un intégrateur d'Euler-Cromer et un pas de temps de 0.001 s, vous devriez obtenir les résultats ci-dessous.

Notes :

t     x           y
0     0           0
0.001 0.00029997 -2e-09
0.002 0.00059992 -5.99965e-09
0.003 0.00089984 -1.19986e-08
0.004 0.00119973 -1.99965e-08
0.005 0.0014996  -2.99929e-08
0.006 0.00179944 -4.19876e-08
0.007 0.00209926 -5.59801e-08
0.008 0.00239904 -7.19702e-08
0.009 0.0026988  -8.99574e-08
0.01  0.00299854 -1.09941e-07
0.011 0.00329824 -1.31922e-07
0.012 0.00359793 -1.55899e-07
0.013 0.00389758 -1.81871e-07
0.014 0.00419721 -2.09839e-07
0.015 0.00449681 -2.39801e-07
0.016 0.00479638 -2.71759e-07
0.017 0.00509593 -3.05711e-07
0.018 0.00539545 -3.41657e-07
0.019 0.00569495 -3.79596e-07
0.02  0.00599442 -4.19529e-07
0.021 0.00629386 -4.61454e-07
0.022 0.00659327 -5.05372e-07
0.023 0.00689266 -5.51283e-07
0.024 0.00719203 -5.99185e-07
0.025 0.00749136 -6.49079e-07
0.026 0.00779067 -7.00963e-07
0.027 0.00808995 -7.54839e-07
0.028 0.00838921 -8.10705e-07
0.029 0.00868844 -8.68561e-07
0.03  0.00898764 -9.28407e-07

P11.6.c - Champ de bosses : le salaire de la peur (exercice PA1 8.2 ?)

On s'intéresse ici au mouvement de la roue d'un camion avec suspension (ressort), dans un champ de bosses, tel que décrit par l'exercice 2 de la série 8 de votre cours de Physique Avancée I au semestre passé (si mes sources sont bonnes).

Pour décrire une telle situation, vous aurez besoin :

Note : si vous l'avez implémentée, il peut être intéressant d'utiliser ici la notion de « dimension de l'espace physique » des objets physiques (et choisir 2 ici).

Dans un fichier exerciceP11-route.cc, créez :

Avec un intégrateur d'Euler-Cromer et un pas de temps de 0.01 s, vous devriez obtenir les résultats ci-dessous.

Note : l'intégrateur d'Euler-Cromer n'est pas assez précis (ordre 1, c.-à-d. erreur croissant linéairement avec le temps); il est donc normal, si vous comparez avec la courbe théorique, que vous constatiez un écart croissant; l'amélioration de la précision de l'intégrateur est justement le but du sujet de la semaine prochaine.

t       x     z
0       0     0
0.01    0.04 -0.000981
0.02    0.08 -0.00223669
0.03    0.12 -0.00306844
0.04    0.16 -0.00283143
0.05    0.2  -0.000977585
0.06    0.24  0.00290695
0.07    0.28  0.00907151
0.08    0.32  0.0175797
0.09    0.36  0.028298
0.1     0.4   0.0408954
0.11    0.44  0.0548542
0.12    0.48  0.0694904
0.13    0.52  0.0839853
0.14    0.56  0.0974244
0.15    0.6   0.108843
0.16    0.64  0.117279
0.17    0.68  0.121821
0.18    0.72  0.121665
0.19    0.76  0.116163
0.2     0.8   0.104865
0.21    0.84  0.087561
0.22    0.88  0.0643007
0.23    0.92  0.0354152
0.24    0.96  0.00151839
0.25    1    -0.0365022
0.26    1.04 -0.0775078
0.27    1.08 -0.120143
0.28    1.12 -0.162883
0.29    1.16 -0.204088
0.3     1.2  -0.242067

P11.7 - Aller encore plus loin ?

Avec cet exercice, nous avons terminé avec l'aspect physique du projet (la semaine prochaine porte sur les intégrateurs numériques). On pourrait bien sûr aller encore bien plus loin comme

mais serait-ce bien raisonnable ?...


Dernière mise à jour le 29 avril 2025
Last modified: Tue Apr 29, 2025