vendredi 24 juin 2016

Enroulements autour d'un tore - 2 : une application de pst-solides3d et Acrobat Reader

pst-solides3d possède la possibilité de couper un solide par un plan et de manipuler ensuite les 2 parties ainsi obtenues par translation et rotation. La documentation de pst-solides3d contient des exemples du partage d’un solide par un plan. Voici quelques autres exemples pris sur ce blog :

http://pstricks.blogspot.fr/2011/07/sections-coniques.html
http://pstricks.blogspot.fr/2011/07/sections-coniques-partie-2.html
http://pstricks.blogspot.fr/2013/02/sections-du-tore-circulaire.html
http://pstricks.blogspot.fr/2013/02/sections-du-tore-par-un-plan-passant.html

Cependant l’algorithme mis au point par Jean-Paul Vignault, s’il est parfaitement satisfaisant pour des solides simples comme dans les exemples ci-dessus, se révèle d’une lenteur rédhibitoire pour des exemples plus complexes. Pour remédier à ceci, il y a une alternative avec le module 3D d’Acrobat Reader qui permet d’effectuer toutes les coupes souhaitées à la vitesse de l’éclair. Le processus nécessite 3 étapes :
  • Définir le solide avec pst-solides3d, le convertir et l’enregistrer au format .obj ou .off avec l’option [action=writeobj] ou [writeoff] ;
  • ouvrir le fichier .obj avec le logiciel http://meshlab.sourceforge.net/ et le convertir au
    format .u3d lisible par Acrobat Reader.
  • La dernière étape consiste à écrire un très court fichier LATEX pour inclure le fichier .u3d dans un pdf grâce au package http://www.ctan.org/pkg/movie15 d’Alexander Grahn, en plaçant dans le préambule \usepackage[3D]{movie15}.
On trouve ces explications dans la documentation de pst-solides3d, ainsi que des liens vers d’autres exemples, comme :
http://melusine.eu.org/syracuse/mluque/solides3d2007/pdf3d/
http://melusine.eu.org/syracuse/mluque/solides3d2007/zeolithes/

Commençons par un exemple simple : un nœud torique (8,13) coupé par le plan vertical x = 2.2.
D’abord avec pst-solides3d, on enregistre les 2 parties obtenues et on affiche l’une d’elle. Même dans ce cas simple, le temps de calcul peut sembler long.
La suite des explications est dans le document pdf contenu dans l'archive :
Voici quelques images, la coupe obtenue avec pst-solides3d :
Dans l'exemple suivant le calcul de l'objet 3D est fait avec pst-solides3d, 3 enroulements (8,13) décalés de 120◦ l’un par rapport à l’autre et enroulées autour d’un tore.
La coupe de cet objet avec pst-solides3d est quasiment impossible, par contre avec le module 3D d'Acrobat Reader elle est extrêmement rapide , voici une image de coupe :


Un seul regret, la sauvegarde d’une coupe n’est pas possible, bien que cette option soit prévue, elle peut-être activée uniquement dans la version payante ?

mardi 21 juin 2016

Enroulements autour d'un tore - 1 : une application de pst-solides3d

Le site : http://portal.groupkos.com/index.php?title=Electromagnetic_Coils propose une étude très pointue sur des bobines électromagnétiques : bobine plate, solénoïde cylindrique, solénoïde torique, transformateur toroïdal, bobine de Robin et montre la similarité des enroulements avec ceux de nœuds toriques (torus knot). La plupart des schémas du site ont été réalisés avec POVRAY et les auteurs fournissent le code dans des liens situés sur la page. Ces schémas sont remarquables et le code POVRAY est, en conséquence, long et complexe. Je me suis demandé si PSTricks, pouvait arriver à approcher la qualité de ces dessins avec un code plus simple. En fait pour la majorité des dessins c’est possible, de plus si on associe à pst-solides3d, les packages animate et movie15 d’Alexander Grahn, on peut réaliser des animations et des coupes grâce au module 3D d’Acrobat Reader.
Voici un premier exemple, il s’agit d’un nœud torique (8,13). L’enroulement comporte 3 phases obtenues par rotations successives de 120◦ et 240◦ autour de l’axe Oz de l’enroulement initial. D’après l’auteur, DonEMitchell, le choix des rayons et du couple (8,13) est fait pour que les spires intérieures(dans le trou) et extérieures soient orthogonales ceci  afin qu'il n'y ait aucun couplage entre elles et le nombre d’or intervient dans le choix des rayons et du couple 8:13 ≃ φ -1 mais je ne sais pas si ce choix de φ est bien pertinent et s’il n’existe pas d’autres valeurs pour obtenir le même résultat.
Voici 3 versions avec PSTricks :
Les 2 dernières correspondent aux couleurs inversées.

Voici le lien pour tous les fichiers :
TorusKnot-1.zip

Faisant suite à la suggestion d'Alexander(dans les commentaires), je recopie ici, une partie de la documentation de pst-solides3d :

Par défaut, sous Windows et Linux, la protection des fichiers du disque dur est activée et ne permet donc pas l’écriture sur le disque. Pour désactiver cette protection, tout au moins temporairement, voici les deux procédures correspondantes :
Linux : le plus simple est donc d’utiliser ghostscript directement, en console. Comme il n’y a rien à attendre comme image :
$> gs -dNOSAFER monfichier.ps quit.ps
Windows : dans le menu Options, l’option Protection des fichiers ne doit pas être cochée.

 By default, under Windows and Linux, the security of files on the hard drive is activated and doesn’t allow to write on the drive. To deactivate that security option, more or less temporarily, here the two corresponding procedures:
Linux: The advice from Jean-Michel Sarlat: the simplest will be to use GhostScript directly, within the console. As there is no image to wait for:
$> gs -dNOSAFER monfichier.ps quit.ps
Windows: Within the menue Options, the option Security of files must be turned to unchecked.


Le listing de la première image :

