Programmation en Latex

Programmation avancée, fonctions récursives et graphiques




Fonction récursive - Suite récurrente, graphique en "toile d'arraigné"

Fonction définie récursivement simple:
Code:
\newcommand\sayto[1]{%
 \ifnum#1=1
  to%
 \else
  to\sayto{\numexpr#1-1}%
 \fi
}

\sayto{5}
Un exemple typique est celui d'une suite définie par récurrence par une relation du type: $u_{n+1}=f(u_n)$$f$ est une fonction quelconque (continue par exemple...). Pour placer sur l'axe des abscisses les valeurs successives de la suite, $u_0$, $u_1$, $u_2$, $u_3$ ... on trace la courbe représentative de la fonction $f$ et la droite d'équation $y=x$, on trace alors, récursivement, un graphique en "escargot": Fonction définie récursivement:
Code:
\psset{unit=1.5cm}
\begin{pspicture}(-1,-1)(8,7)
 \psline{->}(-0.5,0)(7.5,0)
 \psline{->}(0,-0.5)(0,6.5)
 \multido{\i=0+1}{8}{%
  \psline(\i,-0.1)(\i,0.1)%
  %\rput(\i,-0.3){$\i$}
 }
 \multido{\i=0+1}{7}{%
  \psline(-0.1,\i)(0.1,\i)%
  \rput(-0.3,\i){$\i$}%
 }
 % Definition de la fonction f de u_{n+1}=f(u_n)
 \newcommand{\f}[1]{6 5 #1 1 add div sub}
 % Et son tracer:
 \psplot[linewidth=1.4pt]{0}{7}{\f{x}}
 % ainsi que le tracer de la droite y=x
 \psplot{-0.2}{6.5}{x}

 % Defintion de la fonction itérée:
 % par ex.: fn{3}{x}=f(f(f(x)))
 \newcommand\fn[2]{%
  \ifnum#1=1
  \f{#2}%
  \else
  \f{\fn{\numexpr#1-1}{#2}}%
  \fi
 }
 % Valeur initiale (u_0)
 \def\xinit{0}
 \def\nmax{4}

 % Initialisation pour u_0
 \psline[linestyle=dashed]
 (\xinit,0)
 (!\xinit\space\f{\xinit})
 (!\f{\xinit}\space\f{\xinit})
 \rput(\xinit,-0.3){$A_0$}
 % Boucle pour u_1, u_2, ..., u_nmax
 \multido{\i=1+1}{\nmax}{
  \psline[linestyle=dashed]
  (!\fn{\i}{\xinit} \space 0)
  (!\fn{\i}{\xinit} \space \fn{\i}{\xinit})
  (!\fn{\i}{\xinit} \space \fn{\numexpr\i+1}{\xinit})
  (!\fn{\numexpr\i+1}{\xinit} \space \fn{\numexpr\i+1}{\xinit})
  \rput(!\fn{\i}{\xinit}\space 0){$\tm$}
  \rput(!\fn{\i}{\xinit}\space -0.3){$A_\i$}
 }
\end{pspicture}
Affichage:
Représentation graphique des premiers termes d'une suite récurrente


Programmation et dessins avancés - Graphe d'une fonction et planche de Galton


Graphe d'une fonction:
Code:
% Avec les packages dans le préambule:
%\usepackage{pst-all}
%\usepackage{pstricks-add}
%\usepackage{pst-func}
%\usepackage{ifthen}

\psset{unit=1cm,arrowsize=7pt}
\begin{pspicture}(0,0)(10,10)
 \multido{\i=1+1}{6}{
  \pscircle[fillstyle=gradient,GradientCircle=true,%
    gradbegin=white,gradend=black,%
    GradientPos={(1.9,\i)},gradmidpoint=1](2,\i){0.35}
  \rput(2,\i){\white\bf \i}
 }
 %
 \multido{\i=1+2}{4}{
    \pscircle[fillstyle=gradient,GradientCircle=true,%
    gradbegin=white,gradend=black,%
    GradientPos={(6.9,\i)},gradmidpoint=1](7,\i){0.35}
    \rput(7,\i){\white\bf \i}
  }
  % Puis le graphe de la fonction:
  \pscurve{->}(2.4,1)(5,2)(6.6,3)
  \pscurve{->}(2.4,2)(5,2)(6.6,1)
  \pscurve{->}(2.4,3)(5,2.5)(6.6,1.15)
  \pscurve{->}(2.4,4)(5,6)(6.6,7)
  \pscurve{->}(2.4,5)(5,3)(6.7,1.3)
  \pscurve{->}(2.4,5.8)(4,4)(6.6,3)
\end{pspicture}
Affichage:
Représentation graphique en LaTex du graphe d'une fonction discrète

Exemple de la planche de Galton:
Code:
% Avec les packages dans le préambule:
%\usepackage{pst-all}
%\usepackage{pstricks-add}
%\usepackage{pst-func}
%\usepackage{ifthen}

\psset{unit=1cm}
\begin{pspicture}(-8,0)(8,10)
\multido{\il=-4+1}{8}{
  \rput(\il,1){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\nwc\f[1]{#1 0.5 sub}
\multido{\il=-3+1}{7}{
  \rput(! \f{\il} \space 2){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\multido{\il=-3+1}{6}{
  \rput(! \il \space 3){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\multido{\il=-2+1}{5}{
  \rput(! \f{\il} \space 4){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\multido{\il=-2+1}{4}{
  \rput(! \il \space 5){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\multido{\il=-1+1}{3}{
  \rput(! \f{\il} \space 6){
    \psline[linewidth=1.4pt](0,0)(0.15,0.25)
    \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\multido{\il=-1+1}{2}{
\rput(! \il \space 7){
  \psline[linewidth=1.4pt](0,0)(0.15,0.25)
  \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}}
\rput(-0.5,8){
  \psline[linewidth=1.4pt](0,0)(0.15,0.25)
  \psellipse[fillstyle=solid,fillcolor=black](0.15,0.25)(0.12,0.08)
}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(-0.3,9.5)},gradmidpoint=1](-0.4,9.4){.25}
\psline[linewidth=1.2pt,arrowsize=6pt]{->}(-0.4,9.1)(-0.4,8.6)
\psline[linewidth=1.2pt,arrowsize=6pt]{->}(-0.7,8.1)(-1.1,7.5)
\psline[linewidth=1.2pt,arrowsize=6pt]{->}(-0.1,8.1)(0.3,7.5)
%
\pscircle[fillstyle=gradient,GradientCircle=true,%
gradbegin=white,gradend=black,%
GradientPos={(-1.3,4.8)},gradmidpoint=1](-1.4,4.7){.25}
\psline[linewidth=1.2pt,arrowsize=6pt]{->}(-1.7,4)(-2.1,3.4)
\psline[linewidth=1.2pt,arrowsize=6pt]{->}(-1.1,4)(-0.7,3.4)
%
% Et la planche de récup tout en bas:
\psline[linewidth=1.5pt](-5.,-0.5)(4.,-0.5)
\multido{\i=-5+1}{10}{
  \psline(! \i \space -0.5)(! \i \space 0.)
}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(-.15,-0.15)},gradmidpoint=1](-.25,-0.25){.25}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(-0.65,-0.15)},gradmidpoint=1](-0.75,-0.25){.25}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(-0.4,0.3)},gradmidpoint=1](-0.5,0.2){.25}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(-2.4,-0.15)},gradmidpoint=1](-2.5,-0.25){.25}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(1.6,-0.15)},gradmidpoint=1](1.5,-0.25){.25}
\pscircle[fillstyle=gradient,GradientCircle=true,%
   gradbegin=white,gradend=black,%
   GradientPos={(2.65,-0.15)},gradmidpoint=1](2.5,-0.25){.25}
\end{pspicture}
Affichage:
Dessin en LaTex: planche de Galton


Python / Latex - Génération de la table de valeurs de la loi normale


Un exemple de programme en Python qui permet de générer le code source Latex de la table de valeur de la fonction de répartition de la loi normale centrée réduite:
Code:
# Probabilites associees a la loi normale centree reduite:
# Pi(u)=P(X <= u)
from math import *

N=10000 # nbre de points dans l'integration

def f(x):
return 1/sqrt(2*pi)*exp(-x**2/2)

def gauss(u,decimales):
  if u==0:
     return 0.5
  if u>0:
    du=abs(u)/N
    S=0
    for k in range(N):
      # integration numerique: methode des trapezes
      S=S+du*(f(k*du)+f((k+1)*du))/2.0
  S=S+0.5
  S=float(int(S*10**decimales))/10**decimales # arrondi a 10e-4
  return S

# On genere le tableau en latex:
print '\\renewcommand{\\arraystretch}{1.3}'
print '\\begin{tabular}{|>{\columncolor{lightgray}}c|*{10}{c|}}\hline'
print '\\rowcolor{lightgray}'
print '$t$',
for i in range(10): print '& $0,0',i,'$',
print '\\\ \hline'

for i in range(30):
  print i/10.0,
  for j in range(10):
     print '&',gauss(i/10.0+j/100.0,4),
  print "\\\ \hline"

print '\end{tabular}'

print ''
# table pour les grandes valeurs de t
print '\\vspt\\noindent{\\bf Table pour les grandes valeurs de $t$}'
print ''

print '\\begin{tabular}{|c|*{10}{c|}}\hline'
print '$t$&$3.0$&$3.1$&$3.2$&$3.3$&$3.4$&$3.5$&$3.6$&$3.8$&$4.0$&$4.5$\\\ \hline'
print '$\Pi(t)$ & ', for i in range(7): print '$',gauss(3+i/10.0,5),'$ &',
print '$',gauss(3.8,5),'$ & $',gauss(4.0,5),'$ & $',gauss(4.5,5),'$ \\\ \hline'
print '\end{tabular}'
Affichage:
Après compilation avec Latex on obtient:
Extrait de la table de valeurs de la fonction de répartition de la loi normale centrée réduite générée en Python et interprété en LaTex


Divers - Autres …


  • A signaler de plus, la possibilité d'emporter (et d'apporter !) une distribution Latex complète sur une simple clé USB, cf. USBTeX.
  • Latex2html est un script en Perl permettant de générer du html à partir d'une source latex. Pour plus d'infos, voir le site officiel de latex2html.
    A noter aussi une solution magique pour résoudre le problème de génération des images de Latex2html sous Mandriva (et autres ?).


Doc téléchargeable


Ci-dessous une (très) ancienne version pdf téléchargeable de cette page:
Doc. Latex
Haut de la page


LongPage: h2: 1 - h3: 5