Histogramme

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Histogramme

Message par albenic » dim. mars 27, 2011 5:24 pm

Bonsoir,

Le programme ci-dessous calcule pour n noyaux radioactif les fréquences des noyaux qui se sont désintégrés pendant les 15 premières années.

Code : Tout sélectionner

viedesnoyaux(n):={
local k,vie,etat,annee,temps,classe;
annee:=[0$15];
pour k de 1 jusque n faire
etat:=1;
temps:=0;
tantque temps<=14 et etat<>0 faire
vie:=alea(10);
etat:=etat*vie;
temps:=temps+1;
ftantque;
si etat==0 alors annee[temps-1]:=annee[temps-1]+1;
fsi;
fpour;
annee:=approx(annee/n);
diagramme_batons(annee,annee);
}
:;
Dans la liste annee, annee[k] donne la fréquence des noyaux désintégrés au cours de l'année [k;k+1[.
Pour la représentation graphique j'utilise la commande

Code : Tout sélectionner

diagramme_batons
mais c'est à défaut de pouvoir utiliser la commande

Code : Tout sélectionner

histogram
. Tous mes essais ont échoués.
Si j'ai bien compris ma liste est une matrice(1,n) (1 ligne et n colonnes) et histogram utilise des matrices de type (n,2).
Il doit bien exister un moyen simple de tracer cet histogramme sans utiliser la transposition pour rester compréhensible pour mes élèves.
Par avance merci de votre aide.

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Histogramme

Message par parisse » dim. mars 27, 2011 6:30 pm

Il suffit de mettre 3 arguments, la liste annee, la valeur de début de la 1ère classe et la taille des classes, par exemple
histogram(annee,0,0.02)

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Histogramme

Message par albenic » dim. mars 27, 2011 7:37 pm

parisse a écrit :Il suffit de mettre 3 arguments, la liste annee, la valeur de début de la 1ère classe et la taille des classes, par exemple
histogram(annee,0,0.02)
J'avais essayé cette solution mais elle ne convient pas car en fait il compte les valeurs dans la liste annee par classe d'amplitude 0.02. Or dans mon programme, "tout est déjà prêt".

En effet annee[0] contient la fréquence des noyaux qui se sont désintégrés pendant l'année 0, annee[1] celle de ceux qui se sont désintégrés pendant l'année 1,...

Je viens de trouver une solution assez simple à justifier aux élèves :

Code : Tout sélectionner

viedesnoyaux(n):={
local k,vie,etat,annee,temps,classe;
annee:=[0$15];
pour k de 1 jusque n faire
etat:=1;
temps:=0;
tantque temps<=14 et etat<>0 faire
vie:=alea(10);
etat:=etat*vie;
temps:=temps+1;
ftantque;
si etat==0 alors annee[temps-1]:=annee[temps-1]+1;
fsi;
fpour;
annee:=approx(annee/n);
pour k de 0 jusque 14 faire 
histo[k]:=[k..k+1,annee[k]];
fpour
histogram(histo);
}
:;
Si cela peut servir à d'autres...

alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Re: Histogramme

Message par alb » dim. mars 27, 2011 8:21 pm

Il doit manquer l'initialisation de histo :wink:

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Histogramme

Message par albenic » dim. mars 27, 2011 9:05 pm

alb a écrit :Il doit manquer l'initialisation de histo :wink:
Bonsoir,

Je ne sais pas si cela a un lien avec ce dont je viens de me rendre compte mais la fonction histogram "re"calcule les hauteurs des rectangles.

Je m'explique : à partir des différentes fréquences que j'ai obtenu dans ma liste annee, il fait la somme des fréquences et recalcule les hauteurs des rectangles (avec de la proportionnalité). Sauf que personnellement, ce n'est pas ce que je veux. En effet, la somme de mes fréquences n'est pas égale à 1 et pour cause, je n'ai pas comptabilisé tous les noyaux encore radioactif après 15 ans.
La suite du travail est de faire le lien avec la densité de la loi exponentielle et l'intégration. Et là j'obtiens un histogramme qui ne colle pas du tout à la densité (l'histogramme est "proportionnellement" trop haut).

Seule parade pour l'instant, ajouter une dernière valeur à ma liste annee avec tous les noyaux encore radioactifs mais ce n'est pas cohérent avec le reste de l'histogramme (cela permet juste de faire coller l'histogramme et la densité de proba).

Je ne sais pas si j'ai été très clair ? Est-ce en lien avec votre remarque ? Si oui comment corriger cela ?

parisse
Messages : 5731
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Histogramme

Message par parisse » lun. mars 28, 2011 6:03 am

histogram recalcule en effet la hauteur des rectangles pour avoir une aire totale =1 (vous pouvez rajouter une dernière classe avec par exemple n+1..1000 comme abscisse). Pour votre étude, il vaudrait peut-etre mieux utiliser diagramme_baton ou plotlist.

albenic
Messages : 40
Inscription : mer. oct. 08, 2008 7:19 pm

Re: Histogramme

Message par albenic » mar. mars 29, 2011 8:11 am

Bonjour,

Bon en biaisant, j'obtiens un truc qui tourne bien. J'ai biaisé en suivant l'idée proposée et en définissant la dernière classe sur l'intervalle [15,100] et en lui affectant la fréquence des noyaux encore radioactifs.

Voici le programme final pour ceux que cela peut intéresser :

Code : Tout sélectionner

viedesnoyaux(n):={
local k,vie,etat,annee,temps,histo;
annee:=[0$16];
pour k de 1 jusque n faire
etat:=1;
temps:=0;
tantque temps<=14 et etat<>0 faire
vie:=alea(10);
etat:=etat*vie;
temps:=temps+1;
ftantque;
si etat==0 alors annee[temps-1]:=annee[temps-1]+1 sinon annee[15]:=annee[15]+1
fsi;
fpour;
annee:=approx(annee/n);
//diagramme_batons(annee,annee);
histo:=[];
pour k de 0 jusque 14 faire 
histo[k]:=[k..k+1,annee[k]];
fpour
histo[15]:=[15..100,annee[15]];
plot(0.1*exp(-0.1*x),x=0..15),histogram(histo);
}
:;

alb
Messages : 1320
Inscription : ven. août 28, 2009 3:34 pm

Re: Histogramme

Message par alb » mar. mars 29, 2011 9:33 am

albenic a écrit :Bon en biaisant, j'obtiens un truc qui tourne bien.
C'est le genre de phrases qui crée un petit moment de détente dans une classe :)

Je range ce programme pour une utilisation future.
C'est pour quelle classe ?
Deux petites remarques:
1/ indenter pour améliorer la lisibilité.
2/ il est didactiquement intéressant de mettre côte à côte la fenêtre contenant le code source
et celle de mise au point obtenue par exemple avec:
debug(viedesnoyaux(5))
pour suivre en direct les affectations.
J'imagine même qu'il est possible de créer artificiellement des erreurs dans le code
pour les faire chercher par les élèves avec debug.

Répondre