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}








- 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:
-
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:
-
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:
-
Python /
- 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

- 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
on obtient:
Divers - Autres …
- A signaler de plus, la possibilité d'emporter (et d'apporter !) une distribution
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: