Vous êtes ici : Accueil > LaTeX > Générateur d’interrogations > Le générateur d’interrogations
Publié : 26 février 2007
Format PDF Enregistrer au format PDF

Le générateur d’interrogations

Faisant suite à mes premiers essais, où j’explique le principe et la méthode pour l’implémenter, je présente ici un exemple d’utilisation d’un programme de calcul formel (Giac) pour générer automatiquement des exercices de physique (ou de mathématique, ou de chimie) dans \LaTeX.

Un même exercice de physique est présenté trois fois. Dans les deux dernières versions, les calculs sont faits par Giac. Dans le dernier exerice, les valeurs de départ sont aléatoires.

Nous avons choisi un exercice de mouvement circulaire uniforme que nous utilisons dans une interrogation.

Le même exercice est présenté trois fois. Enoncé et solutionnaire sont présentés à chaque fois.

Le premier est fait "à la main" (enfin... à la calculatrice !).

Le deuxième est identique au premier mais les calculs sont fait lors de la compilation \LaTeX par Giac. Les valeurs de départ ayant été fournies au programme de calcul formel.

Le troisième suit le même schéma que les deux premiers mais les valeurs dans l’énoncé sont générées aléatoirement par Giac. Les calculs sont fait lors de la compilation \LaTeX par Giac.

Ceci constitue la "brique de base" pour un générateur d’interrogation !

Il devient facile de donner des exercices différents à tous les élèves pour un devoir ou une interrogation. Les élèves peuvent communiquer entre eux sur les méthodes mais pas sur les résultats. Ils font exactement ce que nous voulons : du travail intelligent !

