Même les oeufs (durs) savent calculer une intégrale!


C'est un vieux truc que de faire tourner un oeuf sur la table pour vérifier s'il est cuit dur ou non.
Dans le premier cas, et si sa vitesse de rotation est suffisante, l'oeuf va changer son axe de rotation et va se mettre “debout” (à la verticale) pour tourner autour de son axe de symétrie, sa partie arrondie en bas et sa partie pointue en haut. Puis, à cause du frottement, il finira sa course en position de repos avec son axe de symétrie à l'horizontale, qui est la position qu'il prend lorsqu'on le pose sur la table. Si l'oeuf n'est pas cuit, le jaune d'oeuf va agir comme un frein à la rotation et il ne sera pas possible de lui faire prendre la position debout.
Dans cette page, nous allons expliquer le pourquoi du titre, certes un peu provocateur… Est-ce que les oeufs “savent” vraiment calculer une intégrale ? Bien sûr que non! Et pourtant, d'après le principe de la moindre action, ou principe de Maupertuis, choisir la rotation autour de son axe de symétrie revient à minimiser le moment d'inertie de l'oeuf par rapport à l'axe de rotation, et ce moment d'inertie se calcule avec une intégrale triple. Pour plus de détails sur ce principe et bien d'autres choses intéressantes, cliquer ICI.
Par définition du moment d'inertie, la fonction à intégrer est le carré de la distance d'un point quelconque du solide à l'axe de rotation, multiplié par l'élément de volume (dx dy dz, en coordonnées cartésiennes). Notre problème consiste alors à:
1) Choisir une description pour l'oeuf , bien qu'il n'existe pas de “définition” de l'oeuf.
2) Choisir une description de l'axe de rotation.
3) Choisir un système de coordonnées susceptible de rendre compte au mieux du “truc”.
4) Montrer qu'effectivement, l'axe de rotation choisi par l'oeuf correspond à la valeur minimale de l'intégrale triple calculant le moment d'inertie.

1) A première vue, un oeuf, ou plutôt sa coquille, ressemble à un cas particulier de l'ellipsoïde, une surface dont l'équation s'écrit en coordonnées cartésiennes: x2/a2 + y2/b2 + z2/c2 = 1, cas particulier parce que tous les oeufs ont ceci de commun qu'ils possèdent un axe de symétrie allant de la partie arrondie vers la partie pointue. En fait, la coquille n'est pas tout à fait un ellipsoïde de rotation et notre premier objectif est de trouver un moyen d'approcher au mieux la forme de cette coquille. Nous allons procéder ainsi: pour engendrer la coquille, nous utiliserons le graphe de deux fonctions. Pour la partie arrondie, nous choisirons simplement un quart de cercle de rayon r dont le graphe sera décrit par la fonction
u |-> racine de (r2 - u2), la variable u variant entre -r et 0.
Pour la partie pointue, nous choisirons un quart d'ellipse de demi grand axe a et de demi petit axe r (donc a > r) et, pour tenir compte de la réalité (il suffit de regarder dans un carton d'oeufs pour constater que c'est la partie pointue qui diffère le plus d'un oeuf à l'autre), nous allons introduire un paramètre, epsilon, compris entre 0 et 1, et considérer donc le graphe de la fonction
u |-> (1 - epsilon u2/a2) r Sqrt[1 - u2/a2], u variant entre 0 et a.
Les commandes suivantes dans Mathematica vont nous permettre de visualiser le cas particulier
r = 1, a = 2 et epsilon = 0.2:
Rappelons qu'il suffit de copier-coller chaque commande en caractères gras dans une session de Mathematica et de l'exécuter.
Bien que cette page ne contienne aucune figure, les commandes qu'elle contient vont vous permettre d'en produire une infinité !
   graphe1 = Plot[Sqrt[1-u^2],{u,-1,0},AspectRatio->Automatic]
   graphe2 = Plot[(1 - 0.2 u^2/4) Sqrt[1-u^2/4],{u,0,2}]
   graphe3 = Show[graphe1,graphe2]
