Cette page d'algorithmes est dédiée aux fonctions statistiques (Unité Math_Stat que j'ai créé spécialement) et opérations sur listes statistiques pour PurePascal/Turbo Pascal. Certaines de ces fonctions sont extraites de l'Unité "Math" de free pascal mais ont été renommées ou adaptées pour une utilisation optimale.
Vous trouverez des opérations sur des statistiques à 1 ou 2 variables aléatoires, les calculs de combinatoire, d'Arrangement, les factorielles, les triangles de Pascal...
Les fonctions décrites ci-après seront écrites avec le type standard Tableau, et le type Tableau dynamique.
On définit la constante Maxdim:
la taille maximale des tableaux de dimension 1, de réels. Cette valeur est à adapter dans votre programme suivant les capacités de votre ordinateur et de votre compilateur.const MaxDim=65536;
Voici la liste de ces algorithmes Mathématiques supplémentaires sur variables simples :
- Fonctions et procédures d'extraction sur liste
- Maximum d'une liste
- Minimum d'une liste
- Minimum et maximum d'une liste
- Ensurerange (inutile)
- Fonctions statistiques à 1 Variable aléatoire
I. Fonctions d'extraction de valeurs
Ces fonctions simples permettent d'extraire une valeur dans une liste.I.1 Fonction Max
Cette fonction permet d'extraire la valeur maximale d'une liste.
function Max(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1];
for i:=2 to idMax do
if Tab[i]>vartmp then
vartmp:=Tab[i];
Max:=vartmp;
end;
Dans cette fonction, on met en paramètre le tableau en "var" afin de ne pas recopier intégralement le tableau dans la fonction et faire de l'économie de RAM.
Ecrivons la même fonction mais en utilisant le type DArray :
function Max_Darray(Tab : Darray) : real;
var
i : longint;
vartmp : real;
begin
vartmp:=Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
if Tab^.TCoef[i]^>vartmp then
vartmp:=Tab^.Tcoef[i]^;
Max_Darray:=vartmp;
end;
Pour rappel, Darray est un type pointé de tableau dynamique, basé sur une structure, contenant le nombre d'indexes et un pointeur sur un tableau dynamique.. Ce type structuré a le gros avantage d'économiser de la RAM mais l'inconvénient de devoir refaire le tableau en RAM à chaque fois qu'on ajoute ou supprime un élément du tableau.
I.2 Fonction Min
Cette fonction permet d'extraire la valeur minimale d'une liste.
function Min(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1];
for i:=2 to idMax do
if Tab[i]<vartmp then
vartmp:=Tab[i];
Min:=vartmp;
end;
Ecrivons la même fonction mais en utilisant le type DArray :
function Min_Darray(Tab : Darray) : real;
var
i : longint;
vartmp : real;
begin
vartmp:=Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId - 1 do
if Tab^.TCoef[i]^ < vartmp then
vartmp:=Tab^.Tcoef[i]^;
Min_Darray:=vartmp;
end;
I.3 Procédure MinMax
Cette procédure permet d'extraire à la fois la valeur minimale et la valeur maximale d'une liste. Il est préférable de n'utiliser que cette procédure dans vos programmes puisque vous avez les 2 résultats (minimum et maximum) en une seule procédure.
Procedure MinMax (var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim; var min,max : real) ;
var
i : 1..MaxDim;
begin
min:=Tab[1];
max:=min;
for i:=2 to idMax do
begin
if Tab[i] < min then
min:=Tab[i];
if Tab[i] > max then
max:=Tab[i];
end;
end;
Ecrivons la même procédure mais en utilisant le type DArray :
procedure MinMax_Darray(Tab : Darray; var min,max:real) : real;
var
i : longint;
begin
max:=Tab^.Tcoef[0]^;
min:=max;
for i:=1 to Tab^.NbId - 1 do
begin
if Tab^.TCoef[i]^ < min then
min:=Tab^.Tcoef[i]^;
if Tab^.TCoef[i]^ > max then
max:=Tab^.Tcoef[i]^;
end;
end;
II. Fonctions statistiques à 1 Variable Aléatoire
Vous trouverez ici les fonctions de statistiques à une variable aléatoire.
II.1 Fonction Sum
Cette fonction se contente de calculer la somme des n éléments (variables aléatoires) d'une liste.
function Sum(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1];
for i:=2 to idMax do
vartmp:=vartmp+Tab[i];
Sum:=vartmp;
end;
Ecrivons la même fonction avec un tableau Darray:
function sum_Darray(Tab : Darray) : real;
var
i : longint;
vartmp:real;
begin
vartmp:=Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
vartmp:=vartmp+Tab^.Tcoef[i]^;
sum_Darray:=vartmp;
end;
II.2 Fonction Sumofsquare
Cette fonction calcule la somme des carrés des éléments d'une liste : elle servira, notamment, à simplifier le calcul de la variance!
function Sumofsquare(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1]*Tab[1];
for i:=2 to idMax do
vartmp:=vartmp+Tab[i]*Tab[i];
Sumofsquare:=vartmp;
end;
Ecrivons la même fonction avec un tableau Darray:
function sumofsquare_Darray(Tab : Darray) : real;
var
i : longint;
vartmp:real;
begin
vartmp:=Tab^.Tcoef[0]^*Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
vartmp:=vartmp+Tab^.Tcoef[i]^*Tab^.Tcoef[i]^;
sumofsquare_Darray:=vartmp;
end;
II.3 Fonction Average
Cette fonction calcule la moyenne d'une liste. Attention: cette fonction utilise la fonction "sum" de cette même page! En informatique, il est nécessaire de factoriser autant que nécessaire les fonctions et de ne pas réécrire des morceaux de code existant par ailleurs.
function Average(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
begin
average:=sum(Tab,idMax)/idMax;
end;
La même fonction avec un tableau Darray:
function average_Darray(Tab : Darray) : real;
begin;
average_Darray:=sum_Darray(Tab)/Tab^.NbId;
end;
Cette fonction n'est pas forcément utile si la fonction "sum" existe déjà! Elle est même inutile. Dans vos algorithmes, vous pouvez simplement créer une variable "Moyenne" qui sera le résultat de ce calcul. En revanche, si vous optez pour la programmation de type "fonctionnelle, vous devez utiliser cette fonction.
II.4 Fonction Variance
Cette fonction calcule la moyenne du caractère statistique (X - Moyenne(X))2.d'une liste. Attention: cette fonction utilise les paramètres somme et somme_carres qui doivent être préalablement calculés.
La Variance donne une moyenne des écarts d'avec la moyenne. Ca peut être la taille d'une population donnée, ou bien la distance relative entre 2 astres tournant l'un autour de l'autre.
On démontre que la fonction f(Y) = ∑ mi.(xi-Y)2) est minimale si Y=∑ (mi.xi)/∑(mi) c'est à dire si Y=Moyenne(X).
function Max(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real; var i : 1..MaxDim; vartmp : real; begin vartmp:=Tab[1]; for i:=2 to idMax do if Tab[i]>vartmp then vartmp:=Tab[i]; Max:=vartmp; end;
function Max_Darray(Tab : Darray) : real; var i : longint; vartmp : real; begin vartmp:=Tab^.Tcoef[0]^; for i:=1 to Tab^.NbId-1 do if Tab^.TCoef[i]^>vartmp then vartmp:=Tab^.Tcoef[i]^; Max_Darray:=vartmp; end;
Ecrivons la même fonction mais en utilisant le type DArray :function Min(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real; var i : 1..MaxDim; vartmp : real; begin vartmp:=Tab[1]; for i:=2 to idMax do if Tab[i]<vartmp then vartmp:=Tab[i]; Min:=vartmp; end;
function Min_Darray(Tab : Darray) : real; var i : longint; vartmp : real; begin vartmp:=Tab^.Tcoef[0]^; for i:=1 to Tab^.NbId - 1 do if Tab^.TCoef[i]^ < vartmp then vartmp:=Tab^.Tcoef[i]^; Min_Darray:=vartmp; end;
I.3 Procédure MinMax
Cette procédure permet d'extraire à la fois la valeur minimale et la valeur maximale d'une liste. Il est préférable de n'utiliser que cette procédure dans vos programmes puisque vous avez les 2 résultats (minimum et maximum) en une seule procédure.
Procedure MinMax (var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim; var min,max : real) ;
var
i : 1..MaxDim;
begin
min:=Tab[1];
max:=min;
for i:=2 to idMax do
begin
if Tab[i] < min then
min:=Tab[i];
if Tab[i] > max then
max:=Tab[i];
end;
end;
Ecrivons la même procédure mais en utilisant le type DArray :
procedure MinMax_Darray(Tab : Darray; var min,max:real) : real;
var
i : longint;
begin
max:=Tab^.Tcoef[0]^;
min:=max;
for i:=1 to Tab^.NbId - 1 do
begin
if Tab^.TCoef[i]^ < min then
min:=Tab^.Tcoef[i]^;
if Tab^.TCoef[i]^ > max then
max:=Tab^.Tcoef[i]^;
end;
end;
II. Fonctions statistiques à 1 Variable Aléatoire
Vous trouverez ici les fonctions de statistiques à une variable aléatoire.
II.1 Fonction Sum
Cette fonction se contente de calculer la somme des n éléments (variables aléatoires) d'une liste.
function Sum(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1];
for i:=2 to idMax do
vartmp:=vartmp+Tab[i];
Sum:=vartmp;
end;
Ecrivons la même fonction avec un tableau Darray:
function sum_Darray(Tab : Darray) : real;
var
i : longint;
vartmp:real;
begin
vartmp:=Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
vartmp:=vartmp+Tab^.Tcoef[i]^;
sum_Darray:=vartmp;
end;
II.2 Fonction Sumofsquare
Cette fonction calcule la somme des carrés des éléments d'une liste : elle servira, notamment, à simplifier le calcul de la variance!
function Sumofsquare(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1]*Tab[1];
for i:=2 to idMax do
vartmp:=vartmp+Tab[i]*Tab[i];
Sumofsquare:=vartmp;
end;
Ecrivons la même fonction avec un tableau Darray:
function sumofsquare_Darray(Tab : Darray) : real;
var
i : longint;
vartmp:real;
begin
vartmp:=Tab^.Tcoef[0]^*Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
vartmp:=vartmp+Tab^.Tcoef[i]^*Tab^.Tcoef[i]^;
sumofsquare_Darray:=vartmp;
end;
II.3 Fonction Average
Cette fonction calcule la moyenne d'une liste. Attention: cette fonction utilise la fonction "sum" de cette même page! En informatique, il est nécessaire de factoriser autant que nécessaire les fonctions et de ne pas réécrire des morceaux de code existant par ailleurs.
function Average(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
begin
average:=sum(Tab,idMax)/idMax;
end;
La même fonction avec un tableau Darray:
function average_Darray(Tab : Darray) : real;
begin;
average_Darray:=sum_Darray(Tab)/Tab^.NbId;
end;
Cette fonction n'est pas forcément utile si la fonction "sum" existe déjà! Elle est même inutile. Dans vos algorithmes, vous pouvez simplement créer une variable "Moyenne" qui sera le résultat de ce calcul. En revanche, si vous optez pour la programmation de type "fonctionnelle, vous devez utiliser cette fonction.
II.4 Fonction Variance
Cette fonction calcule la moyenne du caractère statistique (X - Moyenne(X))2.d'une liste. Attention: cette fonction utilise les paramètres somme et somme_carres qui doivent être préalablement calculés.
La Variance donne une moyenne des écarts d'avec la moyenne. Ca peut être la taille d'une population donnée, ou bien la distance relative entre 2 astres tournant l'un autour de l'autre.
On démontre que la fonction f(Y) = ∑ mi.(xi-Y)2) est minimale si Y=∑ (mi.xi)/∑(mi) c'est à dire si Y=Moyenne(X).
Procedure MinMax (var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim; var min,max : real) ; var i : 1..MaxDim; begin min:=Tab[1]; max:=min; for i:=2 to idMax do begin if Tab[i] < min then min:=Tab[i]; if Tab[i] > max then max:=Tab[i]; end; end;
procedure MinMax_Darray(Tab : Darray; var min,max:real) : real; var i : longint; begin max:=Tab^.Tcoef[0]^; min:=max; for i:=1 to Tab^.NbId - 1 do begin if Tab^.TCoef[i]^ < min then min:=Tab^.Tcoef[i]^; if Tab^.TCoef[i]^ > max then max:=Tab^.Tcoef[i]^; end; end;
Ecrivons la même fonction avec un tableau Darray:function Sum(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real; var i : 1..MaxDim; vartmp : real; begin vartmp:=Tab[1]; for i:=2 to idMax do vartmp:=vartmp+Tab[i]; Sum:=vartmp; end;
function sum_Darray(Tab : Darray) : real; var i : longint; vartmp:real; begin vartmp:=Tab^.Tcoef[0]^; for i:=1 to Tab^.NbId-1 do vartmp:=vartmp+Tab^.Tcoef[i]^; sum_Darray:=vartmp; end;
II.2 Fonction Sumofsquare
Cette fonction calcule la somme des carrés des éléments d'une liste : elle servira, notamment, à simplifier le calcul de la variance!
function Sumofsquare(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
var
i : 1..MaxDim;
vartmp : real;
begin
vartmp:=Tab[1]*Tab[1];
for i:=2 to idMax do
vartmp:=vartmp+Tab[i]*Tab[i];
Sumofsquare:=vartmp;
end;
Ecrivons la même fonction avec un tableau Darray:
function sumofsquare_Darray(Tab : Darray) : real;
var
i : longint;
vartmp:real;
begin
vartmp:=Tab^.Tcoef[0]^*Tab^.Tcoef[0]^;
for i:=1 to Tab^.NbId-1 do
vartmp:=vartmp+Tab^.Tcoef[i]^*Tab^.Tcoef[i]^;
sumofsquare_Darray:=vartmp;
end;
II.3 Fonction Average
Cette fonction calcule la moyenne d'une liste. Attention: cette fonction utilise la fonction "sum" de cette même page! En informatique, il est nécessaire de factoriser autant que nécessaire les fonctions et de ne pas réécrire des morceaux de code existant par ailleurs.
function Average(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real;
begin
average:=sum(Tab,idMax)/idMax;
end;
La même fonction avec un tableau Darray:
function average_Darray(Tab : Darray) : real;
begin;
average_Darray:=sum_Darray(Tab)/Tab^.NbId;
end;
Cette fonction n'est pas forcément utile si la fonction "sum" existe déjà! Elle est même inutile. Dans vos algorithmes, vous pouvez simplement créer une variable "Moyenne" qui sera le résultat de ce calcul. En revanche, si vous optez pour la programmation de type "fonctionnelle, vous devez utiliser cette fonction.
II.4 Fonction Variance
Cette fonction calcule la moyenne du caractère statistique (X - Moyenne(X))2.d'une liste. Attention: cette fonction utilise les paramètres somme et somme_carres qui doivent être préalablement calculés.
La Variance donne une moyenne des écarts d'avec la moyenne. Ca peut être la taille d'une population donnée, ou bien la distance relative entre 2 astres tournant l'un autour de l'autre.
On démontre que la fonction f(Y) = ∑ mi.(xi-Y)2) est minimale si Y=∑ (mi.xi)/∑(mi) c'est à dire si Y=Moyenne(X).
function Sumofsquare(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real; var i : 1..MaxDim; vartmp : real; begin vartmp:=Tab[1]*Tab[1]; for i:=2 to idMax do vartmp:=vartmp+Tab[i]*Tab[i]; Sumofsquare:=vartmp; end;
function sumofsquare_Darray(Tab : Darray) : real; var i : longint; vartmp:real; begin vartmp:=Tab^.Tcoef[0]^*Tab^.Tcoef[0]^; for i:=1 to Tab^.NbId-1 do vartmp:=vartmp+Tab^.Tcoef[i]^*Tab^.Tcoef[i]^; sumofsquare_Darray:=vartmp; end;
La même fonction avec un tableau Darray:function Average(var Tab : array [1..MaxDim] of real; idMax : 1..Maxdim) : real; begin average:=sum(Tab,idMax)/idMax; end;
Cette fonction n'est pas forcément utile si la fonction "sum" existe déjà! Elle est même inutile. Dans vos algorithmes, vous pouvez simplement créer une variable "Moyenne" qui sera le résultat de ce calcul. En revanche, si vous optez pour la programmation de type "fonctionnelle, vous devez utiliser cette fonction.function average_Darray(Tab : Darray) : real; begin; average_Darray:=sum_Darray(Tab)/Tab^.NbId; end;
II.4 Fonction Variance
Cette fonction calcule la moyenne du caractère statistique (X - Moyenne(X))2.d'une liste. Attention: cette fonction utilise les paramètres somme et somme_carres qui doivent être préalablement calculés.
La Variance donne une moyenne des écarts d'avec la moyenne. Ca peut être la taille d'une population donnée, ou bien la distance relative entre 2 astres tournant l'un autour de l'autre.
On démontre que la fonction f(Y) = ∑ mi.(xi-Y)2) est minimale si Y=∑ (mi.xi)/∑(mi) c'est à dire si Y=Moyenne(X).
La variance est donc : Var(Xi)=∑(Xi-Moy(X))2/∑mi. Cependant on peut simplifier ce calcul informatiquement en utilisant la formule suivante :
Var(Xi) = Moy(X2) - Moy2(X).
Démonstration :
Var = ∑(mi.Xi-E(X))2) / ∑(mi)
= ∑(mi.(Xi2+ E(X)2-2.Xi.E(X))) / ∑(mi)
= ∑(mi.Xi2) / ∑(mi) + E(X)2.(∑(mi) / ∑(mi)) - 2.E(X).(∑(mi.Xi) / ∑(mi))
or ∑(mi.Xi) / ∑(mi) = E(X) il vient :
Var = E(X2) + E2(X) - 2.E(X).E(X)
= E(X2) + E2(X) - 2.E2(X)
= E(X2) - E2(X)
La fonction Pascal résultante simplifiée sera donc :
Avec somme étant la somme des éléments de la liste, et somme_carre la somme des carrés des éléments de la liste.function Variance(somme,somme_carres,nb_elements : real) : real; begin Variance:=(somme_carres - somme*somme/nb_elements)/nb_elements; end;
Ici on n'utilise pas de variable tableau. Il n'y a donc pas de version Darray de cette foncton.