\documentclass{article}
\usepackage{pst-solides3d,pst-grad}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[garamond]{mathdesign}
\renewcommand{\ttdefault}{lmtt}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[colorlinks=true]{hyperref}
\usepackage{array,amsmath}
\title{Enlacements toriques 1 : \\
une application de \texttt{pst-solides3d}}
\date{2 janvier 2\,008 - 2 et 8 juillet 2015 - 21 juin 2016}
\begin{document}
\maketitle
Le site :
\url{http://portal.groupkos.com/index.php?title=Electromagnetic_Coils}

propose une étude très pointue sur des bobines électromagnétiques : bobine plate, solénoïde cylindrique, solénoïde torique, transformateur toroïdal, bobine de Robin et montre la similarité des enroulements avec ceux de n\oe{}uds toriques (torus knot). La plupart des schémas du site ont été réalisés avec POVRAY et les auteurs fournissent le code dans des liens situés sur la page. Ces schémas sont remarquables et le code POVRAY est, en conséquence,  long et complexe. Je me suis demandé si \textsf{PSTricks}, pouvait arriver à approcher la qualité de ces dessins avec un code plus simple. En fait pour la majorité des dessins c'est possible, de plus si on associe à pst-solides3d, les packages \textsf{animate} et \textsf{movie15} d'Alexander Grahn, on peut réaliser des animations et des coupes grâce au module 3D d'Acrobat Reader.

Voici un premier exemple, il s'agit d'un n\oe{}ud torique (8,13). L'enroulement comporte 3 phases obtenues par rotations successives de 120° et 240° autour de l'axe $Oz$ de l'enroulement initial. D'après l'auteur, DonEMitchell, le choix des rayons et du couple (8,13) est fait pour que spires intérieures(dans le trou) et extérieures soient orthogonales ceci afin qu'il n'y ait aucun couplage entre elles et le nombre d'or $\varphi$ intervient dans le choix des rayons et du couple $\frac{8}{13}=\simeq \varphi-1$, mais je ne sais pas si ce choix de $\varphi$ est bien pertinent et s'il n'existe pas d'autres valeurs pour obtenir le même résultat.
\[
\left\{
\begin{array}[m]{l}
x=\big(R+r\cos(nt)\big)\cos(mt)\\
y=\big(R+r\cos(nt)\big)\sin(mt)\\
z=r\sin(nt)
\end{array}
\right.
\quad 0\leqslant t <2 br="" pi="">\]
\begin{center}
\begin{pspicture}(-8.5,-7)(8.5,4)
\psset[pst-solides3d]{viewpoint=10 0 30 rtp2xyz,Decran=5,lightsrc=viewpoint,solidmemory}
\psframe*(-8.5,-7)(8.5,4)
%%--Enregistrement des données-------
%%--lignes suivantes à décommenter---
%\defFunction[algebraic]{torusknot}(t){(ra+rb*cos(kn*t))*sin(km*t)} %
%                                     {(ra+rb*cos(kn*t))*cos(km*t)}%
%                                     {rb*sin(kn*t)}%
%\pstVerb{/kn 8 def /km 13 def
%         /Phi 1.6180339887 def % nombre d'or
%         /PhiIndex 2.804 def
%         /ra Phi PhiIndex exp def
%         /rb ra Phi PhiIndex 4 sub exp sub def}%
%\psSolid[object=courbe,
%    r=0.05, ngrid=1800 12,grid,hue=0 1,
%    range=0 2 pi mul,
%    action=none,name=A1,
%    function=torusknot]%
%\psSolid[object=courbe,
%    r=0.05, ngrid=1800 12,grid,hue=0 1,
%    range=0 2 pi mul,
%    RotZ=120,action=none,name=B1,
%    function=torusknot]%
%\psSolid[object=courbe,
%    r=0.05, ngrid=1800 12,grid,hue=0 1,
%    range=0 2 pi mul,
%    RotZ=240,action=none,name=C1,
%    function=torusknot]%
%\psSolid[object=fusion,base=A1 B1 C1,action=writesolid,file=torusknot8-3]
%%--lignes précédentes à commenter ou à supprimer--------
%%--une fois l'enregistrement terminé--------------------
\psSolid[object=datfile,file=torusknot8-3,deactivatecolor=true,grid]
\end{pspicture}
\end{center}
\end{document}

 


Oscillateurs parallèles couplés par des ressorts n°10

Alexander Grahn  propose un modèle plus complet qui permet de rendre compte de façon plus réaliste le phénomène :
Les ressorts étirés (dont la longueur est plus grande que la longueur à vide) tendent à minimiser l’écart entre les mobiles.
Donc, même en présence du frottement dynamique Ffrot = −Cfrot v2, la seule configuration stable est l’alignement vertical des mobiles. Elle est obtenue de manière asymptotique au cours du temps. Pour obtenir un alignement final aléatoire il faut ajouter une force adhésive Fadh. Elle se manifeste seulement à l’état de repos, donc toujours aux points de retour du mobile. Pour remettre le mobile en mouvement, il est nécessaire que la force résultante Fres des ressorts attachés au mobile soit plus grande que la force d’adhésion. Le force d’adhésion c’est la force de frottement en statique, on sait que les coefficients de frottement statique et dynamique sont différents, que le coefficient de frottement statique est plus grand que le dynamique.
On utilise un modèle pour lequel cette force prend bien la valeur donnée par la loi de Coulomb aux instants où la vitesse s’annule, mais qui le mouvement se poursuivant, décroît très rapidement. (Des explications plus détaillées sont fournies dans le document).
Remarque : le Gif ne boucle pas, il faut donc rafraichir l'écran pour relancer l'animation (touche F5).

Les fichiers LaTeX, animation avec le package animate ou par la création d'images pour le Gif  sont dans l'archive : 10mobiles9ressorts-Alexander.zip

Le listing :

\documentclass{article}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage[garamond]{mathdesign}
\renewcommand{\ttdefault}{lmtt}
\usepackage{amsmath}
\DeclareMathOperator{\sgn}{sgn}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-ode,pst-ressort,pst-plot}
%\usepackage[method=icon]{animate}
%\usepackage[method=widget]{animate}
%\usepackage[method=ocg]{animate}
\usepackage{animate}
\title{Dix oscillateurs parallèles couplés par des ressorts avec frottement et adhésion}
\date{21 juin 2016}
\author{Manuel Luque, Alexander Grahn}
\pagestyle{empty}
\begin{document}
\maketitle
Les ressorts étirés (dont la longueur est plus grande que la longueur à vide) tendent à minimiser l'écart entre les mobiles. Donc, même en présence du frottement dynamique $F_\mathrm{frot}=-C_\mathrm{frot}\dot{x}$, la seule configuration stable est l'alignement vertical des mobiles. Elle est obtenue de manière asymptotique au cours du temps. Pour obtenir un alignement final aléatoire il faut ajouter une force adhésive $F_\mathrm{adh}$. Elle se manifeste seulement à l'état de repos, donc toujours aux points de retour du mobile. Pour remettre le mobile en mouvement, il est nécessaire que la force résultante $F_\mathrm{res}$ des ressorts attachés au mobile soit plus grande que la force d'adhésion.
% Cette force d'adhésion perdure même lorsque la vitesse n'est pas nulle, mais décroît très rapidement
Le force d'adhésion c'est la force de frottement en statique, on sait que les coefficients de frottement statique et dynamique sont différents, que le coefficient de frottement statique est plus grand que le dynamique.
%Cependant, ici avant d'atteindre l'état de repos, le système est en mouvement et il sera impossible de tenir compte de cette force d'adhésion qui ne se manifeste que lorsque la vitesse est nulle, donc aux deux positions extrêmes %du mobile, si l'on considère que sa durée d'existence est nulle.
On utilise un modèle pour lequel cette force prend bien la valeur donnée par la loi de Coulomb aux instants où la vitesse s'annule, mais qui le mouvement se poursuivant, décroît très rapidement. La force d'adhésion sera modélisée comme suit~:
\begin{equation}
%  F_\mathrm{adh}=-\sgn(F_\mathrm{res})\min(|F_\mathrm{res}|,F_\mathrm{adh,const})\exp(-10^4 \dot{x}^2)
   F_\mathrm{adh}=-\sgn(F_\mathrm{res})F_\mathrm{adh,const}\exp(-10^4 \dot{x}^2)
\end{equation}
Le facteur $\exp(-10^4\dot{x}^2)$ prend la valeur 1 si la vitesse $(\dot{x})$ est nulle et tend rapidement vers zéro quand la valeur absolue de la vitesse croît. % (en fonction du carré de la vitesse).
On pourra faire des essais en prenant un facteur de décroissance encore plus rapide comme $\exp(-10^6 \dot{x}^2)$ ou $\exp(-10^{12} \dot{x}^6)$.
% Pour le signe, il peut y avoir un problème si Fres=0.
\def\mobileA{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(-0.5,0.1)(-2,0.1)(-2,1)(2,1)(2,0.1)
\psarcn(0,0.1){0.5}{0}{180}
\moveto(-0.2,0.1)
\psarc(0,0.1){0.2}{180}{360}
\psline(0.2,0.1)(-0.2,0.1)}}
\def\mobileB{\psframe[fillstyle=solid,fillcolor=yellow,unit=0.2](-2,-0.5)(2,0.5)}
\def\mobileC{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(0.5,-0.1)(2,-0.1)(2,-1)(-2,-1)(-2,-0.1)(-0.5,-0.1)
\psarcn(0,-0.1){0.5}{180}{0}
\moveto(0.2,-0.1)
\psarc(0,-0.1){0.2}{0}{180}
\psline(-0.2,-0.1)(0.2,-0.1)}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% force résultante exercée par le(s) ressort(s)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\let\nmdef\@namedef
\let\nmuse\@nameuse
\makeatother
\def\signe#1{IfTE(\nmuse{#1}=0,0,\nmuse{#1}/abs(\nmuse{#1}))}
%  force résultante exercée par le(s) ressort(s)
\nmdef{force01}{( km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2)))}%
\nmdef{force02}{(-km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))+km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2)))}%
\nmdef{force03}{(-km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))+km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2)))}%
\nmdef{force04}{(-km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))+km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2)))}%
\nmdef{force05}{(-km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))+km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2)))}%
\nmdef{force06}{(-km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))+km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2)))}%
\nmdef{force07}{(-km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))+km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2)))}%
\nmdef{force08}{(-km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))+km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2)))}%
\nmdef{force09}{(-km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))+km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2)))}%
\nmdef{force10}{(-km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2)))}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%force d'adhésion
\def\forceAdh{km*L0/2}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 10 mobiles
%  0  1   2   3   4    5   6   7   8   9  %  10   11  12   13   14   15   16   17  18   19
% x1  x2  x3  x4  x5  x6  x7  x8  x9  x10 %  x'1 x'2  x'3  x'4  x'5  x'6  x'7  x'8 x'9  x'10
\def\DixOscillateurs{x[10]|x[11]|x[12]|x[13]|x[14]|x[15]|x[16]|x[17]|x[18]|x[19]| %
  \nmuse{force01}-cf*x[10]-\signe{force01}*\forceAdh*Euler^(-1e4*x[10]^2)|%
  \nmuse{force02}-cf*x[11]-\signe{force02}*\forceAdh*Euler^(-1e4*x[11]^2)|%
  \nmuse{force03}-cf*x[12]-\signe{force03}*\forceAdh*Euler^(-1e4*x[12]^2)|%
  \nmuse{force04}-cf*x[13]-\signe{force04}*\forceAdh*Euler^(-1e4*x[13]^2)|%
  \nmuse{force05}-cf*x[14]-\signe{force05}*\forceAdh*Euler^(-1e4*x[14]^2)|%
  \nmuse{force06}-cf*x[15]-\signe{force06}*\forceAdh*Euler^(-1e4*x[15]^2)|%
  \nmuse{force07}-cf*x[16]-\signe{force07}*\forceAdh*Euler^(-1e4*x[16]^2)|%
  \nmuse{force08}-cf*x[17]-\signe{force08}*\forceAdh*Euler^(-1e4*x[17]^2)|%
  \nmuse{force09}-cf*x[18]-\signe{force09}*\forceAdh*Euler^(-1e4*x[18]^2)|%
  \nmuse{force10}-cf*x[19]-\signe{force10}*\forceAdh*Euler^(-1e4*x[19]^2)}%