Pour engendrer la coquille de l'oeuf, il nous suffit de faire tourner ce graphe3 autour de l'axe des u. La description paramétrique aura, dans Mathematica, la forme suivante :
coquille1 = ParametricPlot3D[{u,Sqrt[1-u^2] Sin[v],Sqrt[1-u^2] Cos[v]},{u,-1,0},{v,0,2Pi}]
coquille2 = ParametricPlot3D[{u,(1 - 0.2 u^2/4) Sqrt[1-u^2/4] Sin[v],(1 - 0.2 u^2/4) Sqrt[1-u^2/4] Cos[v]},{u,0,2},{v,0,2Pi}]
coquille = Show[coquille1,coquille2]
Il nous reste à “remplir” l'oeuf, c'est-à-dire à décrire non seulement les points de sa coquille, mais aussi les points à l'intérieur, ce que nous ferons à l'aide d'un paramètre t, variant de 0 à 1, de la façon suivante:
Pour la partie arrondie:
oeuf1[t_,u_,v_,r_,a_,epsilon_] := {u,t Sqrt[r^2-u^2] Sin[v],t Sqrt[r^2-u^2] Cos[v]} (* -r <= u <= 0 *)
Pour la partie pointue:
oeuf2[t_,u_,v_,r_,a_,epsilon_] := {u,t (1 - epsilon u^2/a^2) r Sqrt[1 - u^2/a^2] Sin[v],t (1 - epsilon u^2/a^2) r Sqrt[1 - u^2/a^2] Cos[v]} (* 0 <= u <= a *)
La commande suivante nous permet de dessiner l'oeuf de nos goûts, (et même plus!) :
oeuf[r_,a_,epsilon_]:= Show[ParametricPlot3D[{u,Sqrt[r^2-u^2] Sin[v], Sqrt[r^2-u^2] Cos[v]},{u,-r,0},{v,0,2Pi}, DisplayFunction ->Identity], ParametricPlot3D[{u,(1 - epsilon u^2/a^2) r Sqrt[1-u^2/a^2] Sin[v],(1 - epsilon u^2/a^2) r Sqrt[1-u^2/a^2] Cos[v]}, {u,0,a},{v,0,2Pi}, DisplayFunction ->Identity], DisplayFunction -> $DisplayFunction]
Par exemple, voici la commande qui produit notre oeuf du début :
oeuf[1,2,.2]

2) Le choix de l'axe de rotation est relativement facile et est en conformité avec le choix de la description de l'oeuf. On considère tout vecteur non nul {l,m,n} et on le rend unitaire en le divisant par sa norme, la racine carrée de la somme des carrés de ses composantes. Dans Mathematica, on peut définir cette norme pour un vecteur quelconque grâce à la définition suivante :
norme[vecteur_]:= Sqrt[vecteur . vecteur]
Le point désigne le produit scalaire du vecteur vecteur par lui-même.
axe[l_,m_,n_]:= 1/norme[{l,m,n}] {l,m,n}
Ce choix va nous permettre d'exprimer facilement le carré de la distance d'un point quelconque de l'oeuf à l'axe comme la différence entre le carré de la norme du vecteur repérant ce point quelconque et le carré du produit scalaire de ce même vecteur par le vecteur unitaire support de l'axe.
Ceci nous permet d'écrire le moment d'inertie de la partie arrondie comme l'intégrale de la fonction:
oeuf1[t,u,v,r,a,epsilon] . oeuf1[t,u,v,r,a,epsilon] - ( axe[l,m,n] . oeuf1[t,u,v,r,a,epsilon])2
multipliée par l'élément de volume approprié et, de manière analogue, pour la partie pointue, comme l'intégrale de la fonction:
oeuf2[t,u,v,r,a,epsilon] . oeuf2[t,u,v,r,a,epsilon] - ( axe[l,m,n] . oeuf2[t,u,v,r,a,epsilon])2

3) D'après ce qui précède, le choix du système de coordonnées pour calculer l'intégrale s'impose comme suit :le triplet {t,u,v} remplace les coordonnées cartésiennes {x,y,z}. Par conséquent, l'élément de volume dx dy dz sera remplacé par le jacobien de la transformation multiplié par dt du dv. Cette transformation s'écrit dans Mathematica:
Pour la partie arrondie :
   x1[t_,u_,v_]:= u
   y1[t_,u_,v_]:= t Sqrt[r^2-u^2] Sin[v]
   z1[t_,u_,v_]:= t Sqrt[r^2-u^2] Cos[v]
avec u variant de -1 à 0, t de 0 à 1 et v de 0 à 2 pi.
Pour la partie pointue :
   x2[t_,u_,v_]:= u
   y2[t_,u_,v_]:= t (1 - epsilon u^2/a^2) r Sqrt[1 - u^2/a^2] Sin[v]
   z2[t_,u_,v_]:= t (1 - epsilon u^2/a^2) r Sqrt[1 - u^2/a^2] Cos[v]
