Archives pour la catégorie Uncategorized

Mathématiques pour les Sciences de l’ingénieur : étude balistique et autres véhicules à effort moteur constant

Contexte

Dans de nombreux cas en mécanique, que ce soit pour une analyse balistique d’un projectile ou une analyse dynamique d’un véhicule, on obtient une équation différentielle de ce type-là :

m_{eq} \dfrac{dv}{dt} =  F_{motrice} - F_{sec} - f_{visqueux} v - f_{fluide} v^2

Ici, on suppose que la vitesse v est toujours positive : il faudrait sinon prendre en compte le signe de la vitesse afin de s’assurer que le terme de frottement sec et le terme de frottement fluide soit toujours des termes de frottements, qui s’oppose toujours à une plus grande vitesse en valeur absolue.

Cas simplifié 1 : seulement des frottements secs

Cela revient à cette équation différentielle-ci :

m_{eq} \dfrac{dv}{dt} =  F_{motrice} - F_{sec}

On sépare les variables pour obtenir :

dv =  \dfrac{F_{motrice} - F_{sec}}{m_{eq}} dt

En intégrant, on obtient alors :

\displaystyle \int_{v_0}^{v(t')} dv =   \displaystyle \int_{0}^{t'} \dfrac{F_{motrice} - F_{sec}}{m_{eq}} dt

Soit, pour le résultat :

v(t') - v_0 =    \dfrac{F_{motrice} - F_{sec}}{m_{eq}} t'

Que l’on peut réécrire :

v(t) = v_0 + \dfrac{F_{motrice} - F_{sec}}{m_{eq}} t

Cas 2 : frottement sec + frottement linéaire en vitesse

La fonction différentielle légèrement plus compliquée est la suivante :

m_{eq} \dfrac{dv}{dt} =  F_{motrice} - F_{sec} - f_{visqueux} v

La valeur finale de la vitesse correspond à l’équilibre entre force motrice freinée et frottement visqueux, on obtient la valeur suivante :

v_{\infty} = \dfrac{ F_{motrice} - F_{sec} }{ f_{visqueux} }

On peut alors utiliser cette nouvelle variable pour réécrire l’équation différentielle :

m_{eq} \dfrac{dv}{dt} =  f_{visqueux} ( v_{\infty} - v)

On sépare encore une fois les variables pour obtenir :

\displaystyle \int_{v_0}^{v(t')} \dfrac{ dv }{  v_{\infty} - v  } =  \displaystyle \int_{0}^{t'} \dfrac{ f_{visqueux} }{m_{eq}} dt

On reconnaît une forme qui se rapproche de \ln(u)' = \dfrac{u'}{u}, et on s’en rapproche en multipliant par (-1) des 2 côtés :

\displaystyle \int_{v_0}^{v(t')} \dfrac{ -dv }{  v_{\infty} - v   } =  \displaystyle \int_{0}^{t'}   - \dfrac{ f_{visqueux} }{m_{eq}} dt

En intégrant (et en supposant que v_{\infty} >   v_0 ), on obtient donc :

\ln ( v_{\infty} -  v(t') ) -   \ln (  v_{\infty} -  v_0  )   = -\dfrac{ f_{visqueux} }{m_{eq}} t'

En utilisant les propriété du logarithme ainsi qu’en passant à l’exponentiel, on obtient :

\dfrac{ v_{\infty} -  v(t) }{  v_{\infty} -  v_0 } = \exp \left( - \dfrac{ f_{visqueux} }{m_{eq}} t \right)

Expression que l’on peut réarranger un petit peu :

v(t) =  v_{\infty} - \left( v_{\infty} -  v_0  \right)  \exp \left( - \dfrac{ f_{visqueux} }{m_{eq}} t \right)

Et enfin, on remplace f_{visqueux} par une expression faisant apparaître v_{\infty} :

v(t) =  v_{\infty} - \left( v_{\infty} -  v_0  \right)  \exp \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} } t \right)

Cas 3 : frottement sec + frottement quadratiques en vitesse

La fonction différentielle légèrement modifiée est la suivante :

m_{eq} \dfrac{dv}{dt} =  F_{motrice} - F_{sec} - f_{fluide} v^2

La valeur finale de la vitesse correspond à l’équilibre entre force motrice freinée et frottement fluide, on obtient la valeur suivante :

v_{\infty} = \sqrt{\dfrac{ F_{motrice} - F_{sec} }{ f_{ fluide } } }

On peut alors utiliser cette nouvelle variable pour réécrire l’équation différentielle :

m_{eq} \dfrac{dv}{dt} =  f_{ fluide  } ( v_{\infty}^2 - v^2)

On sépare une nouvelle fois les variables pour obtenir :

\displaystyle \int_{v_0}^{v(t')} \dfrac{ dv }{ v_{\infty}^2 - v^2 } =  \displaystyle \int_{0}^{t'}   \dfrac{ f_{ fluide } }{m_{eq}} dt

On reconnaît une forme qui se rapproche de artanh(u)' =  \dfrac{u'}{1-u^2}, et on s’en rapproche en divisant le numérateur et le dénominateur par v_{\infty}^2 :

\dfrac{1}{ v_{\infty} } \displaystyle \int_{v_0}^{v(t')} \dfrac{  \dfrac{dv}{ v_{\infty} } }{ 1 -  \left(  \dfrac{v}{ v_{\infty} }  \right) ^2   } =  \displaystyle \int_{0}^{t'}   \dfrac{ f_{ fluide } }{m_{eq}} dt

Une fois intégré, on obtient donc :

artanh  \left(  \dfrac{ v(t') }{ v_{\infty} }  \right) -  artanh  \left(  \dfrac{ v_0 }{ v_{\infty} }  \right)  =  \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t'

On peut ensuite utiliser une formule de trigonométrie hyperbolique :

tanh(a-b) = \dfrac{tanh\, a - tanh \,  b}{1 - tanh \,  a  \cdot tanh \,  b}

On obtient alors, en passant l’expression précédente à la tangente hyperbolique :

\dfrac{ \dfrac{ v(t) }{ v_{\infty}} -  \dfrac{ v_0 }{ v_{\infty} } }{1 -  \dfrac{ v(t) \cdot  v_0  }{ v_{\infty}^2 } } = tanh \left( \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t  \right)

Si on multiplie à gauche et à droite par \left(  1 -  \dfrac{ v(t) \cdot  v_0  }{ v_{\infty}^2 } \right) , on obtient :

\dfrac{ v(t) }{ v_{\infty}} \left( 1 +  \dfrac{ v_0  }{ v_{\infty}}   tanh  \left(  \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t    \right)   \right)  = \dfrac{ v_0 }{  v_{\infty}}  + tanh  \left(  \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t    \right)

D’où l’on déduit la relation suivante :

v(t) = v_{\infty} \dfrac{  v_0 +  v_{\infty} tanh  \left(   \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t    \right) }{  v_{\infty}  +   v_0  tanh  \left( \dfrac{ f_{ fluide } }{m_{eq}} v_{\infty} t  \right)  }

Pour se rapprocher de l’écriture des 2 autres relations, on peut remplacer f_{ fluide } pour faire apparaître v_{\infty} à la place :

v(t) = v_{\infty} \dfrac{  v_0 +  v_{\infty} tanh   \left(   \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t    \right) }{   v_{\infty}  +   v_0  tanh  \left( \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }  t  \right)  }

Cas particulier d’une vitesse initiale nulle et décalage temporel

Dans le cas particulier où l’on a une condition initiale nulle, cela se simplifie, pour les 3 cas :

v(t) = \dfrac{F_{motrice} - F_{sec}}{m_{eq}} t
v(t) =  v_{\infty} \left(  1-  \exp  \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} } t  \right)   \right)
v(t)  =  v_{\infty}  tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }  t \right)