%\def\initCond{x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 vx1 vx2 vx3 vx4 vx5 vx6 vx7 vx8 vx9 vx10}
\def\initCond{initCond}
\begin{center}
\def\nFrames{400}%
\begin{pspicture}(-1,-4)(10,4)
\pstVerb{/initCond {% rrand srand
                   10 { rand 2147483647 div 8 mul -4 add } repeat
                    0.001 -0.001 0.001 -0.001 0.001 -0.001 0.001 -0.001 0.001 -0.001
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 1 def
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.75 def
        }%
\pstODEsolve[algebraic,varsteptol=1e-6]{mobile0123456789}{(t) 0 1 2 3 4 5 6 7 8 9}{0}{10}{\nFrames}{\initCond}{\DixOscillateurs}
\pstVerb{
/DATAS [mobile0123456789] def
/posX0 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 1 add get % x0
           } for
      } def
/posX1 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 2 add get % x1
           } for
      } def
/posX2 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 3 add get % x2
           } for
      } def
/posX3 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 4 add get % x3
           } for
      } def
/posX4 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 5 add get % x4
           } for
      } def
/posX5 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 6 add get % x5
           } for
      } def
/posX6 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 7 add get % x6
           } for
      } def
/posX7 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 8 add get % x7
           } for
      } def
/posX8 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 9 add get % x8
           } for
      } def
/posX9 {0 11 DATAS length 11 sub {/i exch def
           DATAS i get % t
           DATAS i 10 add get % x9
           } for
      } def
}%
\listplot[linecolor=blue]{posX0}
\listplot[linecolor=red]{posX1}
\listplot[linecolor=green]{posX2}
\listplot[linecolor=cyan]{posX3}
\listplot[linecolor=magenta]{posX4}
\listplot[linecolor=yellow]{posX5}
\listplot[linecolor=gray]{posX6}
\listplot[linecolor=black]{posX7}
\listplot[linecolor=red!50]{posX8}
\listplot[linecolor=blue!50]{posX9}
\psgrid[subgriddiv=0,gridcolor=blue,gridwidth=0.02,griddots=0,gridlabels=5pt](-1,-4)(10,4)
\psline{<->}(0,4)(0,0)(10,0)
\uput[r](10,0){$t$(s)}
\uput[u](0,4){$x$}
\end{pspicture}
\end{center}
\newpage
On peut constater que dans on état final, les ressorts ne sont pas alignés verticalement.
\begin{center}
\def\nFrames{400}% 400 images
\begin{animateinline}[
  %measure, %for testing performance
  controls,
  begin={\begin{pspicture}(-7,-10)(7,10)},
  end={\end{pspicture}}]{10}% 10 images/s
\pstVerb{/initCond {% rrand srand
                   10 { rand 2147483647 div 8 mul -4 add } repeat
                    0.001 -0.001 0.001 -0.001 0.001 -0.001 0.001 -0.001 0.001 -0.001
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 1 def
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.75 def
        }%
\pstODEsolve[algebraic,varsteptol=1e-6]{mobile0123456789}{0 1 2 3 4 5 6 7 8 9}{0}{10}{\nFrames}{\initCond}{\DixOscillateurs}
\pstVerb{
/posX1 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i get} for
       ]def
/posX2 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 1 add get} for
       ]def
/posX3 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 2 add get} for
       ]def
/posX4 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 3 add get} for
       ]def
/posX5 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 4 add get} for
       ]def
/posX6 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 5 add get} for
       ]def
/posX7 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 6 add get} for
       ]def
/posX8 [0 10 [mobile0123456789] length 10 sub {/i exch def
             [mobile0123456789] i 7 add get} for
       ]def
/posX9 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 8 add get} for
       ]def
