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:
où
est une fonction quelconque (continue par exemple...).
Pour placer sur l'axe des abscisses les valeurs successives de la suite,
,
,
,
...
on trace la courbe représentative de la fonction
et la droite d'équation
,
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:
-
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
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
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:
- 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:
- 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:
- 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:
- 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:
A noter aussi une solution magique pour résoudre le problème de génération des images de Latex2html sous Mandriva (et autres ?).