Observons la vitesse atteinte au bout d’un temps t_0 :

v( t_0 ) = \dfrac{F_{motrice} - F_{sec}}{m_{eq}}  t_0
v( t_0 )  =  v_{\infty} \left(  1-  \exp  \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} }    t_0 \right) \right)
v( t_0 )  =  v_{\infty}  tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t_0 \right)

Et la poursuite de la dynamique de la vitesse à partir de ce temps-là s’écrit donc :

v(t + t_0) = \dfrac{F_{motrice} - F_{sec}}{m_{eq}} \left(  t + t_0 \right)
v( t + t_0 ) =  v_{\infty} \left(  1-  \exp  \left( -    \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }    \left(  t + t_0 \right)  \right) \right)
v( t + t_0 )  =  v_{\infty}  tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   \left(  t + t_0 \right)  \right)

Or, il est très simple alors de décomposer cette fonction grâce aux propriétés de la distribution de l’addition dans le premier cas, les propriété de l’exponentielle dans le second cas, et la propriété de la tangente hyperbolique pour le dernier cas :

v(t + t_0) =  \dfrac{F_{motrice} - F_{sec}}{m_{eq}} t_0 + \dfrac{F_{motrice} - F_{sec}}{m_{eq}}  t
v( t + t_0 ) =  v_{\infty} \left(  1- \exp  \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} }   t  \right)    \exp  \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} }    t_0 \right)  \right)
v( t + t_0 )  =  v_{\infty} \dfrac{ tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t  \right)   +  tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }  t_0  \right)  }{1 +   tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t  \right)     tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }  t_0  \right)   }

En réintroduisant la notation v(t_0), on obtient alors les équations suivantes :

v(t + t_0) =  v(t_0)  + \dfrac{F_{motrice} - F_{sec}}{m_{eq}}  t
v( t + t_0 ) =   v_{\infty} \left(  1-  \exp  \left( -   \dfrac{ F_{motrice} - F_{sec} }{   v_{\infty} m_{eq} }   t  \right)   \left(1 - \dfrac{ v(t_0) }{ v_{\infty} } \right)  \right)
v( t + t_0 )  =  v_{\infty} \dfrac{ tanh  \left(  \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t  \right)   +  \dfrac{v(t_0)}{ v_{\infty} }    }{1 +   tanh  \left(   \dfrac{   F_{motrice} - F_{sec}  }{  v_{\infty}  m_{eq} }   t  \right)      \dfrac{v(t_0)}{ v_{\infty} }    }

On peut ainsi se rendre compte que le décalage temporel et la condition initiale non-nulle produisent des équations semblables, et que l’on peut donc passer de l’un à l’autre. Cela est du au fait qu’il s’agit d’une équation différentielle à un seul état : arriver à une certain vitesse par n’importe quel moyen ne changera pas l’évolution de la vitesse à partir de ce point.

Pour simplifier, on ne va considérer que des conditions initiales nulles à l’instant 0 pour la suite.

Différence de comportement entre les 3 cas

Pour illustrer, voici l’allure de la vitesse pendant les 4 premières secondes sur une chute libre de vitesse initiale nulle et de vitesse terminale de 10 m/s :

En ce qui concerne l’allure des courbes de vitesse, les 3 modèles vont bien sûr donner des résultats très similaires si l’on atteind des vitesses faibles par rapport à la vitesse terminale v_{\infty}  . La distinction entre des forces de frottement linéaire ou quadratique en vitesse ne sont pas forcément évidentes à constater à l’oeil nu. De plus, on peut avoir un comportement transitoire d’un modèle à l’autre en fonction du nombre de Reynolds.

Mathématiques pour les Sciences de l’Ingénieur : la linéarisation

Tous les modèles sont faux, mais certains sont utiles.

George Box

Définition d’un système linéaire

Soit une relation provenant de lois physiques ou d’un comportement observé qui lie n entrées e_i et m sorties s_j. On peut mettre cette relation sous la forme d’une fonction de plusieurs variables f tel que :

f \left( e_0(t), e_1(t), ..., e_n(t), s_0(t), s_1(t), ..., s_m(t) \right) = 0

Cette relation représente un système linéaire si et seulement si la fonction respecte le principe de superposition :

  • à la somme de deux entrées quelconques correspond la somme des deux sorties correspondantes,
  • un multiple d’une entrée quelconque correspond le même multiple de la sortie correspondante.

Exemples de systèmes linéaires et non-linéaires

Prenons le système le plus simple, il est trivialement linéaire :

s(t) = 0

Un système avec une loi de proportionnalité entre l’entrée et la sortie est aussi linéaire :

s(t) = a \cdot e(t)

Par contre, une relation affine n’est pas linéaire :

s(t) = a \cdot e(t) + b

Bien sûr, l’apparition de toute autre fonction non-linéaire d’une des variables (fonctions logarithmiques, trigonométriques, puissances, exponentielles,…) rendra le système non-linéaire :

s(t) = \sin \left( e(t) \right)

Le produit de deux variables ou plus dans une relation correspond à un système non-linéaire :

s(t) = e_0(t) \cdot e_1(t)

L’apparition de dérivées temporelles peuvent tout à fait correspondre à des systèmes linéaires, lorsque ces dernières correspondent à des équations différentielles à coefficients constants :

a\dfrac{d^2 s(t)}{dt^2} +   b\dfrac{d \left( s(t) - e(t) \right)}{dt} +   c   \left( s(t) - e(t) \right)  =0