/posX10 [0 10 [mobile0123456789] length 10 sub {/i exch def
              [mobile0123456789] i 9 add get} for
       ]def
}%
\multiframe{\nFrames}{i=0+1}{%
\psframe*[linecolor=cyan!20](-7,-10)(7,10)
\psframe[fillstyle=crosshatch,hatchangle=90,hatchsep=1,hatchwidth=0.01,hatchcolor=blue](-7,-10)(7,10)
\psline[linewidth=0.05](-7,9.1)(7,9.1)
\psline[linewidth=0.05](-7,7)(7,7)
\psline[linewidth=0.05](-7,5)(7,5)
\psline[linewidth=0.05](-7,3)(7,3)
\psline[linewidth=0.05](-7,1)(7,1)
\psline[linewidth=0.05](-7,-1)(7,-1)
\psline[linewidth=0.05](-7,-3)(7,-3)
\psline[linewidth=0.05](-7,-5)(7,-5)
\psline[linewidth=0.05](-7,-7)(7,-7)
\psline[linewidth=0.05](-7,-9.1)(7,-9.1)
\rput(!posX1 \i\space get 9){\mobileA}
\rput(!posX2 \i\space get 7){\mobileB}
\rput(!posX3 \i\space get 5){\mobileB}
\rput(!posX4 \i\space get 3){\mobileB}
\rput(!posX5 \i\space get 1){\mobileB}
\rput(!posX6 \i\space get -1){\mobileB}
\rput(!posX7 \i\space get -3){\mobileB}
\rput(!posX8 \i\space get -5){\mobileB}
\rput(!posX9 \i\space get -7){\mobileB}
\rput(!posX10 \i\space get -9){\mobileC}
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=blue]{*-*}(!posX1 \i\space get 9)(!posX2 \i\space get 7)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=red]{*-*}(!posX2 \i\space get 7)(!posX3 \i\space get 5)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=green]{*-*}(!posX3 \i\space get 5)(!posX4 \i\space get 3)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=magenta]{*-*}(!posX4 \i\space get 3)(!posX5 \i\space get 1)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=cyan]{*-*}(!posX5 \i\space get 1)(!posX6 \i\space get -1)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=magenta]{*-*}(!posX6 \i\space get -1)(!posX7 \i\space get -3)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=green]{*-*}(!posX7 \i\space get -3)(!posX8 \i\space get -5)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=red]{*-*}(!posX8 \i\space get -5)(!posX9 \i\space get -7)
\psRessort[N=15,li=1,R=0.15,alpha=20,dl=0.4,linecolor=blue]{*-*}(!posX9 \i\space get -7)(!posX10 \i\space get -9)
}
\end{animateinline}
\end{center}
\end{document}



dimanche 19 juin 2016

Oscillateurs parallèles couplés par des ressorts n°9

Alexander Grahn fait la remarque suivante(très pertinente) : lorsque la longueur à vide des ressorts (ils sont tous identiques) est plus petite que la distance entre 2 rails, la position stable est celle pour laquelle l'alignement des ressorts est vertical, car le système tend à minimiser l'écart entre les mobiles donc la longueur des ressorts. D'une façon plus générale, l'état stable (l'équilibre final) est atteint lorsque l'énergie est minimale ce qui correspond bien à la longueur la plus petite possible des ressorts qui est la distance entre 2 rails.

Alexander propose un modèle plus complet qui permet de rendre compte de façon plus réaliste le phénomène, nous verrons cela très prochainement.

Lorsque le longueur à vide des ressorts est plus grande que la distance entre 2 rails, l'énergie minimale du système correspond à la longueur du ressort égale celle qu'il possède à vide (lorsqu'il n'est ni comprimé ni étiré)l'état stable. On obtient donc un système final en zigzag avec des distances entre mobiles égale à l0.
Si la longueur à vide des ressorts est égale à d*sqrt(2), les différentes parties du zigzag sont perpendiculaires.

Il doit exister des conditions initiales bien particulières où au final les ressorts sont alignés en oblique à 45°. 
Voici une vérification par simulation :
Remarque : le Gif ne boucle pas, il faut donc rafraichir l'écran pour relancer l'animation (touche F5).

Le listing :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-ode,pst-ressort,pst-plot}
%\usepackage[method=ocg]{animate}
\usepackage{animate}
\title{Dix oscillateurs parallèles couplés par des ressorts}
% on introduit une force de frottement -f*vx
\date{19 juin 2016}
% manuel.luque27@gmail.com
\pagestyle{empty}
\begin{document}
\def\mobileA{\pscustom[fillstyle=solid,fillcolor=gray!20,unit=0.2]{\psline(-0.5,0.1)(-2,0.1)(-2,1)(2,1)(2,0.1)
\psarcn(0,0.1){0.5}{0}{180}
\moveto(-0.2,0.1)
\psarc(0,0.1){0.2}{180}{360}
\psline(0.2,0.1)(-0.2,0.1)}}
\def\mobileB{\psframe[fillstyle=solid,fillcolor=gray!20,unit=0.2](-2,-0.5)(2,0.5)}
\def\mobileC{\pscustom[fillstyle=solid,fillcolor=gray!20,unit=0.2]{\psline(0.5,-0.1)(2,-0.1)(2,-1)(-2,-1)(-2,-0.1)(-0.5,-0.1)
\psarcn(0,-0.1){0.5}{180}{0}
\moveto(0.2,-0.1)
\psarc(0,-0.1){0.2}{0}{180}
\psline(-0.2,-0.1)(0.2,-0.1)}}
% 14 mobiles
%  0  1   2   3   4    5   6   7   8   9   10   11  12   13  %   14   15   16   17  18   19   20   21   22   23    24     25   26    27
% x1  x2  x3  x4  x5  x6  x7  x8  x9  x10  x11 x12  x13  x14 %  x'1  x'2  x'3  x'4  x'5  x'6  x'7  x'8  x'9  x'10  x'11  x'12  x'13  x'14
\def\QuatorzeOscillateurs{x[14]|x[15]|x[16]|x[17]|x[18]|x[19]|x[20]|x[21]|x[22]|x[23]|x[24]|x[25]|x[26]|x[27]| %
                                                km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))-cf*x[14]|%
                                               -km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))+km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))-cf*x[15]|%
                                               -km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))+km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))-cf*x[16]|%
                                               -km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))+km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))-cf*x[17]|%
                                               -km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))+km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))-cf*x[18]|%
                                               -km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))+km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))-cf*x[19]|%
                                               -km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))+km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))-cf*x[20]|%
                                               -km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))+km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))-cf*x[21]|%
                                               -km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))+km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[22]|%
                                               -km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))+km*(x[10]-x[9])*(1-L0/sqrt(distance^2+(x[10]-x[9])^2))-cf*x[23]|%
                                               -km*(x[10]-x[9])*(1-L0/sqrt(distance^2+(x[10]-x[9])^2))+km*(x[11]-x[10])*(1-L0/sqrt(distance^2+(x[11]-x[10])^2))-cf*x[24]|%
                                               -km*(x[11]-x[10])*(1-L0/sqrt(distance^2+(x[11]-x[10])^2))+km*(x[12]-x[11])*(1-L0/sqrt(distance^2+(x[12]-x[11])^2))-cf*x[25]|%
                                               -km*(x[12]-x[11])*(1-L0/sqrt(distance^2+(x[12]-x[11])^2))+km*(x[13]-x[12])*(1-L0/sqrt(distance^2+(x[13]-x[12])^2))-cf*x[26]|%
                                               -km*(x[13]-x[12])*(1-L0/sqrt(distance^2+(x[13]-x[12])^2))-cf*x[27]}%