avec u variant de 0 à a, t de 0 à 1 et v de 0 à 2 Pi.
Les commandes suivantes vont calculer le jacobien correspondant :
jac1 = Det[Outer[D,{x1[t,u,v],y1[t,u,v],z1[t,u,v]},{t,u,v}]//Evaluate]//Simplify
jac2 = Det[Outer[D,{x2[t,u,v],y2[t,u,v],z2[t,u,v]},{t,u,v}]//Evaluate]//Simplify
En vertu des propriétés de l'intégrale, le calcul du moment d'inertie total du solide oeuf s'effectue en additionnant les résultats obtenus pour la partie arrondie et pour la partie pointue.
Pour la partie arrondie, on aura comme intégrand :
integrand1 = (oeuf1[t,u,v,r,a,epsilon] . oeuf1[t,u,v,r,a,epsilon] - ( axe[l,m,n] . oeuf1[t,u,v,r,a,epsilon])^2) jac1//Simplify
Le moment d'inertie correspondant sera donc :
moment1 = Integrate[integrand1,{u,-r,0},{t,0,1},{v,0,2Pi}]//Simplify
Pour la partie pointue, on aura comme intégrand :
integrand2 = (oeuf2[t,u,v,r,a,epsilon] . oeuf2[t,u,v,r,a,epsilon] - ( axe[l,m,n] . oeuf2[t,u,v,r,a,epsilon])^2) jac2//Simplify
Le moment d'inertie correspondant sera donc :
moment2 = Integrate[integrand2,{u,0,a},{t,0,1},{v,0,2Pi}]//Simplify
Avant de passer à la dernière partie, écrivons explicitement les résultats moment1 et moment2 obtenus par Mathematica. Le premier, très simple, nous montre que le moment correspondant est indépendant de la position de l'axe puisque l,m et n n'apparaissent pas dans son expression. Ceci n'a rien d'étonnant puisqu'on a calculé en fait le demi moment d'inertie d'une boule de rayon r, solide possédant une infinité d'axes de symétrie. Il en va tout autrement pour la partie pointue. Au premier abord, le résultat semble compliqué. Il contient à la fois les paramètres de l'oeuf (r, a et epsilon), et ceux de l'axe (l, m et n).
Les expressions qui suivent sont tirées des output de Mathematica via les commandes
InputForm[moment1] et
InputForm[moment2],
le symbole étoile * désignant la multiplication, ordinairement remplacé par un espace (2 3 et 2*3 donnent tous les deux 6 comme résultat).

moment1 = (4*Pi*r5)/15.

moment2 = (2*a*Pi*r2*(143*a2*(21 - 18*epsilon + 5*epsilon2)* (m2 + n2) + (3003 - 1716*epsilon + 858*epsilon2 - 260*epsilon3 + 35*epsilon4)*(2*l2 + m2 + n2)* r2))/(45045*(l2 + m2 + n2)).

4)Le calcul du moment d'inertie (moment1 + moment2) ci-dessus nous montre que, pour un oeuf donné, la contribution du moment2 dépend essentiellement de l'axe. Le principe de Maupertuis conduit à minimiser ce moment2 que nous écrirons dans Mathematica sous la forme un peu plus condensée d'une fonction de 3 paramètres a, r, w (au lieu de epsilon), et de trois variables x, y et z (au lieu de l, m et n)
f[a_,r_,w_,x_,y_,z_]:= (a*r^2*(143*a^2*(21 - 18*w + 5*w^2)*(y^2 + z^2) + (3003 - 1716*w + 858*w^2 - 260*w^3 + 35*w^4)*r^2*(2*x^2 + y^2 + z^2)))/(45045*(x^2 + y^2 + z^2))
Notons au passage que notre fonction f donne le résultat escompté si nous l'évaluons pour le cas particulier d'une sphère où nous savons que ce résultat doit être indépendant de l'axe. L'exécution de la commande
f[r,r,0,x,y,z] //Simplify
donne bien, à 2 pi près, le demi-moment d'inertie d'une sphère de rayon r, (4/15 pi r5), peut importe la position de l'axe de rotation passant par son centre.
Notons aussi que le résultat ne comporte que des termes positifs, car les deux polynômes en w sont toujours positifs. En effet, ils sont positifs pour w = 0 et n'admettent aucune racine réelle, comme on le voit en exécutant les commandes :
rac1 = NSolve[21 - 18 w + 5 w^2 == 0, w]
rac2 = NSolve[3003 - 1716 w + 858 w^2 - 260 w^3 + 35 w^4 == 0, w]
De plus, même dans le cas général, nous pouvons supposer que le vecteur non nul, support de l'axe de rotation, est unitaire et donc simplifier la fonction f en utilisant la condition (x2 + y2 + z2) = 1. Mathematica va le faire pour nous si nous lui demandons de remplacer y2 + z2 par 1 - x2 dans la fonction f, ce qui se traduit par la commande
expr = f[a,r,w,x,y,z] /. y^2 + z^2 -> 1 - x^2 // Simplify
A partir du résultat, qui s'écrit :
expr = (a*r^2*(-143*a^2*(21 - 18*w + 5*w^2)*(-1 + x^2) + r^2*(3003 - 1716*w + 858*w^2 - 260*w^3 + 35*w^4)* (1 + x^2)))/45045
il est relativement facile de voir qu'on atteint un minimum pour x = 1. La position optimale de l'axe est donc (1,0,0), c'est-à-dire l'axe de symétrie de l'oeuf. Comme nous l'avons obligé à tourner autour d'un axe vertical, l'oeuf prendra la position verticale pour que son axe de symétrie coïncide avec l'axe de rotation.

Retour à ma page personnelle



©jmt : création le 010719 - dernière modification le 011213