% inspired by http://www.mathematex.net/phpBB2/2-vt1220-20.html
%cinquieme essai: calculs et resultats multiples s'enchainant
%Declaration de variables
%Calculs de certaines variables à partir de variables initiales
\documentclass[12pt]{article}
%
\usepackage{listings}
\usepackage{graphicx}
\usepackage{graphics}
\usepackage{moreverb}
\usepackage[francais]{babel}
\usepackage[latin1]{inputenc}
%\usepackage[dvips]{graphics}
%
\usepackage{answers}                        % pour utiliser le module answers
\Newassociation{sol}{Solution}{ans}        % pour définitir l'étiquette Solution du module answers
\newtheorem{ex}{Exercice}                % pour définitir l'étiquette Exercice du module answers
%
%\makeatletter
%commande pour faire appel a giac
\newcommand{\executGiac}[1]{
%\immediate\write18{@echo off}
\immediate\write18{giac  <#1 } }
%\makeatother

\title{Le générateur d'interrogations}
\author{Yves Delhaye}

\begin{document}

\maketitle

\begin{abstract}
Un exemple d'utilisation d'un programme de calcul formel (Giac) pour générer automatiquement des exercices de physique (ou de mathématique, ou de chimie) dans \LaTeX.

Un même exercice de physique est présenté trois fois. Dans les deux dernières versions, les calculs sont faits par Giac. Dans le dernier exerice, les valeurs de départ sont aléatoires.

\end{abstract}

\section{Introduction}
Nous avons choisi un exercice de mouvement circulaire uniforme que nous utilisons dans une interrogation.

Le même exercice est présenté trois fois.
Enoncé et solutionnaire sont présentés à chaque fois.

Le premier est fait "à la main" (enfin... à la calculatrice!).

Le deuxième est identique au premier mais les calculs sont fait lors de la compilation \LaTeX par Giac. Les valeurs de départ ayant été fournies au programme de calcul formel.

Le troisième suit le même schéma que les deux premiers mais les valeurs dans l'énoncé sont générées aléatoirement par Giac. Les calculs sont fait lors de la compilation \LaTeX par Giac.


Ceci constitue la "brique de base" pour un générateur d'interrogation!

Il devient facile de donner des exercices différents à tous les élèves pour un devoir ou une interrogation. Les élèves peuvent communiquer entre eux sur les méthodes mais pas sur les résultats. Ils font exactement ce que nous voulons: du travail intelligent!


\pagebreak         % sur une autre page

%\begin{center}Les trois calculs\end{center}
\section{Les trois calculs}

%        \Opensolutionfile{ans}[Solutions_MCU]                % ouvre le fichier Solutions_MCU.tex qui va contenir les solutions
% Il y a un probleme ici. Soit je définis les variables avant la ligne précédente et les solutions recoivent les valeurs d'initialisation (tout a 1!). Soit je ne le fais pas et je ne sais pas avoir les solution sur une feuille à part!
% Je vais probalement jouer avec "NotesDuProf".

\subsection{Sans Giac}
        \begin{ex}
                (.../5) Une roue de 60 cm de diamètre tourne régulièrement à raison de 120 tours/min.
                \begin{enumerate}
                \item Quelle est la vitesse angulaire \$\omega\$ de la roue?
                \item Calculer la vitesse d'un point situé à la circonférence de la roue.
                \item Calculer l'accélération d'un point situé à la circonférence de la roue. \\ \\
                \end{enumerate}
               
                \begin{sol}
                \underline{\textbf{Roue}}
                \begin{itemize}
                        \item \underline{Données}:
                        \begin{itemize}
                                \item R = 0,6/2 (m) = 0,3 (m)
                                \item 120 (Tours/min) = 2 (Tours/s)
                        \end{itemize}
                        \item \underline{Inconnues}:
                        \$ \omega,\ v,\  a\$
                        \item \underline{Formules}:
                        \begin{itemize}
                                \item \$ \omega = \frac{2\pi}{T} \$ (rad/s)
                                \item \$ v = \omega . R \$ (m/s)
                                \item \$ a = \omega^2 . R \$ (m/s)
                        \end{itemize}
                        \item \underline{Solution}:
                                \begin{enumerate}
                                \item
                                        \begin{itemize}
                                                \item \$T = \frac{1}{2 (Tours/s)} = 0,5 (s)\$
                                                \item \$ \omega = \frac{2\pi}{1/2 (s)} = 2 .2\pi (rad/s)= 4\pi (rad/s) \simeq 12.5 (rad/s)\$
                                        \end{itemize}
                                \item \$ v = \omega . R  = 12,5 (rad/s) . 0,3 (m) \simeq  3,8 (m/s) \$
                                \item \$ a = \omega_1^2 . R \simeq  157,9 (rad^2/s^2) . 0,3 (m) =  47,4 (m/s^2) \simeq 4,7.10^2 (m/s^2) \simeq 5 g\ ! \$       
                                \end{enumerate}
                \end{itemize}
                \end{sol}
        \end{ex}

\pagebreak         % sur une autre page

\subsection{Avec Giac}       
        \subsubsection{Avec Giac:les mêmes valeurs que l'exercice précédent (vérification)}       
        \begin{ex}
        % Valeurs intitialisées a 1 Pour éviter une erreur
        % lors de la première compilation.
        \def\diamcm1{1}  %
        \def\diam1{1}  %
        \def\rayon1{1}  %
        \def\tourmin1{1}  %
        \def\fq1{1}  %
        \def\per1{1}  %
        \def\vit1{1}  %
        \def\omeg1{1}  %
        \def\omegsq1{1}  %
        \def\acc1{1}  %
       
        % on ecrit les  commande giac  dans le fichier test5.in
\begin{verbatimwrite}{test5.in}
maple_mode(0);
Sortie:=fopen("test5.out.tex");
Digits:=4;
diamcm1:=60.0;
Resultat:=cat("\\def\\diamcm1\{",ans(),"} ");
diam1:=diamcm1/100.0;
Resultat:=cat(Resultat," ","\\def\\diam1\{",ans(),"} ");
rayon1:=diam1/2.0;
Resultat:=cat(Resultat," ","\\def\\rayon1\{",ans(),"} ");
tourmin1:=120.0;
Resultat:=cat(Resultat," ","\\def\\tourmin1\{",ans(),"} ");
fq1:=tourmin1/60.0;
Resultat:=cat(Resultat," ","\\def\\fq1\{",ans(),"} ");
per1:=1.0/fq1;
Resultat:=cat(Resultat," ","\\def\\per1\{",ans(),"} ");
omeg1:=2.0*pi*fq1;
Resultat:=cat(Resultat," ","\\def\\omeg1\{",ans(),"} ");
omegsq1:=omeg1^2;
Resultat:=cat(Resultat," ","\\def\\omegsq1\{",ans(),"} ");
vit1:=omeg1 * rayon1;
Resultat:=cat(Resultat," ","\\def\\vit1\{",ans(),"} ");
acc1:=omegsq1 * rayon1;
Resultat:=cat(Resultat," ","\\def\\acc1\{",ans(),"} ");

fprint(Sortie,Unquoted,Resultat);
fclose(Sortie);
\end{verbatimwrite}
       
        \executGiac{test5.in}
        % on va inclure  l'output cree par giac  dans le document
        \input{test5.out}       
       
                (.../5) Une roue de \diamcm1 cm de diamètre tourne régulièrement à raison de \tourmin1 tours/min.
                \begin{enumerate}
                \item Quelle est la vitesse angulaire \$\omega\$ de la roue?
                \item Calculer la vitesse d'un point situé à la circonférence de la roue.
                \item Calculer l'accélération d'un point situé à la circonférence de la roue. \\ \\
                \end{enumerate}
               
                \begin{sol}
                \underline{\textbf{Roue}}
                \begin{itemize}
                        \item \underline{Données}:
                        \begin{itemize}
                                \item R = (\diamcm1 /100)/ 2 = \diam1 /2 (m) = \rayon1 (m)
                                \item \tourmin1 (Tours/min) = \tourmin1/60 (Tours/s) = \fq1 (Tours/s) = \fq1 (Hz)
                        \end{itemize}
                        \item \underline{Inconnues}:
                        \$ \omega,\ v,\  a\$
                        \item \underline{Formules}:
                        \begin{itemize}
                                \item \$ \omega = \frac{2\pi}{T} \$ (rad/s)
                                \item \$ v = \omega . R \$ (m/s)
                                \item \$ a = \omega^2 . R \$ (m/s)
                        \end{itemize}
                        \item \underline{Solution}:
                                \begin{enumerate}
                                \item
                                        \begin{itemize}
                                                \item \$ T = \frac{1}{ \fq1 (Tours/s)} = \per1 (s)\$
                                                \item \$ \omega = \frac{2\pi}{ \per1 (s)} = \fq1 .2\pi (rad/s)= \omeg1 (rad/s) \$
                                        \end{itemize}
                                \item \$ v = \omega . R  = \omeg1 (rad/s) . \rayon1 (m) = \vit1 (m/s) \$
                                \item \$ a = \omega_1^2 . R = (\omeg1)^2 (rad^2/s^2) . \rayon1 (m) = \omegsq1 (rad^2/s^2) . \rayon1 (m) =  \acc1 (m/s^2)\$       
                                \end{enumerate}
                \end{itemize}
                \end{sol}
        \end{ex}

\pagebreak         % sur une autre page

        \subsubsection{Avec Giac:valeurs de départ aléatoires}       
        \begin{ex}
        % Valeurs intitialisées a 1 Pour éviter une erreur
        % lors de la première compilation.
        \def\diamcm1{1}  %
        \def\diam1{1}  %
        \def\rayon1{1}  %
        \def\tourmin1{1}  %
        \def\fq1{1}  %
        \def\per1{1}  %
        \def\vit1{1}  %
        \def\omeg1{1}  %
        \def\omegsq1{1}  %
        \def\acc1{1}  %
       
        % on ecrit les  commande giac  dans le fichier test5b.in
\begin{verbatimwrite}{test5b.in}
maple_mode(0);
Sortie:=fopen("test5b.out.tex");
Digits:=4;
srand;
diamcm1:=1+rand(100);
Resultat:=cat("\\def\\diamcm1\{",ans(),"} ");
diam1:=diamcm1/100.0;
Resultat:=cat(Resultat," ","\\def\\diam1\{",ans(),"} ");
rayon1:=diam1/2.0;
Resultat:=cat(Resultat," ","\\def\\rayon1\{",ans(),"} ");
tourmin1:=1+rand(200);
Resultat:=cat(Resultat," ","\\def\\tourmin1\{",ans(),"} ");
fq1:=tourmin1/60.0;
Resultat:=cat(Resultat," ","\\def\\fq1\{",ans(),"} ");
per1:=1.0/fq1;
Resultat:=cat(Resultat," ","\\def\\per1\{",ans(),"} ");
omeg1:=2.0*pi*fq1;
Resultat:=cat(Resultat," ","\\def\\omeg1\{",ans(),"} ");
omegsq1:=omeg1^2;
Resultat:=cat(Resultat," ","\\def\\omegsq1\{",ans(),"} ");
vit1:=omeg1 * rayon1;
Resultat:=cat(Resultat," ","\\def\\vit1\{",ans(),"} ");
acc1:=omegsq1 * rayon1;
Resultat:=cat(Resultat," ","\\def\\acc1\{",ans(),"} ");

fprint(Sortie,Unquoted,Resultat);
fclose(Sortie);
\end{verbatimwrite}
       
        \executGiac{test5b.in}
        % on va inclure  l'output cree par giac  dans le document
        \input{test5b.out}       
       
                (.../5) Une roue de \diamcm1 cm de diamètre tourne régulièrement à raison de \tourmin1 tours/min.
                \begin{enumerate}
                \item Quelle est la vitesse angulaire $\omega\$ de la roue?
                \item Calculer la vitesse d'un point situé à la circonférence de la roue.
                \item Calculer l'accélération d'un point situé à la circonférence de la roue. \\ \\
                \end{enumerate}
               
                \begin{sol}
                \underline{\textbf{Roue}}
                \begin{itemize}
                        \item \underline{Données}:
                        \begin{itemize}
                                \item R = (\diamcm1 /100)/ 2 = \diam1 /2 (m) = \rayon1 (m)
                                \item \tourmin1 (Tours/min) = \tourmin1/60 (Tours/s) = \fq1 (Tours/s) = \fq1 (Hz)
                        \end{itemize}
                        \item \underline{Inconnues}:
                        \$ \omega,\ v,\  a\$
                        \item \underline{Formules}:
                        \begin{itemize}
                                \item \$ \omega = \frac{2\pi}{T} \$ (rad/s)
                                \item \$ v = \omega . R \$ (m/s)
                                \item \$ a = \omega^2 . R \$ (m/s)
                        \end{itemize}
                        \item \underline{Solution}:
                                \begin{enumerate}
                                \item
                                        \begin{itemize}
                                                \item \$ T = \frac{1}{ \fq1 (Tours/s)} = \per1 (s)\$
                                                \item \$ \omega = \frac{2\pi}{ \per1 (s)} = \fq1 .2\pi (rad/s)= \omeg1 (rad/s)\$
                                        \end{itemize}
                                \item \$ v = \omega . R  = \omeg1 (rad/s) . \rayon1 (m) = \vit1 (m/s) \$
                                \item \$ a = \omega_1^2 . R = (\omeg1)^2 (rad^2/s^2) . \rayon1 (m) = \omegsq1 (rad^2/s^2) . \rayon1 (m) =  \acc1 (m/s^2) \$       
                                \end{enumerate}
                \end{itemize}
                \end{sol}
        \end{ex}

% \Closesolutionfile{ans}                % ferme le fichier Solutions.tex qui contient les solutions
% \pagebreak                         % met les solutions sur une autre page
% \section{Solutions}
% \Readsolutionfile{ans}                % importe les données du fichier Solutions.tex

\end{document}

Documents joints

Post-scriptum

Suite à mon installation d’un moteur mathml sur le site, les formules LaTeX sont parfois traduites depuis le code. J’ai du mettre des "backslash" pour empêcher l’interprétation des dollards : \$

Parfois ces "backslash" apparaissent, parfois pas. Il est péférable de recopier les fichiers de code source que de faire des copier coller dans les pages.

Vous voilà prévenu !