\def\initCond{initCond}
\begin{center}
\def\nFrames{250}% 250 images
\psset[pst-ressort]{N=20,li=3,R=0.15,alpha=20,dl=0.4}%
\psset{unit=0.75}
\begin{animateinline}[controls,
                     begin={\begin{pspicture}(-10,-14)(10,14)},
                     end={\end{pspicture}}]{20}% 20 images/s
\pstVerb{
        /initCond {rrand srand
                   14 { rand 2147483647 div  6 mul -3 add } repeat
                   14 { rand 2147483647 div 16 mul -8 add } repeat
%                   10 { 0 } repeat
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 2.8284273 def % sqrt(8)
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.5 def
        }%
\pstODEsolve[algebraic]{mobiles}{0 1 2 3 4 5 6 7 8 9 10 11 12 13}{0}{12.5}{\nFrames}{\initCond}{\QuatorzeOscillateurs}
\pstVerb{
/posX1 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i get} for
       ]def
/posX2 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 1 add get} for
       ]def
/posX3 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 2 add get} for
       ]def
/posX4 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 3 add get} for
       ]def
/posX5 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 4 add get} for
       ]def
/posX6 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 5 add get} for
       ]def
/posX7 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 6 add get} for
       ]def
/posX8 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 7 add get} for
       ]def
/posX9 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 8 add get} for
       ]def
/posX10 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 9 add get} for
       ]def
/posX11 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 10 add get} for
       ]def
/posX12 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 11 add get} for
       ]def
/posX13 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 12 add get} for
       ]def
/posX14 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 13 add get} for
       ]def
}%
%
\multiframe{\nFrames}{i=0+1}{%
\psframe[fillstyle=vlines,hatchsep=1,hatchwidth=0.01](-10,-13.5)(10,13.5)
\psframe[fillstyle=hlines,hatchsep=1,hatchwidth=0.01](-10,-13.5)(10,13.5)
\psframe(-10,-13.5)(10,13.5)
\psline[linewidth=0.05](-10,13.1)(10,13.1)
\psline[linewidth=0.05](-10,11)(10,11)
\psline[linewidth=0.05](-10,9)(10,9)
\psline[linewidth=0.05](-10,7)(10,7)
\psline[linewidth=0.05](-10,5)(10,5)
\psline[linewidth=0.05](-10,3)(10,3)
\psline[linewidth=0.05](-10,1)(10,1)
\psline[linewidth=0.05](-10,-1)(10,-1)
\psline[linewidth=0.05](-10,-3)(10,-3)
\psline[linewidth=0.05](-10,-5)(10,-5)
\psline[linewidth=0.05](-10,-7)(10,-7)
\psline[linewidth=0.05](-10,-9)(10,-9)
\psline[linewidth=0.05](-10,-11)(10,-11)
\psline[linewidth=0.05](-10,-13.1)(10,-13.1)
\rput(!posX1 \i\space get 13){\mobileA}
\rput(!posX2 \i\space get 11){\mobileB}
\rput(!posX3 \i\space get 9){\mobileB}
\rput(!posX4 \i\space get 7){\mobileB}
\rput(!posX5 \i\space get 5){\mobileB}
\rput(!posX6 \i\space get 3){\mobileB}
\rput(!posX7 \i\space get 1){\mobileB}
\rput(!posX8 \i\space get -1){\mobileB}
\rput(!posX9 \i\space get -3){\mobileB}
\rput(!posX10 \i\space get -5){\mobileB}
\rput(!posX11 \i\space get -7){\mobileB}
\rput(!posX12 \i\space get -9){\mobileB}
\rput(!posX13 \i\space get -11){\mobileB}
\rput(!posX14 \i\space get -13){\mobileC}
\psRessort{*-*}(!posX1 \i\space get 13)(!posX2 \i\space get 11)
\psRessort{*-*}(!posX2 \i\space get 11)(!posX3 \i\space get 9)
\psRessort{*-*}(!posX3 \i\space get 9)(!posX4 \i\space get 7)
\psRessort{*-*}(!posX4 \i\space get 7)(!posX5 \i\space get 5)
\psRessort{*-*}(!posX5 \i\space get 5)(!posX6 \i\space get 3)
\psRessort{*-*}(!posX6 \i\space get 3)(!posX7 \i\space get 1)
\psRessort{*-*}(!posX7 \i\space get 1)(!posX8 \i\space get -1)
\psRessort{*-*}(!posX8 \i\space get -1)(!posX9 \i\space get -3)
\psRessort{*-*}(!posX9 \i\space get -3)(!posX10 \i\space get -5)
\psRessort{*-*}(!posX10 \i\space get -5)(!posX11 \i\space get -7)
\psRessort{*-*}(!posX11 \i\space get -7)(!posX12 \i\space get -9)
\psRessort{*-*}(!posX12 \i\space get -9)(!posX13 \i\space get -11)
\psRessort{*-*}(!posX13 \i\space get -11)(!posX14 \i\space get -13)
}
\end{animateinline}
\end{center}
\end{document}


jeudi 16 juin 2016

Oscillateurs parallèles couplés par des ressorts n°8

14 oscillateurs parallèles couplés par 9 ressorts
Remarque : le Gif ne boucle pas, il faut donc rafraichir l'écran pour relancer l'animation (touche F5).

Le listing :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-ode,pst-ressort,pst-plot}
%\usepackage[method=ocg]{animate}
\usepackage{animate}
\title{Dix oscillateurs parallèles couplés par des ressorts}
% on introduit une force de frottement -f*vx
\date{15 juin 2016}
\author{Manuel Luque}
% manuel.luque27@gmail.com
\pagestyle{empty}
\begin{document}
%\maketitle
\def\mobileA{\pscustom[fillstyle=solid,fillcolor=gray!20,unit=0.2]{\psline(-0.5,0.1)(-2,0.1)(-2,1)(2,1)(2,0.1)
\psarcn(0,0.1){0.5}{0}{180}
\moveto(-0.2,0.1)
\psarc(0,0.1){0.2}{180}{360}
\psline(0.2,0.1)(-0.2,0.1)}}
\def\mobileB{\psframe[fillstyle=solid,fillcolor=gray!20,unit=0.2](-2,-0.5)(2,0.5)}
\def\mobileC{\pscustom[fillstyle=solid,fillcolor=gray!20,unit=0.2]{\psline(0.5,-0.1)(2,-0.1)(2,-1)(-2,-1)(-2,-0.1)(-0.5,-0.1)
\psarcn(0,-0.1){0.5}{180}{0}
\moveto(0.2,-0.1)
\psarc(0,-0.1){0.2}{0}{180}
\psline(-0.2,-0.1)(0.2,-0.1)}}
% 14 mobiles
%  0  1   2   3   4    5   6   7   8   9   10   11  12   13  %   14   15   16   17  18   19   20   21   22   23    24     25   26    27
% x1  x2  x3  x4  x5  x6  x7  x8  x9  x10  x11 x12  x13  x14 %  x'1  x'2  x'3  x'4  x'5  x'6  x'7  x'8  x'9  x'10  x'11  x'12  x'13  x'14
\def\QuatorzeOscillateurs{x[14]|x[15]|x[16]|x[17]|x[18]|x[19]|x[20]|x[21]|x[22]|x[23]|x[24]|x[25]|x[26]|x[27]| %
                                                km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))-cf*x[14]|%
                                               -km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))+km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))-cf*x[15]|%
                                               -km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))+km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))-cf*x[16]|%
                                               -km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))+km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))-cf*x[17]|%
                                               -km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))+km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))-cf*x[18]|%
                                               -km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))+km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))-cf*x[19]|%
                                               -km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))+km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))-cf*x[20]|%
                                               -km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))+km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))-cf*x[21]|%
                                               -km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))+km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[22]|%
                                               -km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))+km*(x[10]-x[9])*(1-L0/sqrt(distance^2+(x[10]-x[9])^2))-cf*x[23]|%
                                               -km*(x[10]-x[9])*(1-L0/sqrt(distance^2+(x[10]-x[9])^2))+km*(x[11]-x[10])*(1-L0/sqrt(distance^2+(x[11]-x[10])^2))-cf*x[24]|%
                                               -km*(x[11]-x[10])*(1-L0/sqrt(distance^2+(x[11]-x[10])^2))+km*(x[12]-x[11])*(1-L0/sqrt(distance^2+(x[12]-x[11])^2))-cf*x[25]|%
                                               -km*(x[12]-x[11])*(1-L0/sqrt(distance^2+(x[12]-x[11])^2))+km*(x[13]-x[12])*(1-L0/sqrt(distance^2+(x[13]-x[12])^2))-cf*x[26]|%
                                               -km*(x[13]-x[12])*(1-L0/sqrt(distance^2+(x[13]-x[12])^2))-cf*x[27]}%