Mais bien sûr, toutes les équations différentielles ne correspondent pas à des systèmes linéaires :

s(t) = e(t) \cdot  \dfrac{d e(t)}{dt}

Dernier exemple d’un système linéaire, un retard pur :

s(t) = e(t-a)

Avertissement : vous ne savez traiter que les systèmes linéaires !

N’essayez pas de passer une relation dans le domaine de Laplace si elle ne correspond pas à un système linéaire : vous n’avez aucun outil pour gérer cela ! Il faut donc souvent linéariser afin de pouvoir utiliser tous les outils des SLCI (Systèmes Linéaires Continus Invariants).

Globalement, une relation d’un système linéaire doit être une combinaison linéaires des différentes grandeurs (entrées ou sorties) et de leurs dérivées successives par rapport au temps avec ou sans retards.

Comment rendre un système linéaire ?

Ce n’est pas la bonne question : ce que l’on souhaite surtout, c’est comment obtenir une relation linéaire qui permettrait de mieux modéliser notre système. Comme tous les modèles sont faux, on sait qu’aucun système n’est réellement parfaitement linéaire. Mais certains modèles sont utiles, et c’est en particulier parce qu’ils sont très pratique que l’on souhaite se rapprocher d’un modèle linéaire.

La question se ramène basiquement à comment approximer une fonction quelconque en une droite. Et la réponse la plus simple est de se rendre compte que, localement, toute fonction se confond avec sa tangente. Cette vérité se traduit par la formule de Taylor au premier ordre :

f(x+h) = f(x) + h \cdot f'(x) + O(h^2)

Sauf que cette fois, la fonction f est une fonction de plusieurs variables. On va donc plutôt utiliser la notion de différentielle d’une fonction :

df =  \dfrac{\partial f}{\partial e_0} d e_0 +    \dfrac{\partial f}{\partial e_1}  d e_1  +  ... +  \dfrac{\partial f}{\partial e_n}  d e_n +   \dfrac{\partial f}{\partial s_0}   d s_0 +   \dfrac{\partial f}{\partial s_1}  d s_1 + ... + \dfrac{\partial f}{\partial s_m}  d s_m

Par cette approche sur les fonctions de plusieurs variables, on peut utiliser la formule de Taylor sur les fonctions à plusieurs variables :

f \left( e_{i0} + \delta e_i(t), s_{j0} + \delta s_j(t) \right) = f  \left( e_{i0}, s_{j0} \right) + \displaystyle\sum_{i = 0}^n   \dfrac{\partial f \left( e_{i0}, s_{j0} \right) }{\partial e_i}   \delta e_i(t)  +  \displaystyle  \sum_{j = 0}^m   \dfrac{\partial f \left( e_{i0}, s_{j0} \right) }{\partial s_j}   \delta s_j(t)  + O \left(   \displaystyle \sum_{i = 0}^n \delta e_i(t)^2 +   \displaystyle \sum_{j = 0}^m  \delta s_j(t)^2   \right)

Or, ici, la fonction décrivant la relation est identiquement nulle. Donc la relation se simplifie ainsi :

\displaystyle\sum_{i = 0}^n    \dfrac{\partial f \left( e_{i0}, s_{j0} \right) }{\partial e_i}    \delta e_i(t)  +  \displaystyle  \sum_{j = 0}^m   \dfrac{\partial f  \left( e_{i0}, s_{j0} \right) }{\partial s_j}   \delta s_j(t)  = O  \left(   \displaystyle \sum_{i = 0}^n \delta e_i(t)^2 +   \displaystyle  \sum_{j = 0}^m  \delta s_j(t)^2   \right)

L’ensemble des valeurs de références e_{i0} et s_{j0} est appelé point de fonctionnement. Ce point de fonctionnement sera soit évident, soit explicité par le sujet. Les fluctuations autour de ce point de fonctionnement (\delta e_{i} et \delta s_{j}) doivent être relativement faible afin de pouvoir considérer comme assez vraie la relation suivante :

\displaystyle\sum_{i = 0}^n    \dfrac{\partial f \left(  e_{i0}, s_{j0} \right) }{\partial e_i}    \delta e_i(t)  +   \displaystyle  \sum_{j = 0}^m   \dfrac{\partial f  \left( e_{i0}, s_{j0}  \right) }{\partial s_j}   \delta s_j(t)  \approx 0

Cette relation est forcément linéaire et permet donc ensuite de travailler dans l’espace de Laplace, mettre en place des schéma-blocs, etc.

Prouver le Principe Fondamental de la Dynamique (PFD) du solide indéformable à partir du PFD du point

Présentation du problème, BAME et PFD du point

Soit un solide S évoluant dans un repère galiléen R_g. Ce solide est considéré comme un ensemble de points matériels M de masse dm(M) chacun subissant une force \vec{f}_{ext}(M). Cette dernière peut être soit une force volumique comme la gravité \rho(M)  \vec{g} dV, soit une force surfacique p(M) \vec{n}(M) dS, soit une force linéique p(M) \vec{n}(M) dl, soit une force ponctuelle \vec{F}_{ext}(M).

Elle subit aussi des efforts provenant du reste du solide lié aux pressions à l’intérieur du matériau (ce qu’on appelle plus précisément des contraintes mécaniques). Ces efforts proviennent principalement du voisinage direct du point M à travers des efforts de liaison qui assure la cohésion du solide. Nous noterons la force exercée par un point N du solide \vec{f}_{int}(N \rightarrow M).

Si on isole un point M quelconque pour appliquer le Principe Fondamental de la Dynamique, nous venons de faire le Bilan des Actions Mécaniques Extérieurs (ici, un bilan des forces car il s’agit de mécanique du point). En appliquant le second principe de la dynamique, nous obtenons :

dm(M)  \vec{\Gamma}(M\in S / R_g) =   \vec{f}_{ext}(M) + \displaystyle \int_{N\in S \setminus \{M\}}  \vec{f}_{int}(N \rightarrow M)

Un solide indéformable possède 6 degrés de liberté : 3 en translation et 3 en rotation. Il nous faut donc un minimum de 2 équations vectorielles pour synthétiser la dynamique du solide.

Retrouver le Théorème de la Résultante Dynamique

Toutes les équations de la dynamique trouvées pour l’ensemble des points M peuvent tout simplement être sommées. Comme il s’agit d’un continuum, la somme devient une intégrale continue sur tout le solide :

\displaystyle \int_{M\in S} \vec{\Gamma}(M\in S / R_g)  dm(M) =  \displaystyle \int_{M\in S} \vec{f}_{ext}(M) +  \displaystyle \int_{M\in S} \displaystyle \int_{N\in S \setminus \{M\}}  \vec{f}_{int}(N \rightarrow  M)

