Page 1 sur 1

Histogramme

Publié : dim. mars 27, 2011 5:24 pm
par albenic
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.

Re: Histogramme

Publié : dim. mars 27, 2011 6:30 pm
par parisse
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)

Re: Histogramme

Publié : dim. mars 27, 2011 7:37 pm
par albenic
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...

Re: Histogramme

Publié : dim. mars 27, 2011 8:21 pm
par alb
Il doit manquer l'initialisation de histo :wink:

Re: Histogramme

Publié : dim. mars 27, 2011 9:05 pm
par albenic
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 ?

Re: Histogramme

Publié : lun. mars 28, 2011 6:03 am
par parisse
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.

Re: Histogramme

Publié : mar. mars 29, 2011 8:11 am
par albenic
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);
}
:;

Re: Histogramme

Publié : mar. mars 29, 2011 9:33 am
par alb
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.