\def\initCond{initCond}
\begin{center}
\def\nFrames{250}% 250 images
\psset[pst-ressort]{N=20,li=3,R=0.15,alpha=20,dl=0.4}%
\psset{unit=0.75}
\begin{animateinline}[controls,
                     begin={\begin{pspicture}(-10,-14)(10,14)},
                     end={\end{pspicture}}]{20}% 20 images/s
\pstVerb{
        /initCond {rrand srand
                   14 { rand 2147483647 div  6 mul -3 add } repeat
                   14 { rand 2147483647 div 16 mul -8 add } repeat
%                   10 { 0 } repeat
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 3 def
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.5 def
        }%
\pstODEsolve[algebraic]{mobiles}{0 1 2 3 4 5 6 7 8 9 10 11 12 13}{0}{12.5}{\nFrames}{\initCond}{\QuatorzeOscillateurs}
\pstVerb{
/posX1 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i get} for
       ]def
/posX2 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 1 add get} for
       ]def
/posX3 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 2 add get} for
       ]def
/posX4 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 3 add get} for
       ]def
/posX5 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 4 add get} for
       ]def
/posX6 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 5 add get} for
       ]def
/posX7 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 6 add get} for
       ]def
/posX8 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 7 add get} for
       ]def
/posX9 [0 14 [mobiles] length 14 sub {/i exch def
             [mobiles] i 8 add get} for
       ]def
/posX10 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 9 add get} for
       ]def
/posX11 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 10 add get} for
       ]def
/posX12 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 11 add get} for
       ]def
/posX13 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 12 add get} for
       ]def
/posX14 [0 14 [mobiles] length 14 sub {/i exch def
              [mobiles] i 13 add get} for
       ]def
}%
%
\multiframe{\nFrames}{i=0+1}{%
\psframe[fillstyle=vlines,hatchsep=1,hatchwidth=0.01](-10,-13.5)(10,13.5)
\psframe[fillstyle=hlines,hatchsep=1,hatchwidth=0.01](-10,-13.5)(10,13.5)
\psframe(-10,-13.5)(10,13.5)
\psline[linewidth=0.05](-10,13.1)(10,13.1)
\psline[linewidth=0.05](-10,11)(10,11)
\psline[linewidth=0.05](-10,9)(10,9)
\psline[linewidth=0.05](-10,7)(10,7)
\psline[linewidth=0.05](-10,5)(10,5)
\psline[linewidth=0.05](-10,3)(10,3)
\psline[linewidth=0.05](-10,1)(10,1)
\psline[linewidth=0.05](-10,-1)(10,-1)
\psline[linewidth=0.05](-10,-3)(10,-3)
\psline[linewidth=0.05](-10,-5)(10,-5)
\psline[linewidth=0.05](-10,-7)(10,-7)
\psline[linewidth=0.05](-10,-9)(10,-9)
\psline[linewidth=0.05](-10,-11)(10,-11)
\psline[linewidth=0.05](-10,-13.1)(10,-13.1)
\rput(!posX1 \i\space get 13){\mobileA}
\rput(!posX2 \i\space get 11){\mobileB}
\rput(!posX3 \i\space get 9){\mobileB}
\rput(!posX4 \i\space get 7){\mobileB}
\rput(!posX5 \i\space get 5){\mobileB}
\rput(!posX6 \i\space get 3){\mobileB}
\rput(!posX7 \i\space get 1){\mobileB}
\rput(!posX8 \i\space get -1){\mobileB}
\rput(!posX9 \i\space get -3){\mobileB}
\rput(!posX10 \i\space get -5){\mobileB}
\rput(!posX11 \i\space get -7){\mobileB}
\rput(!posX12 \i\space get -9){\mobileB}
\rput(!posX13 \i\space get -11){\mobileB}
\rput(!posX14 \i\space get -13){\mobileC}
\psRessort{*-*}(!posX1 \i\space get 13)(!posX2 \i\space get 11)
\psRessort{*-*}(!posX2 \i\space get 11)(!posX3 \i\space get 9)
\psRessort{*-*}(!posX3 \i\space get 9)(!posX4 \i\space get 7)
\psRessort{*-*}(!posX4 \i\space get 7)(!posX5 \i\space get 5)
\psRessort{*-*}(!posX5 \i\space get 5)(!posX6 \i\space get 3)
\psRessort{*-*}(!posX6 \i\space get 3)(!posX7 \i\space get 1)
\psRessort{*-*}(!posX7 \i\space get 1)(!posX8 \i\space get -1)
\psRessort{*-*}(!posX8 \i\space get -1)(!posX9 \i\space get -3)
\psRessort{*-*}(!posX9 \i\space get -3)(!posX10 \i\space get -5)
\psRessort{*-*}(!posX10 \i\space get -5)(!posX11 \i\space get -7)
\psRessort{*-*}(!posX11 \i\space get -7)(!posX12 \i\space get -9)
\psRessort{*-*}(!posX12 \i\space get -9)(!posX13 \i\space get -11)
\psRessort{*-*}(!posX13 \i\space get -11)(!posX14 \i\space get -13)
}
\end{animateinline}
\end{center}
\end{document}



Oscillateurs parallèles couplés par des ressorts n°7

Dans la page :
http://pstricks.blogspot.fr/2016/06/oscillateurs-paralleles-couples-par-des.html
je posais la question suivante :
« Est-ce qu'en choisissant des vitesses initiales non nulles, il serait possible d'obtenir un alignement oblique ? »
L'animation suivante :
http://pstricks.blogspot.fr/2016/06/oscillateurs-paralleles-couples-par-des_15.html
a montré que non.
Mais entre-temps, Nils Berglund m'a indiqué que si le ressort a une longueur au repos supérieure à la distance entre 2 tiges, alors on obtiendra un état final avec des directions obliques. Je me suis empressé de vérifier son affirmation car les équations restent formellement identiques, en voici le résultat :