Le dernier terme va être appelé \vec{F}_{int}. En utilisant un produit cartésien, on peut réécrire ce dernier :

\vec{F}_{int} = \displaystyle  \int_{(M,N)\in S^2,\, M\neq N} \vec{f}_{int}(N \rightarrow  M)

Or, par symétrie de l’intégrale lorsqu’on inverse les points M et N, on peut remarquer que :

\vec{F}_{int} = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in S^2,\, M\neq N} \vec{f}_{int}(N \rightarrow  M) +  \vec{f}_{int}(M \rightarrow  N)

C’est le moment d’utiliser la troisième loi de Newton, aussi appelé principe d’action-réaction :

\vec{f}_{int}(N \rightarrow  M) = - \vec{f}_{int}(M \rightarrow  N)

On en déduit donc :

\vec{F}_{int} = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in  S^2,\, M\neq N}  \overrightarrow{0} =   \overrightarrow{0}

On obtient bien alors le Théorème de la résultante dynamique :

\displaystyle \int_{M\in S} \vec{\Gamma}(M\in S / R_g)  dm(M) =   \displaystyle \int_{M\in S} \vec{f}_{ext}(M)

Le terme de gauche est appelé résultante dynamique et le terme de droite est appelé résultante des actions mécaniques extérieures. CQFD.

Retrouver le Théorème du Moment Dynamique

Si, avant de faire la somme directement des PFD du point, on applique une multiplication vectorielle par \overrightarrow{AM}, on obtient alors la relation suivante

\displaystyle \int_{M\in S}  \overrightarrow{AM} \wedge \vec{\Gamma}(M\in S / R_g)  dm(M) =  \displaystyle \int_{M\in S}  \overrightarrow{AM} \wedge \vec{f}_{ext}(M) +  \displaystyle \int_{M\in S} \displaystyle  \overrightarrow{AM} \wedge   \int_{N\in S \setminus \{M\}}   \vec{f}_{int}(N \rightarrow  M)

Le dernier terme va être appelé \vec{C}_{int}(A). En utilisant un produit cartésien et en introduisant le produit vectoriel dans l’intégrale, on peut réécrire ce dernier comme précédemment :

\vec{C}_{int} (A)  = \displaystyle  \int_{(M,N)\in S^2,\, M\neq N} \overrightarrow{AM} \wedge   \vec{f}_{int}(N \rightarrow  M)

Or, par symétrie de l’intégrale lorsqu’on inverse les points M et N, on peut remarquer que :

\vec{C}_{int} (A)  = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in S^2,\, M\neq N}  \overrightarrow{AM} \wedge  \vec{f}_{int}(N \rightarrow  M) +  \overrightarrow{AN} \wedge  \vec{f}_{int}(N \rightarrow  M)

On réutilise la troisième loi de Newton, aussi appelé principe d’action-réaction :

\vec{f}_{int}(N \rightarrow  M) = - \vec{f}_{int}(M \rightarrow  N)

On en déduit donc :

\vec{C}_{int} (A)   = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in  S^2,\, M\neq N}   \overrightarrow{AM} \wedge  \vec{f}_{int}(N \rightarrow  M)  -   \overrightarrow{AN} \wedge  \vec{f}_{int}(N \rightarrow  M)

En factorisant le produit vectoriel, on obtient :

\vec{C}_{int} (A)   = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in   S^2,\, M\neq N}   \left( \overrightarrow{AM}  -   \overrightarrow{AN} \right) \wedge  \vec{f}_{int}(N  \rightarrow  M)

Puis on utilise la relation de Chasles :

\vec{C}_{int} (A)   = \dfrac{1}{2} \displaystyle  \int_{(M,N)\in    S^2,\, M\neq N}    \overrightarrow{NM} \wedge  \vec{f}_{int}(N  \rightarrow  M)

On voit que \vec{C}_{int} (A) est indépendante de A. De plus, la force de cohésion est une force électromagnétique (on parle de liaison covalente, liaison métallique ou liaison de van der Waals). Or, dans le cas de ces efforts de liaison (comme tout ceux connus en mécanique classique en fait), il s’agit d’effort centraux, c’est-à-dire que l’effort exercé par N sur M est colinéaire à \overrightarrow{NM}. On a donc :

\vec{C}_{int} (A)   = \dfrac{1}{2} \displaystyle   \int_{(M,N)\in    S^2,\, M\neq N}    \overrightarrow{0} =  \overrightarrow{0}

On obtient bien alors le Théorème du moment dynamique :

\displaystyle \int_{M\in S}  \overrightarrow{AM} \wedge  \vec{\Gamma}(M\in S / R_g)  dm(M) =  \displaystyle \int_{M\in S}   \overrightarrow{AM} \wedge \vec{f}_{ext}(M)

Le terme de gauche est appelé moment dynamique et le terme de droite est appelé moment des actions mécaniques extérieures. CQFD.

Pour aller plus loin

