vendredi 25 avril 2014

Thomas Söll : mise à jour de pst-perspective avec la projection d'un cylindre.

En voici 2 images extraites de la documentation :
 Le package est disponible sur le serveur du CTAN :

À toutes fins utiles, je rappelle l'adresse de Thomas : Thomas.Soell@onlinehome.de 

Thomas Söll propose 2 nouvelles macros pour pst-eucl

Pour le package pst-eucl de Dominique Rodriguez, Thomas Söll propose la possibilité d'afficher la distance entre 2 points ainsi que le marquage et la valeur d'un angle déterminé par 3 points. Le calcul est effectué par l'interpréteur postscript ainsi que l'affichage du résultat. Ce sont les macros :
\psSpaceV
\psAngleMark
Cette dernière ajoute donc l'option d'affichage de la valeur de l'angle à celles de la macro de pst-eucl : \pstMarkAngle.
Le listing ci-dessous à compiler : LaTeX->dvips->ps2pdf

\documentclass[border=10pt]{standalone}
\usepackage[distiller]{pstricks}
\usepackage{pst-eucl,pstricks-add}

\SpecialCoor%
\makeatletter
\pst@addfams{pst-eucl}
\define@key[psset]{pst-eucl}{DecimalN}{\def\psk@DecimalN{#1}}%
% Linecolor
\define@key[psset]{pst-eucl}{ArcColor}{\def\psk@ArcColor{#1}}%
% fillcolor for wedge
\define@key[psset]{pst-eucl}{WedgeColor}{\def\psk@WedgeColor{#1}}%
% fillcolor for wedge
\define@key[psset]{pst-eucl}{WedgeOpacity}{\def\psk@WedgeOpacity{#1}}%
% x Labelsep
\define@key[psset]{pst-eucl}{xLabelSep}{\def\psk@xLabelSep{#1}}%
% y Labelsep
\define@key[psset]{pst-eucl}{yLabelSep}{\def\psk@yLabelSep{#1}}%
% Fontsize Values
\define@key[psset]{pst-eucl}{FontSizeV}{\def\psk@FontSizeV{#1}}%
%----------------------------------------------------------------------
\define@boolkey[psset]{pst-eucl}[Pst@]{AngleValue}[false]{} % show angle value
\define@boolkey[psset]{pst-eucl}[Pst@]{AngleArc}[true]{} % show angle arcShowWedge
\define@boolkey[psset]{pst-eucl}[Pst@]{ShowWedge}[true]{} % show wedge
%---------------------------------------------------------------------
%   Default Parameter
\psset[pst-eucl]{%
DecimalN=2,ArcColor=black,WedgeColor=blue,WedgeOpacity=0.2,AngleValue=false,AngleArc=true,xLabelSep=0,yLabelSep=0,FontSizeV=8,ShowWedge=true
}
%------------- Distance of 2 points -----------------------
%---------------------------------------------------------------------
\def\psSpaceV{\pst@object{pstpsSpaceV}}%
\def\pstpsSpaceV@i(#1)(#2)#3#4{%
\begingroup%
\pst@killglue
\use@par
\pst@getcoor{#1}\pst@tempA
\pst@getcoor{#2}\pst@tempB
\pnode(! %
/Helvetica findfont \psk@FontSizeV\space scalefont setfont
/laenge {10 #4 exp mul round 10 #4 exp div 15 string cvs stringwidth } def
/Wert {10 #4 exp mul round 10 #4 exp div 15 string cvs dot2comma show } def
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempA /y3 ED /x3 ED
\pst@tempB /y4 ED /x4 ED
x3 x4 sub y3 y4 sub Pyth laenge /dx ED
x3 x4 add 2 div dx 2 div sub \psk@xLabelSep\space add y3 y4 add 2 div \psk@yLabelSep\space add
moveto %
x1 x2 sub y1 y2 sub Pyth Wert
x1 x2 add 2 div y1 y2 add 2 div){#3}
\endgroup
\ignorespaces
}
%--------------------------------------------------------------------
%------------- angle mark and calculate the value -----------
%---------------------------------------------------------------------
\def\psAngleMark{\@ifnextchar[\Pst@AngleMark{\Pst@AngleMark[]}}%
\def\Pst@AngleMark[#1](#2)(#3)(#4)#5{%
\def\pst@par{#1}%
\begingroup%
\pst@killglue
\use@par
\pst@getcoor{#2}\pst@tempA
\pst@getcoor{#3}\pst@tempB
\pst@getcoor{#4}\pst@tempC
\pst@Verb{%
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempC \tx@UserCoor /y3 ED /x3 ED
y1 y2 sub x1 x2 sub Atan neg /delta1 ED
y3 y2 sub x3 x2 sub Atan neg /delta2 ED
delta1 delta2 le {180 delta2 delta1 add 2 div neg add /WiM ED} {delta2 delta1 add 2 div neg /WiM ED} ifelse
}
\ifPst@ShowWedge
\pswedge[fillstyle=solid,fillcolor=\psk@WedgeColor,opacity=\psk@WedgeOpacity](#3){\psk@MarkAngleRadius}{! delta1}{! delta2}%
\else \fi
\ifPst@AngleArc
\psarc[linecolor=\psk@ArcColor](#3){\psk@MarkAngleRadius}{! delta1}{! delta2}%
\else \fi
%
\pnode(! %
/dec \psk@DecimalN\space def
/Helvetica findfont \psk@FontSizeV\space scalefont setfont
/s1 { /Symbol findfont \psk@FontSizeV\space scalefont setfont } bind def
/laenge {10 dec exp mul round 10 dec exp div 15 string cvs stringwidth } def
/WertZeigen {10 dec exp mul round 10 dec exp div 15 string cvs dot2comma show s1 (\string\260) show} def
\pst@tempA \tx@UserCoor /y1 ED /x1 ED
\pst@tempB \tx@UserCoor /y2 ED /x2 ED
\pst@tempC \tx@UserCoor /y3 ED /x3 ED
y1 y2 sub x1 x2 sub Atan neg /delta1 ED
y3 y2 sub x3 x2 sub Atan neg /delta2 ED
delta1 delta2 le {360 delta2 delta1 sub abs sub /WiWert ED} {delta2 delta1 sub abs /WiWert ED} ifelse
delta1 delta2 le {180 delta2 delta1 add 2 div neg add /WiM ED} {delta2 delta1 add 2 div neg /WiM ED} ifelse
\psk@MarkAngleRadius\space delta2 delta1 add 2 div PtoC \pst@tempB exch pop add /ym1 ED \pst@tempB pop add /xm1 ED
xm1 \psk@MarkAngleRadius\space WiM cos mul \pst@number\psxunit mul add \psk@xLabelSep\space add ym1 \psk@MarkAngleRadius\space WiM sin mul \pst@number\psxunit mul add \psk@yLabelSep\space add moveto %
\ifPst@AngleValue
WiWert WertZeigen
\else \fi
x2 0.8 WiM cos mul add y2 0.8 WiM sin mul add){#3-M}
\uput{\psk@LabelSep}[! WiM]{0}(#3){#5}
\endgroup
\ignorespaces
}
\makeatother

\begin{document}

\begin{pspicture}(-12,-8)(1,1)
\psgrid[gridlabels=0pt,subgriddiv=2,gridwidth=0.4pt,subgridwidth=0.2pt,gridcolor=black!60,subgridcolor=black!40]
\def\seitec{6}
\def\seitea{7}
\def\seiteb{8}
\psset{PointSymbol=none,linejoin=1,linewidth=0.4pt,PtNameMath=false,labelsep=0.07,MarkAngleRadius=1.1,DecimalN=1}
    \pstGeonode[PosAngle={90,90}](0,0){A}(6;190){B}
%    \pstGeonode[PosAngle={225,-75}](0,0){A}(\seitec;10){B}
    \psset{PointName=}
    \pstInterCC[RadiusA=\pstDistVal{\seiteb},RadiusB=\pstDistVal{\seitea},PosAngle=-90,PointNameA=C]{A}{}{B}{}{C}{C-}
    \pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{C}{}{A}{}{D-}{D}
    \pstInterLC[Radius=\pstDistAB{A}{C}]{C}{D}{C}{}{A'-}{A'}
    \pstInterCC[RadiusA=\pstDistAB{A}{B},RadiusB=\pstDistAB{B}{C}]{A'}{}{C}{}{B'}{B'-}
    \pstInterLL[PosAngle=90,PointName=default]{B'}{C}{A}{B}{E}
    \pspolygon(A)(B)(C)
    \pspolygon[fillstyle=solid,fillcolor=magenta,opacity=0.1](C)(E)(B)

\psAngleMark[ArcColor=blue,WedgeColor=blue!20,AngleValue=true,LabelSep=0.7,arrows=->](B)(A)(C){}
\psAngleMark[AngleValue=true,ArcColor=red,arrows=->,WedgeOpacity=0.6,WedgeColor=yellow,LabelSep=0.5](C)(B)(A){$\beta$}
\psAngleMark[LabelSep=0.7,WedgeColor=green,xLabelSep=-6,yLabelSep=-10](A)(C)(B){$\gamma$}
\psAngleMark[LabelSep=0.7,AngleArc=false,WedgeColor=green,arrows=->,xLabelSep=-15,yLabelSep=0](C)(E)(B){\color{green}$\gamma$}
\psAngleMark[AngleValue=true,MarkAngleRadius=1.0,LabelSep=0.5,ShowWedge=false,xLabelSep=-5,yLabelSep=7,arrows=->](E)(B)(C){}

\pcline[linestyle=none](A)(B)\nbput{\seitec}
\pcline[linestyle=none](C)(B)\naput{\seitea}
\psSpaceV[xLabelSep=-8,yLabelSep=4](B)(E){MW}{2}
\psSpaceV[FontSizeV=15,xLabelSep=-20](A)(C){MAC}{1}
\psSpaceV[xLabelSep=-17](E)(C){MEC}{1}
\end{pspicture}
\end{document}

mardi 8 avril 2014

Pendules couplés par un ressort

C’est un problème classique et largement présent sur le Web, cependant les calculs précis dans le cas général ne sont pas en général traités, une exception pour l’étude de Gilbert Gastebois qui comprend aussi le cas des petits angles avec l’étude des modes propres et des battements le tout complété par une superbe animation en java.

Cette étude est donc reprise dans ce document, tout au moins jusqu'à l'établissement des équations différentielles couplées, d'abord d'un point de vue théorique puis avec des animations réalisées avec le package animate, la résolution numérique étant confiée au package pst-ode, on ne limite donc pas aux petits angles.
Fichiers : 2-pendula-coupled-spring.pdf et 2-pendula-coupled-spring.tex dans :

Pour les animations elles concernent les modes propres et les battements. Fichiers : 2-pendula-coupled-spring-part2.pdf  et 2-pendula-coupled-spring-part2.tex dans :

Je rappelle que les animations sont intégrées dans le fichier pdf.

Voici deux conversions de ces animations au format Gif animé :
 L'animation précédente contient 50 images.
L'animation suivante, les battements, contient 500 images !!!. Il faudra donc attendre le temps nécessaire pour que le navigateur mette en cache ces images afin que l'animation soit fluide. fichier gif : 2pendulescouplesv2.gif  dans :



La troisième partie traite de différents exemples avec des points d’attache des ressorts différents.
Les fichiers de l'animation des pendules en opposition de phase sont dans le même répertoire que précédemment.


Mise à jour de "pst-perspective"

Thomas Söll a effectué une mise à jour de "pst-perspective" avec des exemples supplémentaires comme, par exemple, un magnifique pont (ou un aqueduc) à voûte dont les piles sont joliment dessinées.La documentation du package existe maintenant en anglais et en allemand.




Tous les nouveaux fichiers sont dans ce répertoire (mise à jour le 12 août 2017) :
Le fichier zippé contient tous les fichiers.

Thomas a aussi créé un exemple combinant pst-ressort et pst-perspective pour illustrer le phénomène d’induction et la loi de Lenz.


Cette version de pst-perspective est sur le serveur du CTAN.
http://www.ctan.org/pkg/pst-perspective


jeudi 3 avril 2014

Oscillateurs sur un banc à coussin d’air : une extrémité libre

Premier mode : les mobiles vibrent en phase.
Deuxième mode : les mobiles vibrent en opposition de phase :
Le listing qui après la séquence : LaTeX -> DVIPS -> ps2pdf donnera le fichier pdf contenant les 2 animations créées avec le package animate. Pour les packages pst-ode, animate et pst-ressort voir les messages précédents.

\documentclass[fleqn]{article}
\usepackage[a4paper,margin=2cm]{geometry}
\usepackage[latin1]{inputenc}%
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{pst-ode,multido,pst-ressort}
\usepackage{animate}
\usepackage{array,amsmath}
\def\Mobile{
    \pspolygon[fillstyle=solid,fillcolor=gray!50](-1,0.5)(1,0.5)(1,1.25)(0.9,1.25)(0.9,0.75)(-0.9,0.75)(-0.9,1.25)(-1,1.25)
    \pspolygon[fillstyle=solid,fillcolor=gray](-1,0)(1,0)(1,0.5)(-1,0.5)
}
\def\Rail{
    \psline[linewidth=0.1](-8,-0.5)(-8,1.25)
    \psframe[fillstyle=solid,fillcolor={[rgb]{0.75 0.75 0.5}}](-8,-0.5)(8,0.5)
    \multido{\n=-7.5+0.5}{31}{\psdot[dotstyle=o](\n,0.25)}
}
% x1    x2   x1'   x2'
% y[0] y[1]  y[2]  y[3]
\def\oscillateurs{y[2]|y[3]|(-2*y[0]+y[1])*O2|(-y[1]+y[0])*O2}
\def\initCond{x10 x20 v10 v20}
\SpecialCoor
\title{Oscillateurs sur un banc à coussin d'air}
\date{3 avril 2014}
\begin{document}
\maketitle
\begin{center}
\begin{pspicture}(-9,-1.5)(9,2)
\psset{li=4,N=10,dl=0.2,nS=15,alpha=30,R=0.25}
\Rail
\rput(-3,0){\Mobile}
\rput(3,0){\Mobile}
\psRessort[linewidth=0.02,linecolor=red]{o-o}(-8,1)(-4,1)
\psRessort[linewidth=0.02,linecolor=blue]{o-o}(-2,1)(2,1)
\psline{->}(-8,-1)(8,-1)
\psdots(-3,-1)(3,-1)
\uput[u](-3,-1){$O_1$}
\uput[u](3,-1){$O_2$}
\uput[u](8,-1){$x$}
\rput(-6,1.5){$k$}
\rput(0,1.5){$k$}
\uput[u](-3,1){$(m)$}
\uput[u](3,1){$(m)$}
\end{pspicture}
\end{center}
\[
\left\{
\begin{array}[m]{l}
 \ddot{x_1}=-\dfrac{2k}{m}x_1+\dfrac{k}{m}x_2\\[1em]
 \ddot{x_2}=\dfrac{k}{m}x_1-\dfrac{k}{m}x_2
\end{array}
\right.
\Longrightarrow
\left\{
\begin{array}[m]{l}
 \ddot{x_1}=-2\omega_0^2x_1+\omega_0^2x_2\\[1em]
 \ddot{x_2}=\hphantom{-2}\omega_0^2x_1-\omega_0^2x_2
\end{array}
\right.
\]
Valeurs propres $(\omega^2)$ et vecteurs propres :
\[
 \left[
    \begin {array}{c}
    \dfrac{3+\sqrt {5}}{2} {\omega_0}^{2}\\
    \noalign{\medskip}
    \dfrac{3-\sqrt {5}}{2} {\omega_0}^{2}
  \end {array}
   \right]
  \qquad
  \left[
    \begin {array}{cc}
    -\dfrac{\sqrt {5}+1}{2}&\dfrac{\sqrt {5}-1}{2}\\
    \noalign{\medskip}
    1&1
  \end {array}
   \right]
\]
\begin{verbatim}
\pstVerb{
    /k' 5 def   % constante de raideur (k)
    /m' 0.5 def % masse (m)
    /O2 k' m' div def % pulsation propre d'un oscillateur au carré
        }
% x1    x2   x1'   x2'
% y[0] y[1]  y[2]  y[3]
\def\oscillateurs{y[2]|y[3]|(-2*y[0]+y[1])*O2|(-y[1]+y[0])*O2}
\def\initCond{x10 x20 v10 v20}
\end{verbatim}
\newpage
Premier mode : les mobiles vibrent en phase.
\begin{center}
\psset{li=4,N=10,dl=0.2,nS=15,alpha=20,R=0.25}
\def\nFrames{50}% 50 images
\begin{animateinline}[controls,loop,%
                     begin={\begin{pspicture}(-9,-2)(9,2)},
                     end={\end{pspicture}}]{5}% 5 images/s
\pstVerb{% datas
    /k' 5 def   % constante de raideur (k)
    /m' 0.5 def % masse (m)
    /O2 k' m' div def % pulsation propre d'un oscillateur au carré
% mode 1
    /O1 k' m' div 3 5 sqrt sub 2 div mul sqrt def
    /T1 6.283185 O1 div def
    /x10 5 sqrt 1 sub 2 div 2 mul def
    /x20 1 2 mul def
    /v10 0 def
    /v20 0 def
        }%
% enregistrement des positions des 2 mobiles
\pstODEsolve[algebraic]{X12L}{0 1}{0}{T1}{\nFrames}{\initCond}{\oscillateurs}
\pstVerb{ % tableaux des positions des mobiles : 50 positions sur une période propre.
       /X12 [X12L] def
        /X1 [
         0 2 X12 length 2 sub {/ix1 exch def
         X12 ix1 get 3 sub % x1
         }for
         ] def
         /X2 [
         0 2 X12 length 2 sub {/ix2 exch def
         X12 ix2 1 add get 3 add % x2
         }for
         ] def
         }%
\multiframe{\nFrames}{i=0+1}{%
\psframe*[linecolor=yellow!20](-9,-1)(9,2)
\psgrid[subgriddiv=0,gridcolor=black,griddots=10,gridlabels=0pt](-9,-1)(9,2)
\Rail%
    \rput(! X1 \i\space get 0){\Mobile}
    \rput(! X2 \i\space get 0){\Mobile}
    \psRessort[linewidth=0.04,linecolor=red]{o-o}(-8,1)(! X1 \i\space get 1 sub 1)
    \psRessort[linewidth=0.04,linecolor=blue]{o-o}(! X1 \i\space get 1 add 1)(! X2 \i\space get 1 sub 1)
}%
\end{animateinline}
\end{center}


Deuxième mode : les mobiles vibrent en opposition de phase :

\begin{center}
\psset{li=4,N=10,dl=0.2,nS=15,alpha=20,R=0.25}
\def\nFrames{50}% 50 images
\begin{animateinline}[controls,loop,%
                     begin={\begin{pspicture}(-9,-1)(9,2)},
                     end={\end{pspicture}}]{10}% 10 images/s
\pstVerb{% datas
    /k' 5 def   % constante de raideur (k)
    /m' 0.5 def % masse (m)
    /O2 k' m' div def % pulsation propre d'un oscillateur au carré
    /T0 6.283185 m' div k' mul def
% mode 2
    /O1 k' m' div 3 5 sqrt add 2 div mul sqrt def
    /T1 6.283185 O1 div def
    /x10 5 sqrt 1 add 2 div neg def
    /x20 1 def
    /v10 0 def
    /v20 0 def
        }%
% enregistrement des positions des 2 mobiles
\pstODEsolve[algebraic]{X12S}{0 1}{0}{T1}{\nFrames}{\initCond}{\oscillateurs}
\pstVerb{ % tableaux des positions des mobiles : 50 positions sur une période propre.
       /X12 [X12S] def
        /X1 [
         0 2 X12 length 2 sub {/ix1 exch def
         X12 ix1 get 3 sub % x1
         }for
         ] def
         /X2 [
         0 2 X12 length 2 sub {/ix2 exch def
         X12 ix2 1 add get 3 add % x2
         }for
         ] def
         }%
\multiframe{\nFrames}{i=0+1}{%
\psframe*[linecolor=yellow!20](-9,-1)(9,2)
\psgrid[subgriddiv=0,gridcolor=black,griddots=10,gridlabels=0pt](-9,-1)(9,2)
\Rail%
    \rput(! X1 \i\space get 0){\Mobile}
    \rput(! X2 \i\space get 0){\Mobile}
    \psRessort[linewidth=0.04,linecolor=red]{o-o}(-8,1)(! X1 \i\space get 1 sub 1)
    \psRessort[linewidth=0.04,linecolor=blue]{o-o}(! X1 \i\space get 1 add 1)(! X2 \i\space get 1 sub 1)
}%
\end{animateinline}
\end{center}
\end{document}