Remarque : le Gif ne boucle pas, il faut donc rafraichir l'écran pour relancer l'animation (touche F5).

On a bien deux directions obliques pour des groupes de 2, 3 ressorts. Je remercie encore une fois Nils Berglund pour ses pertinentes suggestions.
Voici les fichiers LaTeX pour une animation réalisée avec le package animate et la résolution des équations avec le package pst-ode tous deux d'Alexander Grahn et obtenir les images du Gif ci-dessus.
10mobiles9ressortsfrottements-3.zip

Le listing :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-ode,pst-ressort,pst-plot}
%\usepackage[method=ocg]{animate}
\usepackage{animate}
\title{Dix oscillateurs parallèles couplés par des ressorts}
% on introduit une force de frottement -f*vx
\date{16 juin 2016}
\author{Manuel Luque}
% manuel.luque27@gmail.com
\pagestyle{empty}
\begin{document}
%\maketitle
\def\mobileA{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(-0.5,0.1)(-2,0.1)(-2,1)(2,1)(2,0.1)
\psarcn(0,0.1){0.5}{0}{180}
\moveto(-0.2,0.1)
\psarc(0,0.1){0.2}{180}{360}
\psline(0.2,0.1)(-0.2,0.1)}}
\def\mobileB{\psframe[fillstyle=solid,fillcolor=yellow,unit=0.2](-2,-0.5)(2,0.5)}
\def\mobileC{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(0.5,-0.1)(2,-0.1)(2,-1)(-2,-1)(-2,-0.1)(-0.5,-0.1)
\psarcn(0,-0.1){0.5}{180}{0}
\moveto(0.2,-0.1)
\psarc(0,-0.1){0.2}{0}{180}
\psline(-0.2,-0.1)(0.2,-0.1)}}
% 10 mobiles
%  0  1   2   3   4    5   6   7   8   9  %  10   11  12   13   14   15   16   17  18   19
% x1  x2  x3  x4  x5  x6  x7  x8  x9  x10 %  x'1 x'2  x'3  x'4  x'5  x'6  x'7  x'8 x'9  x'10
\def\DixOscillateurs{x[10]|x[11]|x[12]|x[13]|x[14]|x[15]|x[16]|x[17]|x[18]|x[19]| %
                                                km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))-cf*x[10]|%
                                               -km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))+km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))-cf*x[11]|%
                                               -km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))+km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))-cf*x[12]|%
                                               -km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))+km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))-cf*x[13]|%
                                               -km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))+km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))-cf*x[14]|%
                                               -km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))+km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))-cf*x[15]|%
                                               -km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))+km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))-cf*x[16]|%
                                               -km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))+km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))-cf*x[17]|%
                                               -km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))+km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[18]|%
                                               -km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[19]}%
\def\initCond{initCond}
\begin{center}
\def\nFrames{400}% 400 images
\psset[pst-ressort]{N=20,li=3,R=0.15,alpha=20,dl=0.4}%
\begin{animateinline}[controls,
                     begin={\begin{pspicture}(-8,-10)(8,10)},
                     end={\end{pspicture}}]{20}% 20 images/s
\pstVerb{
        /initCond {rrand srand
                   10 { rand 2147483647 div  6 mul -3 add } repeat
                   10 { rand 2147483647 div 10 mul -5 add } repeat
%                   10 { 0 } repeat
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 3 def
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.5 def
        }%
\pstODEsolve[algebraic]{mobile0123456789}{0 1 2 3 4 5 6 7 8 9}{0}{10}{\nFrames}{\initCond}{\DixOscillateurs}
\pstVerb{
/posX1 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i get} for
       ]def
/posX2 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 1 add get} for
       ]def
/posX3 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 2 add get} for
       ]def
/posX4 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 3 add get} for
       ]def
/posX5 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 4 add get} for
       ]def
/posX6 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 5 add get} for
       ]def
/posX7 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 6 add get} for
       ]def
/posX8 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 7 add get} for
       ]def
/posX9 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 8 add get} for
       ]def
/posX10 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 9 add get} for
       ]def
}%
\multiframe{\nFrames}{i=0+1}{%
\psframe*[linecolor=cyan!20](-8,-10)(8,10)
\psline[linewidth=0.05](-8,9.1)(8,9.1)
\psline[linewidth=0.05](-8,7)(8,7)
\psline[linewidth=0.05](-8,5)(8,5)
\psline[linewidth=0.05](-8,3)(8,3)
\psline[linewidth=0.05](-8,1)(8,1)
\psline[linewidth=0.05](-8,-1)(8,-1)
\psline[linewidth=0.05](-8,-3)(8,-3)
\psline[linewidth=0.05](-8,-5)(8,-5)
\psline[linewidth=0.05](-8,-7)(8,-7)
\psline[linewidth=0.05](-8,-9.1)(8,-9.1)
\rput(!posX1 \i\space get 9){\mobileA}
\rput(!posX2 \i\space get 7){\mobileB}
\rput(!posX3 \i\space get 5){\mobileB}
\rput(!posX4 \i\space get 3){\mobileB}
\rput(!posX5 \i\space get 1){\mobileB}
\rput(!posX6 \i\space get -1){\mobileB}
\rput(!posX7 \i\space get -3){\mobileB}
\rput(!posX8 \i\space get -5){\mobileB}
\rput(!posX9 \i\space get -7){\mobileB}
\rput(!posX10 \i\space get -9){\mobileC}
\psRessort[linecolor=blue]{*-*}(!posX1 \i\space get 9)(!posX2 \i\space get 7)
\psRessort[linecolor=red]{*-*}(!posX2 \i\space get 7)(!posX3 \i\space get 5)
\psRessort[linecolor=green]{*-*}(!posX3 \i\space get 5)(!posX4 \i\space get 3)
\psRessort[linecolor=magenta]{*-*}(!posX4 \i\space get 3)(!posX5 \i\space get 1)
\psRessort[linecolor=cyan]{*-*}(!posX5 \i\space get 1)(!posX6 \i\space get -1)
\psRessort[linecolor=magenta]{*-*}(!posX6 \i\space get -1)(!posX7 \i\space get -3)
\psRessort[linecolor=green]{*-*}(!posX7 \i\space get -3)(!posX8 \i\space get -5)
\psRessort[linecolor=red]{*-*}(!posX8 \i\space get -5)(!posX9 \i\space get -7)
\psRessort[linecolor=blue]{*-*}(!posX9 \i\space get -7)(!posX10 \i\space get -9)
}
\end{animateinline}
\end{center}
\end{document}




mercredi 15 juin 2016

Oscillateurs parallèles couplés par des ressorts n°6

Voici une version avec 10 mobiles et 9 ressorts mais dont les positions et vitesses initiales sont aléatoires et ont été codées avec Postscript : c'est donc un listing plus court et une compilation un tout petit peu plus rapide.
Alexander Grahn m'a rappelé les différentes méthodes pour réaliser les animations avec le package animate(dont il est l'auteur), je l'en remercie :

\usepackage[method=icon]{animate}   %default with pdfTeX
\usepackage[method=widget]{animate} %default with dvips
\usepackage[method=ocg]{animate}

Aussi par