Nous venons de voir comment on pouvait déduire le Principe Fondamental de la Dynamique du solide indéformable à partir du Principe Fondamental de la Dynamique du point. On a utiliser le terme de résultante et de moments, qui correspondent au concept de torseurs. Pour la preuve qu(il s’agit bien de torseurs, vous pouvez regarder ce billet.

Comoment de torseurs et automoment d’un torseur

Mise en contexte

Tout vient d’une question apparemment anodine du sujet de mines-pont 2015 :

Après une présentation du robot humanoïde Lola, la première question est celle-ci : montrer que \left\lbrace\mathcal{T}_{sol\rightarrow pied} \right\rbrace est un glisseur.
 
Et cette question n’est pas aussi évidente qu’elle n’en a l’air. Mais revenons en à la base.

La notion de torseur

Un torseur \left\lbrace\mathcal{T}\right\rbrace est un champ de vecteurs équiprojectif défini sur un espace affine euclidien de dimension 3. Le torseur \left\lbrace\mathcal{T}\right\rbrace peut être le champ des moments d’une force, des moments cinétiques ou dynamiques d’un solide quelconque, ou bien le champ des vecteurs vitesse d’un solide indéformable.

 
Puisqu’en pratique, nul n’est besoin de connaître la définition d’un torseur pour l’utiliser en virtuose : il suffit en fait de connaître la trinité, puisque la connaissance complète d’un torseur se résume en deux vecteurs et une relation : la valeur de ce torseur en un point, appelé moment et la résultante. Ces deux dernières sont liés par une relation fondamentale, à l’état civil connu sous le nom de formule de Varignon mais souvent appelé par son nom de scène : BABAR :
 
 \overrightarrow{\mathcal{M}}(B) = \overrightarrow{\mathcal{M}}(A) +\overrightarrow{BA} \wedge \overrightarrow{R}
 

Je pense que vous aurez deviné l’origine de ce pseudonyme.

Il est trivial de montrer qu’un champs de vecteurs qui respecte la relation de Varignon est un champ de vecteur équiprojectif. Mais est-il vrai que tous les champs de vecteur équiprojectif respecte la formule de Varignon ? Cela a été montré dans deux billets précédents par deux approches différentes : une algébrique et une géométrique.

La notion du comoment de deux torseurs

Soit 2 torseurs \left\lbrace\mathcal{T}_1\right\rbrace et \left\lbrace\mathcal{T}_2\right\rbrace, le comoment d’un torseur est défini ainsi :

 \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace = \overrightarrow{\mathcal{R}_1} \cdot \overrightarrow{\mathcal{M}_2}(A) +  \overrightarrow{\mathcal{R}_2} \cdot \overrightarrow{\mathcal{M}_1}(A)

Avec \overrightarrow{\mathcal{R}_i} et  \overrightarrow{\mathcal{M}_i}(A) respectivement  la résultante et le moment en A du torseur \left\lbrace\mathcal{T}_i\right\rbrace.

Première étape : prouvons que le comoment est indépendant du choix du point

Pour cela, on va étudier la différence entre les deux calculs. Pour gagner du temps, on va directement factorisé certains éléments :
 
 \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (A) - \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (B) = \overrightarrow{\mathcal{R}_1} \cdot \left( \overrightarrow{\mathcal{M}_2}(A) - \overrightarrow{\mathcal{M}_2}(B) \right) +  \overrightarrow{\mathcal{R}_2} \cdot \left( \overrightarrow{\mathcal{M}_1}(A) - \overrightarrow{\mathcal{M}_1}(B) \right)
 
Or, par la formule de Varignon, on peut utiliser la relation :
 
\overrightarrow{\mathcal{M}_i}(A) - \overrightarrow{\mathcal{M}_i}(B) = \overrightarrow{AB} \wedge \overrightarrow{\mathcal{R}_i} 
 
Et cela nous donne donc pour la différence de nos 2 comoments :
 
 \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (A) - \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (B) = \overrightarrow{\mathcal{R}_1} \cdot \left(\overrightarrow{AB} \wedge \overrightarrow{\mathcal{R}_2} \right) +  \overrightarrow{\mathcal{R}_2} \cdot \left( \overrightarrow{AB} \wedge \overrightarrow{\mathcal{R}_1} \right)
 
 
En utilisant les propriétés du produit mixte suivantes, on va s’en sortir (pour une preuve de cette propriété, elle est dans ce billet) :
 
\vec{a} \cdot \left( \vec{b} \wedge \vec{c} \right) = \vec{c} \cdot \left( \vec{a} \wedge \vec{b} \right) = \vec{b} \cdot \left( \vec{c} \wedge \vec{a} \right)  = - \vec{a} \cdot \left( \vec{c} \wedge \vec{b} \right)  = - \vec{c} \cdot \left( \vec{b} \wedge \vec{a} \right)  = - \vec{b} \cdot \left( \vec{a} \wedge \vec{c} \right)
 
On arrive alors à :
 
 \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (A) - \left\lbrace\mathcal{T}_1\right\rbrace \otimes \left\lbrace\mathcal{T}_2\right\rbrace (B) = \overrightarrow{\mathcal{R}_1} \cdot \left(\overrightarrow{AB} \wedge \overrightarrow{\mathcal{R}_2} \right) -  \overrightarrow{\mathcal{R}_1} \cdot \left( \overrightarrow{AB} \wedge \overrightarrow{\mathcal{R}_2} \right) = 0
 
CQFD

Automoment d’un torseur

L’automoment d’un torseur est la moitié de son comoment avec lui-même, c’est-à-dire :

 \dfrac{1}{2} \left\lbrace\mathcal{T} \right\rbrace \otimes \left\lbrace\mathcal{T} \right\rbrace = \overrightarrow{\mathcal{R}} \cdot \overrightarrow{\mathcal{M}(A)}

Par la propriété précédente, on sait que l’automoment d’un torseur est un invariant scalaire d’un torseur.

Introduction des 3 torseurs particuliers

Torseur nul

Le torseur nul est un torseur de résultante nulle et de moment nul en tout point.

Torseur couple

Le torseur couple est un torseur de résultante nulle.

Torseur glisseur

Le torseur glisseur est un torseur où il existe un point A où le moment est nul. Si un torseur est un glisseur, alors il existe toute une droite \left(A, \overrightarrow{\mathcal{R}} \right) appelée axe centrale du torseur où le moment s’annule. Cette propriété se prouve très aisément grâce à la formule de Varignon.

Théorème à démontrer : le fait que l’automoment d’un torseur est nul est équivalent au fait que le torseur soit un torseur particulier

L’implication dans un sens est triviale : il est facile de calculer les automoments des torseurs particuliers et de montrer qu’ils sont forcément nuls. La réciproque est plus dure… Pour cela, nous allons revenir sur la notion d’axe central.

Axe central d’un torseur quelconque

L’axe central d’un torseur est une droite où le moment est colinéaire à la résultante dans le cas d’un torseur qui n’est ni le torseur nul, ni un torseur couple : en effet, dans ces deux cas-là, les points où le moment est colinaire à la résultante correspond à l’entièreté de l’espace, car le moment est nul en tout point, et donc colinéaire à n’importe quel vecteur.

Trouver l’axe central d’un torseur

On va définir une base sur mesure dans le cas où l’on connaît le moment d’un torseur en un point O :

  • Comme \overrightarrow{\mathcal{R}} est non-nul (on a vu que cela n’avait pas de sens de parler d’axe central dans le cas contraire), on définit : \vec{x} = \dfrac{\overrightarrow{\mathcal{R}}}{\left\Vert \overrightarrow{\mathcal{R}} \right\Vert} ;
  • Si \overrightarrow{\mathcal{M}}(O) = \mathcal{M}_{x} \vec{x}, alors on a le point A qui appartient à l’axe central, et il est trivial de montrer que la droite \left( A, \vec{x} \right) est l’axe central.
  • Il nous reste le cas quelconque : \overrightarrow{\mathcal{M}}(O) = \mathcal{M}_{x} \vec{x} + \overrightarrow{\mathcal{M}_{y}} avec \overrightarrow{\mathcal{M}_{y}} \neq \vec{0} : on définit alors : \vec{y} = \dfrac{\overrightarrow{ \mathcal{M}_{y} } }{\left\Vert\overrightarrow{\mathcal{M}_{y}} \right\Vert}.
  • Dans ce dernier cas, on définit \vec{z} = \vec{x} \wedge \vec{y} afin de compléter une base orthonormée directe.

Dans le cas où l’on n’a pas encore trouver un point de l’axe central, on va le chercher : on va l’appeler C avec :

\overrightarrow{OC} = x \vec{x} + y \vec{y} + z \vec{z}

Calculons alors le moment en C :

\overrightarrow{\mathcal{M}}(C) =  \overrightarrow{\mathcal{M}}(O) + \overrightarrow{\mathcal{R}} \wedge \overrightarrow{OC}

Or, si on reprend la définition de différents axes, on a :

\overrightarrow{\mathcal{M}}(C) = \mathcal{M}_{x} \vec{x} + \mathcal{M}_{y} \vec{y} + \mathcal{R}_{x} \vec{x} \wedge \left( x \vec{x} + y \vec{y} + z \vec{z} \right)

\overrightarrow{\mathcal{M}}(C) = \mathcal{M}_{x} \vec{x} + \left( \mathcal{M}_{y} - \mathcal{R}_{x}\cdot y \right)\vec{y} + \mathcal{R}_{x} \cdot y \vec{z}

On a donc, comme conditions pour avoir le moment C colinéaire à la résultante :

  • x quelconque (ce qui nous définit notre axe) ;
  • y nul ;
  • z =\dfrac{\mathcal{M}_{y} }{\mathcal{R}_{x}}.

On peut donc toujours définir un axe central d’un torseur à partir du moment où le torseur n’est ni le torseur nul, ni un torseur couple.

Propriété suplémentaire d’un axe central

On peut remarquer que tous les moments sur l’axe central sont égaux entre eux. De plus, la partie colinéaire à la résultante du moment est forcément constante sur tous les points de l’espace. Ainsi, ce sont les points où la norme du moment est minimale.

Preuve du théorème

Donc, si nous avons un comoment nul, on a :

  • soit le torseur est nul ;
  • soit le torseur est un torseur couple ;
  • soit le torseur est quelconque, mais avec une partie colinéaire à la résultante nulle (sinon le produit scalaire entre résultante et moment ne serait pas nul) : donc, sur son axe central, le moment est nul : c’est donc un glisseur.

CQFD.

Conclusion

Cette petit propriété peut ainsi permettre de vérifier qu’un torseur est un glisseur très simplement : il faut prouver que l’automoment de ce torseur est nul, et que la résultante est non-nul : c’était typiquement le cas sur l’exercice du Lola.

Tips for TIPE : comment travailler avec Arduino ?

Quoi de mieux pour mettre en œuvre une maquette lors de son TIPE que d’utiliser un Arduino ? Il s’agit d’une technologie peu chère, légère (donc embarquable), (relativement) facile à prendre en main, et d’une capacité très importante, notamment grâce à la foule de Shields et de matériels compatibles.

Comment trouver l’actionneur ou le capteur approprié ?

Le plus simple encore, c’est sûrement un bon moteur de recherche avec comme mot clef Arduino + « fonctionnalité recherché, éventuellement traduit en anglais ».

Une petite liste quand même pour vous aider à vous y retrouver dans certains cas classiques :

  • Commander un moteur pas-à-pas : A4988, je vous conseille d’avoir un radiateur dessus ;
  • Commander un moteur à courant continu : tous les Shields moteurs basés sur un une puce L298 ;
  • Capter une distance : des prix les plus faibles aux prix les plus grands : le HC-SR04 en ultra-son, les capteurs de la gamme GP2Y0A****** en télémètre infrarouge (assez faibles distances) et le TF Mini LiDAR pour un télémètre laser (plus grandes distances) ;
  • Mesurer des accélérations sur 3 axes : les modules basés sur l’ADXL 345 par exemples ;
  • Mesurer des accélérations et des rotations : les modules basés sur MPU6050 ou sur le LSM6DS33 ;
  • Amplificateur différentiel pour pont de Wheatstone (jauge de déformation, permettant de mesurer une force) : le HX711.

Comment commencer à travailler avec ?

Alors, bien sûr, il faut se référer à la documentation technique. De plus, il existe souvent toute une gamme de tutoriel en ligne, surtout avec les produits cités plus haut. Mais la communauté vous offre encore plus simple que cela : des bibliothèques entières consacrés au produit que vous venez d’acheter.

Une fois que vous avez téléchargé le logiciel Arduino, ouvrez le et allez dans Outils/

Tapez le nom de la technologie utilisée et téléchargez la ou les bibliothèques correspondantes, puis les installer :

Quoi faire à partir de cela ?

Maintenant que vous avez la bibliothèque, vous pouvez regarder les exemples fournis :

Et pour continuer ?

Si vous souhaitez mettre en place un asservissement linéaire classique, il y a des bibliothèques aussi pour cela ! Mettre en place un filtre ? Mettre en place une machine d’état ? Il y a aussi des bibliothèques pour cela !

C’est une bonne habitude quand on débute de toujours chercher si une bibliothèque n’existe pas déjà pour faire ce que vous voulez faire.

Vous apprenez le langage et l’utilisation de l’Arduino en arrêtant pas de faire du copier-coller de bouts de codes ? C’est normal… C’est même à mon avis l’une des façon les plus efficaces d’apprendre un langage. Si, en plus, on est un peu attentif, on peut absorber par l’observation tout un tas de bonnes pratiques communes à de nombreux langages de programmation : indenter son code pour la lisibilité, commenter son code, minimiser le nombre de variable globale, éviter les effets de bords, respecter une convention de nommage (en particulier le camel case : monNomDeVariable et le snake case : mon_nom_de_variable).

Équiprojectivité des moments et formule de Varignon : preuve pour les torseurs vus en CPGE

Il a été déjà vu dans 2 billets précédents (preuve de Varignon algébrique et preuve de Varignon géométrique) que la propriété d’équiprojectivité était équivalente à la formule de Varignon : en particulier, dès qu’on a un champs de moment qui possède la propriété d’équiprojectivité, il est possible de définir une résultante.

On va donc compléter la preuve donnée précédemment en prouvant, torseur par torseur, la propriété d’équiprojectivité des torseurs. En se basant sur les résultats généraux, on saura qu’il existe une résultante correspondant à ce champs de moments. En faite, pour presque tous les torseurs, on va retrouver directement la valeur de la résultante en prouvant l’équiprojectivité.

Torseur cinématique

On commence par le plus simple : on veut prouver que :

\overrightarrow{V(A\in 1/2)} \cdot    \overrightarrow{AB} =  \overrightarrow{V(B\in 1/2)}   \cdot    \overrightarrow{AB}

On repart alors de la définition d’une vitesse, avec un point O_2 fixe dans 2 et une base B_2 fixe dans 2 :

\overrightarrow{V(A\in 1/2)} = \left[ \dfrac{d  \overrightarrow{O_2 A} }{dt} \right]_{B_2}

On obtient alors, si on calcule la différence entre 2 vitesses en 2 points différents, on obtient, par linéarité de la dérivée :

\overrightarrow{V(B\in 1/2)} -  \overrightarrow{V(A\in 1/2)}  = \left[ \dfrac{d  \overrightarrow{O_2 B} }{dt} \right]_{B_2} -  \left[ \dfrac{d  \overrightarrow{O_2 A} }{dt} \right]_{B_2} =   \left[ \dfrac{d \left(  \overrightarrow{O_2 B} -  \overrightarrow{O_2 A} \right) }{dt} \right]_{B_2}

Or, on sait, par la relation de Chasles, l’opposé de \overrightarrow{O_2 A} est \overrightarrow{A O_2} ( \overrightarrow{O_2 A} +  \overrightarrow{A O_2} =   \overrightarrow{O_2 O_2} =  \overrightarrow{0}  ) et aussi que \overrightarrow{ O_2 B } +  \overrightarrow{ A O_2 } =  \overrightarrow{AB} . On a donc la relation suivante :

\overrightarrow{V(B\in 1/2)} -  \overrightarrow{V(A\in 1/2)} =  \left[ \dfrac{d   \overrightarrow{AB} }{dt} \right]_{B_2}

Voyons maintenant ce qui se passe quand on fait un produit scalaire de cette relation-là par le vecteur \overrightarrow{AB} :

\overrightarrow{V(B\in 1/2)} \cdot  \overrightarrow{AB} -  \overrightarrow{V(A\in 1/2)} \cdot  \overrightarrow{AB} = \left[ \dfrac{d   \overrightarrow{AB} }{dt} \right]_{B_2}  \cdot  \overrightarrow{AB}

Or, la propriété de la dérivée d’un produit est aussi valable vectoriellement :

\left[ \dfrac{d   \overrightarrow{a}\cdot  \overrightarrow{a}  }{dt}  \right]_{B_2} =   \left[ \dfrac{d   \overrightarrow{a} }{dt}  \right]_{B_2}   \cdot \overrightarrow{a}   +  \overrightarrow{a}\cdot \left[ \dfrac{d \overrightarrow{a}  }{dt}  \right]_{B_2} = 2  \left[ \dfrac{d   \overrightarrow{a} }{dt}  \right]_{B_2}   \cdot \overrightarrow{a}

Et, de plus, le résultat d’un produit scalaire est un scalaire, qui ne dépend donc d’aucune base. On a donc :

\overrightarrow{V(B\in 1/2)} \cdot  \overrightarrow{AB} -   \overrightarrow{V(A\in 1/2)} \cdot  \overrightarrow{AB} = \dfrac{1}{2} \left[ \dfrac{d \overrightarrow{AB}\cdot  \overrightarrow{AB}  }{dt}  \right]_{B_2} =   \dfrac{1}{2} \dfrac{d AB^2}{dt}

Or, par propriété de la non-déformabilité de l’ensemble cinématiquement équivalent 1, on a la distance AB qui est constante. On a donc bien prouvé que :

\overrightarrow{V(A\in 1/2)} \cdot  \overrightarrow{AB} -    \overrightarrow{V(B\in 1/2)} \cdot  \overrightarrow{AB} = 0

CQFD.

Bonus : le torseur des petits déplacements

On pourrait reprendre la preuve précédente pour le torseur des petits déplacements, mais on va encore faire plus simple. La relation qui va nous intéresser ici est la suivantes :

\left[ \overrightarrow{ A(t) A(t+dt) } \right]_{B_2} \cdot    \overrightarrow{AB} =    \left[ \overrightarrow{ B(t) B(t+dt) } \right]_{B_2}    \cdot    \overrightarrow{AB}

Si on reprend la définition de la dérivée, on a, en utilisant intelligemment les notations de Leibniz :

\overrightarrow{V(A\in 1/2)}  =  \left[ \dfrac{d  \overrightarrow{O_2 A} }{dt} \right]_{B_2} =   \dfrac{ \left[ \overrightarrow{O_2 A} (t+dt) -  \overrightarrow{O_2 A} (t) \right]_{B_2} }{dt} =     \dfrac{  \left[ \overrightarrow{ A(t) A(t+dt) } \right]_{B_2}   }{dt}

On obtient donc que la relation que l’on cherche à prouver est équivalent à :

\left( \overrightarrow{V(A\in 1/2)} dt \right) \cdot  \overrightarrow{AB} -      \left( \overrightarrow{V(B\in 1/2)} dt \right)  \cdot  \overrightarrow{AB} = 0

Qui n’est que l’équiprojectivité des vitesses avec une multiplication par dt. CQFD.

[Note : une preuve plus rigoureuse passerait par un développement limité au premier ordre utilisant la formule de Taylor (une linéarisation).]

Torseur des actions mécaniques extérieures, torseur cinétique et torseur dynamique

La preuve pour ces 3 torseurs est quasiment identique, donc nous allons la formuler une seule fois dans un cadre général. En effet, le moment dans ces 3 cas est de la forme :

\overrightarrow{M (A)} =   \displaystyle \int_{M\in 1}  \overrightarrow{AM} \wedge  \overrightarrow{X(m)}

La différence est la fonction vectorielle \overrightarrow{X(m)} qui est utilisée :

Nom du torseur :Symbole du moment : Quantité intégrée : \overrightarrow{X(m)}
Actions mécaniques \overrightarrow{M(A,  \bar{1} \rightarrow 1) } \overrightarrow{f_{M, \bar{1} \rightarrow 1}}
Cinétique \overrightarrow{\sigma(A \in 1 / R_g ) } \overrightarrow{V(M\in 1/ R_g )} dm(M)
Dynamique \overrightarrow{\delta(A \in 1 / R_g ) } \overrightarrow{\Gamma(M\in 1/ R_g )} dm(M)

On veut donc maintenant prouver que :

\overrightarrow{M (A)} \cdot    \overrightarrow{AB} =   \overrightarrow{  M (B)}   \cdot    \overrightarrow{AB}

Comme avec le torseur cinématique, on va repasser par la définition. On va donc s’intéresser à la différence, on va pouvoir profiter que la région d’intégration soit la même pour fusionner les 2 intégrales en 1 intégrale unique. On profite de la linéarité de l’intégrale et du produit vectoriel, on a donc :

\overrightarrow{M (B)} -    \overrightarrow{M (A)} = \displaystyle \int_{M\in 1}   \left( \overrightarrow{BM} -  \overrightarrow{AM} \right)  \wedge  \overrightarrow{X(M)}

En utilisant la relation de Chasles, on obtient donc :

\overrightarrow{M (B)} -    \overrightarrow{M (A)} =  \displaystyle \int_{M\in 1}  \overrightarrow{BA} \wedge  \overrightarrow{X(M)}

Comme \overrightarrow{BA} ne dépend pas de la variable d’intégration M, on peut le sortir de l’intégrale, et on obtient donc :

\overrightarrow{M (B)} -    \overrightarrow{M (A)} =  \overrightarrow{BA} \wedge  \displaystyle  \int_{M\in 1}    \overrightarrow{X(M)}


Non seulement la différence des 2 moments est trivialement orthogonal au vecteur \overrightarrow{AB} car le résultat du produit vectoriel est toujours orthogonal à ces opérandes (CQFD), mais on a directement une formule pour la résultante :

\overrightarrow{R} =   \displaystyle \int_{M\in 1}  \overrightarrow{X(m)}

La différence est la fonction vectorielle \overrightarrow{X(m)} qui est utilisée :

Nom du torseur :Symbole de la résultante :Nom de la résultante : Quantité intégrée : \overrightarrow{X(m)}
Actions mécaniques \overrightarrow{F(\bar{1} \rightarrow 1) } Force \overrightarrow{f_{M, \bar{1} \rightarrow 1}}
Cinétique \overrightarrow{R_c (A \in 1 / R_g ) } Quantité de mouvement \overrightarrow{V(M\in 1/ R_g )} dm(M)
Dynamique \overrightarrow{R_d(A \in 1 / R_g ) } Quantité d’accélération \overrightarrow{\Gamma(M\in 1/ R_g )} dm(M)

Apprendre Haskell en venant de Python : Partie 11 : Gérer le pseudo-aléatoire déterministe et non-déterminisme

Génération de nombres pseudo-aléatoires en Python

Pour expliquer le fonctionnement des nombres pseudo-aléatoires, on va se pencher d’abord sur comment on l’utilise en Python. Cela va nous permettre de voir deux utilisations différentes que l’on peut faire de ces nombres. Pour illustrer, on va utiliser la simulation d’un dé à 100 faces aussi appelé zocchièdre.

Superbe zocchièdre bleu

Pour simuler trois lancés du dé et stocker les valeurs dans une liste grâce à la bibliothèque random, on peut écrire cela comme ça :

import random as r
 
zocchiedreFoisTrois = [r.randint(1,100) for i in range(3)]

Cela nous donnera trois nombres pseudo-aléatoires compris entre 1 et 100 dans une liste. Trois nouveaux nombres pseudo-aléatoires à chaque interprétation. Donc, il est claire que randint n’est pas une fonction pure. Or, le fait de parler de PRNG (Pseudo-Random Number Generator) au lieu de simple RNG est lié au fait que l’obtention de ces nombres est déterministe, contrairement à des résultats expérimentaux aléatoires. Pourquoi alors avons-nous une fonction impure et comment la rendre pure ?

Pour le pourquoi, c’est assez simple : lors de la plupart des utilisation, on souhaite un vrai côté aléatoire : imaginez un jeu vidéo utilisant un PRNG purement déterministe : une communauté de joueurs aurait vite fait de connaître et de partager le comportement du générateur combat après combat, du début à la fin du jeu. Pour le comment, on verra cela après.

En fait, une utilisation pure de random en Python est assez facile, en utilisant la fonction seed qui permet de préciser la graine. En effet, pour produire un nombre pseudo-aléatoire, il faut partir d’un nombre : les algorithmes des PRNG sont basés sur ce principe cyclique. Et à chaque fois qu’un nouveau nombre est tiré, on peut le remettre comme prochaine graine et ainsi de suite (il y a quelques subtilités à base de hash, mais le principe est celui-là) :

import random as r

r.seed(0)
zocchiedreFoisTrois = [r.randint(1,100) for i in range(3)]

Grâce à la fonction seed, on a donc un comportement entièrement déterministe. Comment cela marche sans graine ? La plupart des systèmes (ceux qui ne sont pas équipés d’un appareil externe produisant de l’aléatoire par des mesures) vont utiliser l’heure et la date courante comme graine.

Résumons : Il est possible par défaut d’obtenir un PRNG qui a l’air non-déterministe, mais en imposant une graine, on obtient un PRNG déterministe.

Génération de nombres pseudo-aléatoires déterministes en Haskell

On va commencer par ce cas qui est pure en Haskell :

import System.Random

zocchiedreFoisTrois'' :: Int -> [Int]
zocchiedreFoisTrois'' n =  
    let prng = mkStdGen n
    in take 3 $ randomRs (1,100) prng

On a la fonction randomRs qui prend en entrées des bornes et un générateur, et qui renvoie en sortie une liste infinie de nombres entre ces 2 bornes (selon une densité de probabilité uniforme). Elle peut être utiliser avec plusieurs types de données.

La fonction mkStdGen donne un PRNG en fonction d’une graine, qui est ici forcément un entier.

Génération de nombres pseudo-aléatoires non-déterministes en Haskell

Comme avoir des nombres pseudo-aléatoires non-déterministes, c’est impure, on va utiliser la monade IO pour les manipuler. On va faire « comme si » le PRNG venait d’une entrée.

zocchiedreFoisTroisIO :: IO [Int]
zocchiedreFoisTroisIO = 
    do
        prng <- getStdGen
        return $ take 3 $ randomRs (1,100) prng

La fonction getStdGen permet d’avoir un générateur non-déterministe : de la même manière que Python, il utilise des informations extérieures au programme pour trouver une graine. A chaque nouvel appel du script, le générateur va changer. Mais pas à chaque nouvel appel de la fonction ! Il s’agit ici d’obtenir le générateur de ce programme, et non pas un générateur.

Si l’on souhaite avoir un nouveau générateur à chaque appel, il faut plutôt utiliser la fonction newStdGen :

zocchiedreFoisTroisIO' :: IO [Int]
zocchiedreFoisTroisIO' = 
    do
        prng <- newStdGen
        return $ take 3 $ randomRs (1,100) prng

Attention, cette nouvelle fonction ne crée pas seulement un nouveau générateur flambant neuf à chaque fois : il modifie également celui qui sera renvoyé par getStdGen.