\begin{animateinline}[method=...

ou

\animategraphics[method=...

Il précise aussi que la méthode OCG est particulièrement avantageuse, s'il n'y pas d'autres éléments (texte, images) sur la même page.

On constate que les ressorts sont alignés verticalement lorsque le système est stabilisé, mais pas forcément au milieu.

Remarque : le Gif ne boucle pas, il faut donc rafraichir l'écran pour relancer l'animation (touche F5).

Les fichiers :
10mobiles9ressortsfrottements-2.zip

Le listing :

\documentclass{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage{pst-ode,pst-ressort,pst-plot}
\usepackage[method=ocg]{animate}
\title{Dix oscillateurs parallèles couplés par des ressorts}
% on introduit une force de frottement -f*vx
\date{15 juin 2016}
\author{Manuel Luque}
% manuel.luque27@gmail.com
\pagestyle{empty}
\begin{document}
%\maketitle
\def\mobileA{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(-0.5,0.1)(-2,0.1)(-2,1)(2,1)(2,0.1)
\psarcn(0,0.1){0.5}{0}{180}
\moveto(-0.2,0.1)
\psarc(0,0.1){0.2}{180}{360}
\psline(0.2,0.1)(-0.2,0.1)}}
\def\mobileB{\psframe[fillstyle=solid,fillcolor=yellow,unit=0.2](-2,-0.5)(2,0.5)}
\def\mobileC{\pscustom[fillstyle=solid,fillcolor=red,unit=0.2]{\psline(0.5,-0.1)(2,-0.1)(2,-1)(-2,-1)(-2,-0.1)(-0.5,-0.1)
\psarcn(0,-0.1){0.5}{180}{0}
\moveto(0.2,-0.1)
\psarc(0,-0.1){0.2}{0}{180}
\psline(-0.2,-0.1)(0.2,-0.1)}}
% 10 mobiles
%  0  1   2   3   4    5   6   7   8   9  %  10   11  12   13   14   15   16   17  18   19
% x1  x2  x3  x4  x5  x6  x7  x8  x9  x10 %  x'1 x'2  x'3  x'4  x'5  x'6  x'7  x'8 x'9  x'10
\def\DixOscillateurs{x[10]|x[11]|x[12]|x[13]|x[14]|x[15]|x[16]|x[17]|x[18]|x[19]| %
                                                km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))-cf*x[10]|%
                                               -km*(x[1]-x[0])*(1-L0/sqrt(distance^2+(x[1]-x[0])^2))+km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))-cf*x[11]|%
                                               -km*(x[2]-x[1])*(1-L0/sqrt(distance^2+(x[2]-x[1])^2))+km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))-cf*x[12]|%
                                               -km*(x[3]-x[2])*(1-L0/sqrt(distance^2+(x[3]-x[2])^2))+km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))-cf*x[13]|%
                                               -km*(x[4]-x[3])*(1-L0/sqrt(distance^2+(x[4]-x[3])^2))+km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))-cf*x[14]|%
                                               -km*(x[5]-x[4])*(1-L0/sqrt(distance^2+(x[5]-x[4])^2))+km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))-cf*x[15]|%
                                               -km*(x[6]-x[5])*(1-L0/sqrt(distance^2+(x[6]-x[5])^2))+km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))-cf*x[16]|%
                                               -km*(x[7]-x[6])*(1-L0/sqrt(distance^2+(x[7]-x[6])^2))+km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))-cf*x[17]|%
                                               -km*(x[8]-x[7])*(1-L0/sqrt(distance^2+(x[8]-x[7])^2))+km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[18]|%
                                               -km*(x[9]-x[8])*(1-L0/sqrt(distance^2+(x[9]-x[8])^2))-cf*x[19]}%
\def\initCond{initCond}
\begin{center}
\def\nFrames{250}% 250 images
\begin{animateinline}[controls,
                     begin={\begin{pspicture}(-7,-10)(7,10)},
                     end={\end{pspicture}}]{17}% 17 images/s
\pstVerb{rrand srand
        /initCond {10 { rand 2147483647 div 6 mul -3 add  } repeat
                   10 { rand 2147483647 div 20 mul -10 add} repeat
                   } def
%% k/m = km =4pi^2 = 39.4784176
         /km 39.4784176 def
         /L0 1 def
         /distance 2 def
% coefficient de frottement / masse = cf
         /cf 0.75 def
        }%
\pstODEsolve[algebraic,varsteptol=1e-6]{mobile0123456789}{0 1 2 3 4 5 6 7 8 9}{0}{10}{\nFrames}{\initCond}{\DixOscillateurs}
\pstVerb{
/posX1 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i get} for
       ]def
/posX2 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 1 add get} for
       ]def
/posX3 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 2 add get} for
       ]def
/posX4 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 3 add get} for
       ]def
/posX5 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 4 add get} for
       ]def
/posX6 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 5 add get} for
       ]def
/posX7 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 6 add get} for
       ]def
/posX8 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 7 add get} for
       ]def
/posX9 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 8 add get} for
       ]def
/posX10 [0 10 [mobile0123456789] length 10 sub {/i exch def
            [mobile0123456789] i 9 add get} for
       ]def
}%
\multiframe{\nFrames}{i=0+1}{%
\psframe*[linecolor=cyan!20](-7,-10)(7,10)
\psline[linewidth=0.05](-7,9.1)(7,9.1)
\psline[linewidth=0.05](-7,7)(7,7)
\psline[linewidth=0.05](-7,5)(7,5)
\psline[linewidth=0.05](-7,3)(7,3)
\psline[linewidth=0.05](-7,1)(7,1)
\psline[linewidth=0.05](-7,-1)(7,-1)
\psline[linewidth=0.05](-7,-3)(7,-3)
\psline[linewidth=0.05](-7,-5)(7,-5)
\psline[linewidth=0.05](-7,-7)(7,-7)
\psline[linewidth=0.05](-7,-9.1)(7,-9.1)
\rput(!posX1 \i\space get 9){\mobileA}
\rput(!posX2 \i\space get 7){\mobileB}
\rput(!posX3 \i\space get 5){\mobileB}
\rput(!posX4 \i\space get 3){\mobileB}
\rput(!posX5 \i\space get 1){\mobileB}
\rput(!posX6 \i\space get -1){\mobileB}
\rput(!posX7 \i\space get -3){\mobileB}
\rput(!posX8 \i\space get -5){\mobileB}
\rput(!posX9 \i\space get -7){\mobileB}
\rput(!posX10 \i\space get -9){\mobileC}
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=blue]{*-*}(!posX1 \i\space get 9)(!posX2 \i\space get 7)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=red]{*-*}(!posX2 \i\space get 7)(!posX3 \i\space get 5)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=green]{*-*}(!posX3 \i\space get 5)(!posX4 \i\space get 3)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=magenta]{*-*}(!posX4 \i\space get 3)(!posX5 \i\space get 1)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=cyan]{*-*}(!posX5 \i\space get 1)(!posX6 \i\space get -1)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=magenta]{*-*}(!posX6 \i\space get -1)(!posX7 \i\space get -3)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=green]{*-*}(!posX7 \i\space get -3)(!posX8 \i\space get -5)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=red]{*-*}(!posX8 \i\space get -5)(!posX9 \i\space get -7)
\psRessort[N=20,li=0.5,R=0.15,alpha=20,dl=0.4,linecolor=blue]{*-*}(!posX9 \i\space get -7)(!posX10 \i\space get -9)
}
\end{animateinline}
\end{center}
\end{document}